Blame SOURCES/mtr-ipv6-on-ipv4-only.patch

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