switch (ads->tcpstate) {
case server_disconnected:
+ case server_broken:
return 1;
case server_connecting:
pollfds_buf[1].events= POLLOUT;
case server_ok:
if (fd != ads->tcpsocket) break;
assert(!ads->tcprecv_skip);
- for (;;) {
+ do {
if (ads->tcprecv.used >= ads->tcprecv_skip+2) {
dgramlen= ((ads->tcprecv.buf[ads->tcprecv_skip]<<8) |
ads->tcprecv.buf[ads->tcprecv_skip+1]);
if (errno_resources(errno)) { r= errno; goto xit; }
}
adns__tcp_broken(ads,"read",r?strerror(errno):"closed");
- r= 0; goto xit;
}
- } /* never reached */
+ } while (ads->tcpstate == server_ok);
+ r= 0; goto xit;
default:
abort();
}
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_iobuf); goto xit; }
- adns__timeouts(ads, 1, tv_mod,tv_tobuf, *now);
+ if (!now) { inter_immed(tv_mod,tv_tobuf); goto xit; }
+ adns__timeouts(ads, 0, tv_mod,tv_tobuf, *now);
}
npollfds= adns__pollfds(ads,pollfds);
void **context_r) {
int r, maxfd, rsel;
fd_set readfds, writefds, exceptfds;
- struct timeval *now, nowbuf, tvbuf, *tvp;
+ struct timeval tvbuf, *tvp;
adns__consistency(ads,*query_io,cc_entex);
for (;;) {
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) {