void adns_firsttimeout(adns_state ads,
struct timeval **tv_io, struct timeval *tvbuf,
struct timeval now) {
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
adns__timeouts(ads, 0, tv_io,tvbuf, now);
adns__returning(ads,0);
}
void adns_processtimeouts(adns_state ads, const struct timeval *now) {
struct timeval tv_buf;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
adns__must_gettimeofday(ads,&now,&tv_buf);
if (now) adns__timeouts(ads, 1, 0,0, *now);
adns__returning(ads,0);
struct udpsocket *udp;
adns_sockaddr udpaddr;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
switch (ads->tcpstate) {
case server_disconnected:
int adns_processwriteable(adns_state ads, int fd, const struct timeval *now) {
int r;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
switch (ads->tcpstate) {
case server_disconnected:
}
assert(FD_ISSET(ads->tcpsocket,&writeable));
if (!adns__vbuf_ensure(&ads->tcprecv,1)) { r= ENOMEM; goto xit; }
- r= read(ads->tcpsocket,&ads->tcprecv.buf,1);
+ r= read(ads->tcpsocket,ads->tcprecv.buf,1);
if (r==0 || (r<0 && (errno==EAGAIN || errno==EWOULDBLOCK))) {
tcp_connected(ads,*now);
r= 0; goto xit;
adns__tcp_broken(ads,"write",strerror(errno));
r= 0; goto xit;
} else if (r>0) {
+ assert(r <= ads->tcpsend.used);
ads->tcpsend.used -= r;
memmove(ads->tcpsend.buf,ads->tcpsend.buf+r,ads->tcpsend.used);
}
int adns_processexceptional(adns_state ads, int fd,
const struct timeval *now) {
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
switch (ads->tcpstate) {
case server_disconnected:
case server_broken:
struct pollfd pollfds[MAX_POLLFDS];
int i, fd, maxfd, npollfds;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
if (tv_mod && (!*tv_mod || (*tv_mod)->tv_sec || (*tv_mod)->tv_usec)) {
/* The caller is planning to sleep. */
struct pollfd pollfds[MAX_POLLFDS];
int npollfds, i;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
adns__must_gettimeofday(ads,&now,&tv_buf);
if (!now) goto xit;
adns_processtimeouts(ads,now);
/* General helpful functions. */
void adns_globalsystemfailure(adns_state ads) {
- adns__consistency(ads,0,cc_entex);
+ /* Must not be called by adns during actual processing of a
+ * particular query, since it reenters adns. Only safe to call in
+ * situations where it would be safe to call adns_returning. */
+ adns__consistency(ads,0,cc_enter);
- while (ads->udpw.head) adns__query_fail(ads->udpw.head, adns_s_systemfail);
- while (ads->tcpw.head) adns__query_fail(ads->tcpw.head, adns_s_systemfail);
+ for (;;) {
+ adns_query qu;
+#define GSF_QQ(QQ) \
+ if ((qu= ads->QQ.head)) { \
+ LIST_UNLINK(ads->QQ,qu); \
+ adns__query_fail(qu, adns_s_systemfail); \
+ continue; \
+ }
+ GSF_QQ(udpw);
+ GSF_QQ(tcpw);
+#undef GSF_QQ
+ break;
+ }
switch (ads->tcpstate) {
case server_connecting:
struct pollfd pollfds[MAX_POLLFDS];
int npollfds;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
r= gettimeofday(&now,0);
if (!r) adns_processtimeouts(ads,&now);
fd_set readfds, writefds, exceptfds;
struct timeval tvbuf, *tvp;
- adns__consistency(ads,*query_io,cc_entex);
+ adns__consistency(ads,*query_io,cc_enter);
for (;;) {
r= adns__internal_check(ads,query_io,answer_r,context_r);
if (r != EAGAIN) break;
struct timeval now;
int r;
- adns__consistency(ads,*query_io,cc_entex);
+ adns__consistency(ads,*query_io,cc_enter);
r= gettimeofday(&now,0);
if (!r) adns__autosys(ads,now);