Use event system to re-send query on new route. Tidies module boundaries.
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/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 dfa9773..30f176a 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
@@ -1183,6 +1184,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);
@@ -1290,11 +1292,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