X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/8b3d55e3d8df616f6fa6d9089a9c9e567229e17b..b365d68ae5de07ef9dc4a3b92058a13edba5ad6f:/src/internal.h diff --git a/src/internal.h b/src/internal.h index a287d06..eba0b05 100644 --- a/src/internal.h +++ b/src/internal.h @@ -33,6 +33,7 @@ typedef unsigned char byte; #include #include #include +#include #include @@ -151,7 +152,7 @@ typedef struct { struct adns__query { adns_state ads; - enum { query_udp, query_tcpwait, query_tcpsent, query_child, query_done } state; + enum { query_tosend, query_tcpwait, query_tcpsent, query_child, query_done } state; adns_query back, next, parent; struct { adns_query head, tail; } children; struct { adns_query back, next; } siblings; @@ -207,9 +208,9 @@ struct adns__query { * * state Queue child id nextudpserver sentudp failedtcp * - * udp NONE null >=0 0 zero zero - * udp timew null >=0 any nonzero zero - * udp NONE null >=0 any nonzero zero + * tosend NONE null >=0 0 zero zero + * tosend timew null >=0 any nonzero zero + * tosend NONE null >=0 any nonzero zero * * tcpwait timew null >=0 irrelevant zero any * tcpsent timew null >=0 irrelevant zero any @@ -285,6 +286,7 @@ 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: */ @@ -363,11 +365,14 @@ void adns__query_tcp(adns_query qu, struct timeval now); * reestablishment and retry. */ -void adns__query_udp(adns_query qu, struct timeval now); -/* Query must be in state udp/NONE; it will be moved to a new state, +void adns__query_send(adns_query qu, struct timeval now); +/* Query must be in state tosend/NONE; it will be moved to a new state, * and no further processing can be done on it for now. * (Resulting state is one of udp/timew, tcpwait/timew (if server not connected), * tcpsent/timew, child/childw or done/output.) + * __query_send may decide to use either UDP or TCP depending whether + * _qf_usevc is set (or has become set) and whether the query is too + * large. */ /* From query.c: */ @@ -390,12 +395,14 @@ adns_status adns__internal_submit(adns_state ads, adns_query *query_r, * child will already have been taken off both the global list of * queries in ads and the list of children in the parent. The child * will be freed when the callback returns. The parent will have been - * taken off the global childw queue iff this is the last child for - * that parent. If there is no error detected in the callback, then - * it should call adns__query_done if and only if there are no more - * children (by checking parent->children.head). If an error is - * detected in the callback it should call adns__query_fail and any - * remaining children will automatically be cancelled. + * taken off the global childw queue. + * + * The callback should either call adns__query_done, if it is + * complete, or adns__query_fail, if an error has occurred, in which + * case the other children (if any) will be cancelled. If the parent + * has more unfinished children (or has just submitted more) then the + * callback may choose to wait for them - it must then put the parent + * back on the childw queue. */ void adns__search_next(adns_state ads, adns_query qu, struct timeval now); @@ -473,7 +480,7 @@ void adns__query_fail(adns_query qu, adns_status stat); /* From reply.c: */ void adns__procdgram(adns_state ads, const byte *dgram, int len, - int serv, struct timeval now); + int serv, int viatcp, struct timeval now); /* From types.c: */ @@ -644,6 +651,7 @@ static inline int ctype_digit(int c) { return c>='0' && c<='9'; } static inline int ctype_alpha(int c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } +static inline int ctype_822special(int c) { return strchr("()<>@,;:\\\".[]",c) != 0; } static inline int errno_resources(int e) { return e==ENOMEM || e==ENOBUFS; }