adns_query parent, child;
adns_rrtype type;
adns_answer *answer;
- int flags, udpretries, server;
+ int id, flags, udpretries, nextserver;
+ unsigned long sentudp, senttcp; /* bitmaps indexed by server */
struct timeval timeout;
void *context;
char owner[1];
+ /* Possible states:
+ * Queue child answer nextserver sentudp senttcp
+ * input null null 0 all bits zero all bits zero
+ * timew null null any at least 1 bit set any
+ * childw set partial any any any
+ * output null set any any any
+ */
};
struct adns__state {
adns_initflags iflags;
struct { adns_query head, tail; } input, timew, childw, output;
- int udpsocket;
+ int nextid, udpsocket;
int qbufavail, tcpbufavail, tcpbufused, tcpbufdone;
char *qbuf, *tcpbuf;
int nservers;
- struct {
+ struct server {
struct in_addr addr;
+ enum { server_disc, server_connecting, server_ok } state;
int tcpsocket;
struct timeval timeout;
struct { adns_query head, tail; } connw;