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;
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);
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;
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);