From 12c53f98e44598b87d3f2308e0d892f49d7af8e4 Mon Sep 17 00:00:00 2001 From: Roger Wolff Date: Tue, 16 Jul 2013 13:59:52 +0200 Subject: [PATCH] Fix bombout with ipv6 enabled binary on ipv4 only system. --- dns.c | 33 +++++++++++++++++++++------------ gtk.c | 6 ++++-- select.c | 8 ++++++-- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/dns.c b/dns.c index 371934f..221665d 100644 --- a/dns.c +++ b/dns.c @@ -529,10 +529,12 @@ void dns_open(void) #ifdef ENABLE_IPV6 resfd6 = socket(AF_INET6, SOCK_DGRAM, 0); if (resfd6 == -1) { + // consider making removing this warning. For now leave it in to see + // new code activated. -- REW fprintf(stderr, "Unable to allocate IPv6 socket for nameserver communication: %s\n", strerror(errno)); - exit(-1); + // exit(-1); } #endif option = 1; @@ -543,11 +545,13 @@ void dns_open(void) exit(-1); } #ifdef ENABLE_IPV6 - if (setsockopt(resfd6,SOL_SOCKET,SO_BROADCAST,(char *)&option,sizeof(option))) { - fprintf(stderr, - "Unable to setsockopt() on IPv6 nameserver communication socket: %s\n", - strerror(errno)); - exit(-1); + if (resfd6 > 0) { + if (setsockopt(resfd6,SOL_SOCKET,SO_BROADCAST,(char *)&option,sizeof(option))) { + fprintf(stderr, + "Unable to setsockopt() on IPv6 nameserver communication socket: %s\n", + strerror(errno)); + exit(-1); + } } #endif longipstr( "127.0.0.1", &localhost, AF_INET ); @@ -933,12 +937,14 @@ void dorequest(char *s,int type,word id) hp = (packetheader *)buf; hp->id = id; /* htons() deliberately left out (redundant) */ #ifdef ENABLE_IPV6 - for (i = 0;i < NSCOUNT6;i++) { - if (!NSSOCKADDR6(i)) - continue; - if (NSSOCKADDR6(i)->sin6_family == AF_INET6) - (void)sendto(resfd6,buf,r,0,(struct sockaddr *) NSSOCKADDR6(i), - sizeof(struct sockaddr_in6)); + if (resfd6 > 0) { + for (i = 0;i < NSCOUNT6;i++) { + if (!NSSOCKADDR6(i)) + continue; + if (NSSOCKADDR6(i)->sin6_family == AF_INET6) + (void)sendto(resfd6,buf,r,0,(struct sockaddr *) NSSOCKADDR6(i), + sizeof(struct sockaddr_in6)); + } } #endif for (i = 0;i < myres.nscount;i++) @@ -1327,6 +1333,9 @@ void dns_ack6(void) int r,i; static char addrstr[INET6_ADDRSTRLEN]; + // Probably not necessary. -- REW + if (resfd6 < 0) return; + r = recvfrom(resfd6,(byte *)resrecvbuf,MaxPacketsize,0, from, &fromlen); if (r > 0) { diff --git a/gtk.c b/gtk.c index d00f769..38ed507 100644 --- a/gtk.c +++ b/gtk.c @@ -615,8 +615,10 @@ void gtk_loop(void) net_iochannel = g_io_channel_unix_new(net_waitfd()); g_io_add_watch(net_iochannel, G_IO_IN, gtk_net_data, NULL); #ifdef ENABLE_IPV6 - dns_iochannel = g_io_channel_unix_new(dns_waitfd6()); - g_io_add_watch(dns_iochannel, G_IO_IN, gtk_dns_data6, NULL); + if (dns_waitfd6() > 0) { + dns_iochannel = g_io_channel_unix_new(dns_waitfd6()); + g_io_add_watch(dns_iochannel, G_IO_IN, gtk_dns_data6, NULL); + } #endif dns_iochannel = g_io_channel_unix_new(dns_waitfd()); g_io_add_watch(dns_iochannel, G_IO_IN, gtk_dns_data, NULL); diff --git a/select.c b/select.c index 0545d9f..e7c397e 100644 --- a/select.c +++ b/select.c @@ -80,8 +80,12 @@ void select_loop(void) { #ifdef ENABLE_IPV6 if (dns) { dnsfd6 = dns_waitfd6(); - FD_SET(dnsfd6, &readfd); - if(dnsfd6 >= maxfd) maxfd = dnsfd6 + 1; + if (dnsfd6 >= 0) { + FD_SET(dnsfd6, &readfd); + if(dnsfd6 >= maxfd) maxfd = dnsfd6 + 1; + } else { + dnsfd6 = 0; + } } else dnsfd6 = 0; #endif -- 1.8.3.1