aboutsummaryrefslogtreecommitdiffstats
path: root/package/dnsmasq/patches/103-ipv6_fix.patch
blob: 33624521d35069c604cfe1df110cb7a53747398f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -129,6 +129,7 @@ int iface_enumerate(void *parm, int (*ip
   ssize_t len;
   static unsigned int seq = 0;
   int family = AF_INET;
+  int ipv4_done = 0;
 
   struct {
     struct nlmsghdr nlh;
@@ -207,9 +208,12 @@ int iface_enumerate(void *parm, int (*ip
 		    rta = RTA_NEXT(rta, len1);
 		  }
 		
-		if (addr.s_addr && ipv4_callback)
+		if (addr.s_addr && ipv4_callback) {
 		  if (!((*ipv4_callback)(addr, ifa->ifa_index, netmask, broadcast, parm)))
 		    return 0;
+		  else
+		    ipv4_done = 1;
+		}
 	      }
 #ifdef HAVE_IPV6
 	    else if (ifa->ifa_family == AF_INET6)
@@ -225,7 +229,7 @@ int iface_enumerate(void *parm, int (*ip
 		
 		if (addrp && ipv6_callback)
 		  if (!((*ipv6_callback)(addrp, ifa->ifa_index, ifa->ifa_index, parm)))
-		    return 0;
+		    return ipv4_done;
 	      }
 #endif
 	  }
--- a/src/network.c
+++ b/src/network.c
@@ -296,7 +296,7 @@ static int create_ipv6_listener(struct l
       bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
       listen(tcpfd, 5) == -1 ||
       bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1) 
-    return 0;
+    return 1;
       
   l = safe_malloc(sizeof(struct listener));
   l->fd = fd;