Fix logic for associating leases with interfaces.

This handles the case that more than one interface contains
the network the lease address is on, but the interfaces have different
prefix lengths. Use the longest prefix length.
diff --git a/src/bpf.c b/src/bpf.c
index fea84b1..4416b1c 100644
--- a/src/bpf.c
+++ b/src/bpf.c
@@ -401,7 +401,7 @@
    else if (msg->ifm_type == RTM_NEWADDR)
      {
        del_family = 0;
-       send_newaddr();
+       queue_event(EVENT_NEWADDR);
      }
    else if (msg->ifm_type == RTM_DELADDR)
      {
@@ -439,7 +439,7 @@
 	       of += sizeof(long) - (diff & (sizeof(long) - 1));
 	   }
        
-       send_newaddr();
+       queue_event(EVENT_NEWADDR);
      }
 }
 
diff --git a/src/config.h b/src/config.h
index ee6d218..87f8f8a 100644
--- a/src/config.h
+++ b/src/config.h
@@ -268,6 +268,7 @@
 /* Select the RFC_3542 version of the IPv6 socket API. 
    Define before netinet6/in6.h is included. */
 #define __APPLE_USE_RFC_3542 
+#define NO_IPSET
 
 #elif defined(__NetBSD__)
 #define HAVE_BSD_NETWORK
diff --git a/src/dnsmasq.c b/src/dnsmasq.c
index 5560aa9..8b375de 100644
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
@@ -30,6 +30,7 @@
 static void async_event(int pipe, time_t now);
 static void fatal_event(struct event_desc *ev, char *msg);
 static int read_event(int fd, struct event_desc *evp, char **msg);
+static void poll_resolv(int force, int do_reload, time_t now);
 
 int main (int argc, char **argv)
 {
@@ -1037,9 +1038,9 @@
     }
 }
 
-void send_newaddr(void)
+void queue_event(int event)
 {
-  send_event(pipewrite, EVENT_NEWADDR, 0, NULL);
+  send_event(pipewrite, event, 0, NULL);
 }
 
 void send_event(int fd, int event, int data, char *msg)
@@ -1239,7 +1240,13 @@
       case EVENT_NEWADDR:
 	newaddress(now);
 	break;
-	
+
+      case EVENT_NEWROUTE:
+	resend_query();
+	/* Force re-reading resolv file right now, for luck. */
+	poll_resolv(0, 1, now);
+	break;
+
       case EVENT_TERM:
 	/* Knock all our children on the head. */
 	for (i = 0; i < MAX_PROCS; i++)
@@ -1272,7 +1279,7 @@
       }
 }
 
-void poll_resolv(int force, int do_reload, time_t now)
+static void poll_resolv(int force, int do_reload, time_t now)
 {
   struct resolvc *res, *latest;
   struct stat statbuf;
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index 2c682a3..8e103d3 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -166,6 +166,7 @@
 #define EVENT_TFTP_ERR  20
 #define EVENT_INIT      21
 #define EVENT_NEWADDR   22
+#define EVENT_NEWROUTE  23
 
 /* Exit codes. */
 #define EC_GOOD        0
@@ -1186,6 +1187,7 @@
 int send_from(int fd, int nowild, char *packet, size_t len, 
 	       union mysockaddr *to, struct all_addr *source,
 	       unsigned int iface);
+void resend_query();
 
 /* network.c */
 int indextoname(int fd, int index, char *name);
@@ -1294,11 +1296,10 @@
 int make_icmp_sock(void);
 int icmp_ping(struct in_addr addr);
 #endif
-void send_newaddr(void);
+void queue_event(int event);
 void send_alarm(time_t event, time_t now);
 void send_event(int fd, int event, int data, char *msg);
 void clear_cache_and_reload(time_t now);
-void poll_resolv(int force, int do_reload, time_t now);
 
 /* netlink.c */
 #ifdef HAVE_LINUX_NETWORK
diff --git a/src/forward.c b/src/forward.c
index 9fe6afa..1a657bb 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -2130,6 +2130,25 @@
    
   return NULL;
 }
+ 
+/* Send query packet again, if we can. */
+void resend_query()
+{
+  if (daemon->srv_save)
+    {
+      int fd;
+      
+      if (daemon->srv_save->sfd)
+	fd = daemon->srv_save->sfd->fd;
+      else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
+	fd = daemon->rfd_save->fd;
+      else
+	return;
+      
+      while(sendto(fd, daemon->packet, daemon->packet_len, 0,
+		   &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send()); 
+    }
+}
 
 /* A server record is going away, remove references to it */
 void server_gone(struct server *server)
diff --git a/src/netlink.c b/src/netlink.c
index 022c363..cff43cc 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -356,28 +356,10 @@
       struct rtmsg *rtm = NLMSG_DATA(h);
       
       if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
-	{
-  	  /* Force re-reading resolv file right now, for luck. */
-	  daemon->last_resolv = 0;
-	  
-	  if (daemon->srv_save)
-	    {
-	      int fd;
-
-	      if (daemon->srv_save->sfd)
-		fd = daemon->srv_save->sfd->fd;
-	      else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
-		fd = daemon->rfd_save->fd;
-	      else
-		return;
-	      
-	      while(sendto(fd, daemon->packet, daemon->packet_len, 0,
-			   &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send()); 
-	    }
-	}
+	queue_event(EVENT_NEWROUTE);
     }
   else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR) 
-    send_newaddr();
+    queue_event(EVENT_NEWADDR);
 }
 #endif
 
diff --git a/src/network.c b/src/network.c
index ff9cabb..b188f50 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1559,7 +1559,6 @@
   return gotone;
 }
 
-#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
 /* Called when addresses are added or deleted from an interface */
 void newaddress(time_t now)
 {
@@ -1584,7 +1583,6 @@
 #endif
 }
 
-#endif