Fix bug which caused dnsmasq to become unresponsive when an interface goes.
diff --git a/CHANGELOG b/CHANGELOG
index 00f0480..35093ad 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -33,6 +33,10 @@
  
             Fix bug when resulted in NXDOMAIN answers instead of NODATA in
             some circumstances.
+
+	    Fix bug which caused dnsmasq to become unresponsive if it 
+	    failed to send packets due to a network interface disappearing.
+	    Thanks to Niels Peen for spotting this.
 	    
 
 version 2.71
diff --git a/src/util.c b/src/util.c
index df751c7..a729f33 100644
--- a/src/util.c
+++ b/src/util.c
@@ -570,18 +570,28 @@
 
 int retry_send(void)
 {
-   struct timespec waiter;
+  /* Linux kernels can return EAGAIN in perpetuity when calling
+     sendmsg() and the relevant interface has gone. Here we loop
+     retrying in EAGAIN for 1 second max, to avoid this hanging 
+     dnsmasq. */
+
+  static int retries = 0;
+  struct timespec waiter;
+
    if (errno == EAGAIN || errno == EWOULDBLOCK)
      {
        waiter.tv_sec = 0;
        waiter.tv_nsec = 10000;
        nanosleep(&waiter, NULL);
-       return 1;
+       if (retries++ < 1000)
+	 return 1;
      }
+
+   retries = 0;
    
    if (errno == EINTR)
      return 1;
-
+   
    return 0;
 }