X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Fadns-internal.h;h=2cdafbf9117bda31d5dc7b1e0d93d2d626dd543a;hp=7caba2f6d9db024cbe701c3b279a6b522f4c32f7;hb=a719a4bedec2bc512b7f95f7446e02f6662ebbc7;hpb=84fe28dbf1b4d178b54d84becc0ee91c1b2db5d4 diff --git a/src/adns-internal.h b/src/adns-internal.h index 7caba2f..2cdafbf 100644 --- a/src/adns-internal.h +++ b/src/adns-internal.h @@ -7,11 +7,17 @@ #include "adns.h" +/* Configuration and constants */ + #define MAXSERVERS 5 #define MAXUDPRETRIES 15 #define UDPRETRYMS 2000 #define TCPMS 30000 #define LOCALRESOURCEMS 20 +#define UDPMAXDGRAM 512 +#define NSPORT 53 + +/* Shared data structures */ union adns__align { adns_status status; @@ -23,6 +29,7 @@ union adns__align { }; struct adns__query { + /* FIXME: make sure this is all init'd properly */ adns_query back, next; adns_query parent; struct { adns_query head, tail; } children; @@ -47,21 +54,77 @@ struct adns__query { */ }; +struct adns__vbuf { + size_t used, avail; + unsigned char *buf; +}; + struct adns__state { + /* FIXME: make sure this is all init'd properly */ adns_initflags iflags; + FILE *diagfile; struct { adns_query head, tail; } tosend, timew, childw, output; int nextid, udpsocket; - int qbufavail, tcpbufavail, tcpbufused, tcpbufdone; - unsigned char *qbuf, *tcpbuf; + adns_vbuf rqbuf, tcpsend, tcprecv; int nservers, tcpserver; - enum { server_disc, server_connecting, server_ok } tcpstate; + enum adns__tcpstate { server_disc, server_connecting, server_ok } tcpstate; int tcpsocket; struct timeval tcptimeout; - int opbufavail, opbufused; - unsigned char *opbuf; struct server { struct in_addr addr; } servers[MAXSERVERS]; }; +/* From setup.c: */ + +void adns__vdiag(adns_state ads, adns_initflags prevent, const char *pfx, + int serv, const char *fmt, va_list al); +void adns__debug(adns_state ads, int serv, const char *fmt, ...) PRINTFFORMAT(2,3); +void adns__warn(adns_state ads, int serv, const char *fmt, ...) PRINTFFORMAT(2,3); +void adns__diag(adns_state ads, int serv, const char *fmt, ...) PRINTFFORMAT(2,3); + +/* From submit.c: */ + +void adns__query_fail(adns_state ads, adns_query qu, adns_status stat); + +/* From query.c: */ + +void adns__quproc_tosend(adns_state ads, adns_query qu, struct timeval now) { + +/* Useful static inline functions: */ + +static inline void timevaladd(struct timeval *tv_io, long ms) { + struct timeval tmp; + assert(ms>=0); + tmp= *tv_io; + tmp.tv_usec += (ms%1000)*1000; + tmp.tv_sec += ms/1000; + if (tmp.tv_usec >= 1000) { tmp.tv_sec++; tmp.tv_usec -= 1000; } + *tv_io= tmp; +} + +static inline int ctype_whitespace(int c) { return c==' ' || c=='\n' || c=='\t'; } +static inline int ctype_digit(int c) { return c>='0' && c<='9'; } + +/* Useful macros */ + +#define LIST_UNLINK_PART(list,node,part) \ + do { \ + if ((node)->back) (node)->back->part next= (node)->part next; \ + else (list).head= (node)->part next; \ + if ((node)->next) (node)->next->part back= (node)->part back; \ + else (list).tail= (node)->part back; \ + } while(0) + +#define LIST_LINK_TAIL_PART(list,node,part) \ + do { \ + (node)->part back= 0; \ + (node)->part next= (list).tail; \ + if ((list).tail) (list).tail->part back= (node); else (list).part head= (node); \ + (list).tail= (node); \ + } while(0) + +#define LIST_UNLINK(list,node) LIST_UNLINK_PART(list,node,) +#define LIST_LINK_TAIL_PART(list,node) LIST_LINK_TAIL(list,node,) + #endif