chiark / gitweb /
+ * Give ESRCH, not EAGAIN, if _check called with no queries outstanding.
[adns.git] / src / event.c
index 6ddf492a06e5205a3bb8b48140161ea5c8ce2e38..9384085256eb392baf017ee1678001700d8c4b76 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;
@@ -526,7 +527,7 @@ void adns_globalsystemfailure(adns_state ads) {
 }
 
 int adns_processany(adns_state ads) {
-  int r;
+  int r, i;
   struct timeval now;
   struct pollfd pollfds[MAX_POLLFDS];
   int npollfds;
@@ -541,6 +542,7 @@ int adns_processany(adns_state ads) {
    * likely just to want to do a read on one or two fds anyway.
    */
   npollfds= adns__pollfds(ads,pollfds);
+  for (i=0; i<npollfds; i++) pollfds[i].revents= pollfds[i].events;
   adns__fdevents(ads,
                 pollfds,npollfds,
                 0,0,0,0,
@@ -563,10 +565,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;
@@ -587,7 +594,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);