*/
/*
* This file is
- * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
*
* It is part of adns, which is
- * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
* Copyright (C) 1999 Tony Finch <dot@dotat.at>
*
* This program is free software; you can redistribute it and/or modify
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);
* 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;
+ for (i=0; i<npollfds; i++) pollfds[i].revents= pollfds[i].events & ~POLLPRI;
adns__fdevents(ads,
pollfds,npollfds,
0,0,0,0,
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 (;;) {