X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fevent.c;h=f91a146b9942fa0a74c86059ec74d643fd0000da;hb=e96ef6b0e23967467875ee86a403c5760359c6cc;hp=d51f9807b0dd9d2f73e1543400866f37acf2ddb6;hpb=9c344a4295bf94dbd4690f35b4d8722398af3913;p=adns.git diff --git a/src/event.c b/src/event.c index d51f980..f91a146 100644 --- a/src/event.c +++ b/src/event.c @@ -83,6 +83,21 @@ static void tcp_connected(adns_state ads, struct timeval now) { } } +static void tcp_broken_events(adns_state ads) { + adns_query qu, nqu; + + assert(ads->tcpstate == server_broken); + for (qu= ads->tcpw.head; qu; qu= nqu) { + nqu= qu->next; + assert(qu->state == query_tcpw); + if (qu->retries > ads->nservers) { + LIST_UNLINK(ads->tcpw,qu); + adns__query_fail(qu,adns_s_allservfail); + } + } + ads->tcpstate= server_disconnected; +} + void adns__tcp_tryconnect(adns_state ads, struct timeval now) { int r, fd, tries; struct sockaddr_in addr; @@ -135,7 +150,7 @@ void adns__tcp_tryconnect(adns_state ads, struct timeval now) { return; } adns__tcp_broken(ads,"connect",strerror(errno)); - ads->tcpstate= server_disconnected; + tcp_broken_events(ads); } } @@ -222,21 +237,11 @@ static void timeouts_queue(adns_state ads, int act, static void tcp_events(adns_state ads, int act, struct timeval **tv_io, struct timeval *tvbuf, struct timeval now) { - adns_query qu, nqu; - 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); - if (qu->retries > ads->nservers) { - LIST_UNLINK(ads->tcpw,qu); - adns__query_fail(qu,adns_s_allservfail); - } - } - ads->tcpstate= server_disconnected; + tcp_broken_events(ads); case server_disconnected: /* fall through */ if (!ads->tcpw.head) return; if (!act) { inter_immed(tv_io,tvbuf); return; }