diff --git a/mtr-ipv6-on-ipv4-only.patch b/mtr-ipv6-on-ipv4-only.patch new file mode 100644 index 0000000..92b1b66 --- /dev/null +++ b/mtr-ipv6-on-ipv4-only.patch @@ -0,0 +1,118 @@ +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 + diff --git a/mtr.spec b/mtr.spec index 27ac7f3..79f8de7 100644 --- a/mtr.spec +++ b/mtr.spec @@ -14,6 +14,7 @@ Source3: net-x%{name}.desktop Patch1: mtr-crash-in-xml-mode.patch Patch2: mtr-xml-format-fixes.patch Patch3: mtr-default-hostname.patch +Patch4: mtr-ipv6-on-ipv4-only.patch BuildRequires: ncurses-devel gtk2-devel desktop-file-utils BuildRequires: autoconf automake libtool @@ -40,6 +41,7 @@ diagnostic tool. %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 %build %configure --enable-gtk2