X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/d942707de2dd9809338882f09a9f23316dc8be36..1f2ababa3c46c7db8926c85e51f1c6a55344a26e:/src/internal.h diff --git a/src/internal.h b/src/internal.h index 89327ec..2b604b7 100644 --- a/src/internal.h +++ b/src/internal.h @@ -43,6 +43,7 @@ typedef unsigned char byte; #include #include "adns.h" +#include "dlist.h" /* Configuration and constants */ @@ -279,7 +280,7 @@ struct adns__state { adns_query forallnext; int nextid, udpsocket, tcpsocket; vbuf tcpsend, tcprecv; - int nservers, nsortlist, nsearchlist, searchndots, tcpserver; + int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip; enum adns__tcpstate { server_disconnected, server_connecting, server_ok } tcpstate; struct timeval tcptimeout; struct sigaction stdsigpipe; @@ -297,7 +298,6 @@ struct adns__state { /* From setup.c: */ int adns__setnonblock(adns_state ads, int fd); /* => errno value */ -void adns__checkqueues(adns_state ads); /* expensive walk, for checking */ /* From general.c: */ @@ -346,7 +346,8 @@ void adns__sigpipe_unprotect(adns_state); /* If SIGPIPE protection is not disabled, will block all signals except * SIGPIPE, and set SIGPIPE's disposition to SIG_IGN. (And then restore.) * Each call to _protect must be followed by a call to _unprotect before - * any significant amount of code gets to run. + * any significant amount of code gets to run, since the old signal mask + * is stored in the adns structure. */ /* From transmit.c: */ @@ -372,7 +373,7 @@ void adns__query_tcp(adns_query qu, struct timeval now); * * adns__tcp_tryconnect should already have been called - _tcp * will only use an existing connection (if there is one), which it - * may break. If the conn list lost then the caller is responsible for any + * may break. If the conn is lost then the caller is responsible for any * reestablishment and retry. */ @@ -492,6 +493,11 @@ void adns__query_fail(adns_query qu, adns_status stat); void adns__procdgram(adns_state ads, const byte *dgram, int len, int serv, int viatcp, struct timeval now); +/* This function is allowed to cause new datagrams to be constructed + * and sent, or even new queries to be started. However, + * query-sending functions are not allowed to call any general event + * loop functions in case they accidentally call this. + */ /* From types.c: */ @@ -631,7 +637,10 @@ void adns__tcp_closenext(adns_state ads); void adns__tcp_tryconnect(adns_state ads, struct timeval now); void adns__autosys(adns_state ads, struct timeval now); -/* Make all the system calls we want to if the application wants us to. */ +/* Make all the system calls we want to if the application wants us to. + * Must not be called from within adns internal processing functions, + * lest we end up in recursive descent ! + */ void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io, struct timeval *tv_buf); @@ -680,28 +689,6 @@ static inline int errno_resources(int e) { return e==ENOMEM || e==ENOBUFS; } (( ((sz)+sizeof(union maxalign)-1) / sizeof(union maxalign) ) \ * sizeof(union maxalign) ) -#define LIST_INIT(list) ((list).head= (list).tail= 0) -#define LINK_INIT(link) ((link).next= (link).back= 0) - -#define LIST_UNLINK_PART(list,node,part) \ - do { \ - if ((node)->part back) (node)->part back->part next= (node)->part next; \ - else (list).head= (node)->part next; \ - if ((node)->part next) (node)->part 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 next= 0; \ - (node)->part back= (list).tail; \ - if ((list).tail) (list).tail->part next= (node); else (list).head= (node); \ - (list).tail= (node); \ - } while(0) - -#define LIST_UNLINK(list,node) LIST_UNLINK_PART(list,node,) -#define LIST_LINK_TAIL(list,node) LIST_LINK_TAIL_PART(list,node,) - #define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff) #define GET_B(cb,tv) ((tv)= GETIL_B((cb))) #define GET_W(cb,tv) ((tv)=0, (tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))