chiark / gitweb /
+ * Avoid infinite timeouts, causing lockup, when they should be zero !
[adns.git] / src / event.c
index 9109469e61389d7219cd143eb1b33ecc8f3f9de0..b3f71dd72c5149c5ba4dfe9ad92964c8f7c0111a 100644 (file)
@@ -47,6 +47,7 @@ void adns__tcp_closenext(adns_state ads) {
   
   serv= ads->tcpserver;
   close(ads->tcpsocket);
+  ads->tcpsocket= -1;
   ads->tcpstate= server_disconnected;
   ads->tcprecv.used= ads->tcprecv_skip= ads->tcpsend.used= 0;
   ads->tcpserver= (serv+1)%ads->nservers;
@@ -182,7 +183,12 @@ void adns__timeouts(adns_state ads, int act,
       if (!tv_io) continue;
       inter_maxtoabs(tv_io,tvbuf,now,qu->timeout);
     } else {
-      if (!act) continue;
+      if (!act) {
+       tvbuf.tv_sec= 0;
+       tvbuf.tv_usec= 0;
+       *tv_io= &tvbuf;
+       return;
+      }
       LIST_UNLINK(ads->timew,qu);
       if (qu->state != query_tosend) {
        adns__query_fail(qu,adns_s_timeout);
@@ -564,10 +570,15 @@ int adns__internal_check(adns_state ads,
 
   qu= *query_io;
   if (!qu) {
-    if (!ads->output.head) return EWOULDBLOCK;
-    qu= ads->output.head;
+    if (ads->output.head) {
+      qu= ads->output.head;
+    } else if (ads->timew.head) {
+      return EAGAIN;
+    } else {
+      return ESRCH;
+    }
   } else {
-    if (qu->id>=0) return EWOULDBLOCK;
+    if (qu->id>=0) return EAGAIN;
   }
   LIST_UNLINK(ads->output,qu);
   *answer= qu->answer;
@@ -588,7 +599,7 @@ int adns_wait(adns_state ads,
   adns__consistency(ads,*query_io,cc_entex);
   for (;;) {
     r= adns__internal_check(ads,query_io,answer_r,context_r);
-    if (r != EWOULDBLOCK) break;
+    if (r != EAGAIN) break;
     maxfd= 0; tvp= 0;
     FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds);
     adns_beforeselect(ads,&maxfd,&readfds,&writefds,&exceptfds,&tvp,&tvbuf,0);