return;
}
-static void inter_immed(struct timeval **tv_io, struct timeval *tvbuf) {
- struct timeval *rbuf;
-
- if (!tv_io) return;
-
- rbuf= *tv_io;
- if (!rbuf) { *tv_io= rbuf= tvbuf; }
-
- timerclear(rbuf);
-}
-
static void inter_maxto(struct timeval **tv_io, struct timeval *tvbuf,
struct timeval maxto) {
struct timeval *rbuf;
if (!timercmp(&now,&qu->timeout,>)) {
inter_maxtoabs(tv_io,tvbuf,now,qu->timeout);
} else {
- if (!act) { inter_immed(tv_io,tvbuf); return; }
+ if (!act) {
+ tvbuf->tv_sec= 0;
+ tvbuf->tv_usec= 0;
+ *tv_io= tvbuf;
+ return;
+ }
LIST_UNLINK(*queue,qu);
if (qu->state != query_tosend) {
adns__query_fail(qu,adns_s_timeout);
for (;;) {
switch (ads->tcpstate) {
case server_broken:
- if (!act) { inter_immed(tv_io,tvbuf); return; }
for (qu= ads->tcpw.head; qu; qu= nqu) {
nqu= qu->next;
assert(qu->state == query_tcpw);
ads->tcpstate= server_disconnected;
case server_disconnected: /* fall through */
if (!ads->tcpw.head) return;
- if (!act) { inter_immed(tv_io,tvbuf); return; }
adns__tcp_tryconnect(ads,now);
break;
case server_ok:
timevaladd(&ads->tcptimeout,TCPIDLEMS);
}
case server_connecting: /* fall through */
- if (!act || !timercmp(&now,&ads->tcptimeout,>)) {
+ if (!timercmp(&now,&ads->tcptimeout,>)) {
inter_maxtoabs(tv_io,tvbuf,now,ads->tcptimeout);
return;
} {
abort();
}
}
- return;
}
void adns__timeouts(adns_state ads, int act,
if (tv_mod && (!*tv_mod || (*tv_mod)->tv_sec || (*tv_mod)->tv_usec)) {
/* The caller is planning to sleep. */
adns__must_gettimeofday(ads,&now,&tv_nowbuf);
- if (!now) { inter_immed(tv_mod,tv_tobuf); goto xit; }
+ if (!now) goto xit;
adns__timeouts(ads, 1, tv_mod,tv_tobuf, *now);
}
if (r != EAGAIN) break;
maxfd= 0; tvp= 0;
FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds);
+ ads->bug_if_query_done_now= 1;
adns_beforeselect(ads,&maxfd,&readfds,&writefds,&exceptfds,&tvp,&tvbuf,0);
+ ads->bug_if_query_done_now= 0;
assert(tvp);
rsel= select(maxfd,&readfds,&writefds,&exceptfds,tvp);
if (rsel==-1) {
struct query_queue udpw, tcpw, childw, output;
adns_query forallnext;
int nextid, udpsocket, tcpsocket;
+ int bug_if_query_done_now;
vbuf tcpsend, tcprecv;
int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
enum adns__tcpstate {
server_ok, server_broken
} tcpstate;
struct timeval tcptimeout;
- /* This will have tv_sec==0 if it is not valid. It will always be
- * valid if tcpstate _connecting. When _ok, it will be nonzero if
- * we are idle (ie, tcpw queue is empty), in which case it is the
- * absolute time when we will close the connection.
+ /* This will have tv_sec==0 if it is not valid.
+ * It will always be valid if tcpstate _connecting.
+ * When _ok, it will be nonzero if we are idle
+ * (ie, tcpw queue is empty) and counting down.
*/
struct sigaction stdsigpipe;
sigset_t stdsigmask;