X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/62e2764d90d496e46a62e6a2bc1ff1c5ecda908d..ef514bbcec865ded4d2d040358e13c7432c15e1a:/src/internal.h diff --git a/src/internal.h b/src/internal.h index bddb197..3e85a58 100644 --- a/src/internal.h +++ b/src/internal.h @@ -72,7 +72,6 @@ typedef unsigned char byte; #define DNS_INADDR_ARPA "in-addr", "arpa" #define DNS_IP6_ARPA "ip6", "arpa" -#define ADDR_MAXRRTYPES 2 #define MAX_ADDRSTRLEN 64 #define STRINGIFY(x) REALLY_STRINGIFY(x) @@ -96,8 +95,6 @@ typedef enum { } dns_rcode; enum { - adns__qf_senddirect = 0x00100000,/* don't call the `query_send' type hook */ - adns__qf_nosend = 0x00200000,/* don't send the query when submitting */ adns__qf_addr_answer= 0x01000000,/* addr query received an answer */ adns__qf_addr_cname = 0x02000000 /* addr subquery performed on cname */ }; @@ -132,6 +129,14 @@ union gen_addr { struct in6_addr v6; }; +union checklabel_state { + struct { +#define PTR_NDOMAIN 2 + unsigned domainmap; /* which domains are still live */ + byte ipv[PTR_NDOMAIN][32]; /* address components so far */ + } ptr; +}; + typedef struct { int af; int width; @@ -153,6 +158,26 @@ typedef struct { struct afinfo_addr { const afinfo *ai; union gen_addr addr; }; +typedef struct { + void *ext; + void (*callback)(adns_query parent, adns_query child); + + union { + adns_rr_hostaddr *hostaddr; + } pinfo; /* state for use by parent's callback function */ + + union { + struct { + struct afinfo_addr addr; + } ptr; + struct { + unsigned want, have; + } addr; + } tinfo; /* type-specific state for the query itself: zero-init if you + * don't know better. */ + +} qcontext; + typedef struct typeinfo { adns_rrtype typekey; const char *rrtname; @@ -188,16 +213,17 @@ typedef struct typeinfo { * 0 otherwise. Must not fail. */ - adns_status (*qdparselabel)(adns_state ads, - const char **p_io, const char *pe, int labelnum, - char label_r[DNS_MAXDOMAIN], int *ll_io, - adns_queryflags flags, - const struct typeinfo *typei); - /* Parses one label from the query domain string. On entry, *p_io - * points to the next character to parse and *ll_io is the size of - * the buffer. pe points just after the end of the query domain - * string. On successful return, label_r[] and *ll_io are filled in - * and *p_io points to *pe or just after the label-ending `.'. */ + adns_status (*checklabel)(adns_state ads, adns_queryflags flags, + union checklabel_state *css, qcontext *ctx, + int labnum, const char *label, int lablen); + /* Check a label from the query domain string. The label is not + * necessarily null-terminated. The query has not yet been constructed, + * and this hook can refuse its submission by returning a nonzero status. + * State can be stored in *css between calls, and useful information can be + * stashed in ctx->tinfo, to be stored with the query (e.g., it will be + * available to the parse hook). This hook can detect a first call because + * labnum is zero, and a final call because lablen is zero. + */ void (*postsort)(adns_state ads, void *array, int nrrs, const struct typeinfo *typei); @@ -218,13 +244,12 @@ typedef struct typeinfo { */ } typeinfo; -adns_status adns__qdpl_normal(adns_state ads, - const char **p_io, const char *pe, int labelnum, - char label_r[], int *ll_io, - adns_queryflags flags, - const typeinfo *typei); - /* implemented in transmit.c, used by types.c as default - * and as part of implementation for some fancier types */ +adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, + union checklabel_state *css, + qcontext *ctx, int labnum, + const char *label, int lablen); +/* implemented in query.c, used by types.c as default + * and as part of implementation for some fancier types */ typedef struct allocnode { struct allocnode *next, *back; @@ -240,15 +265,6 @@ union maxalign { union maxalign *up; } data; -typedef struct { - void *ext; - void (*callback)(adns_query parent, adns_query child); - union { - struct afinfo_addr ptr_parent_addr; - adns_rr_hostaddr *hostaddr; - } info; -} qcontext; - struct adns__query { adns_state ads; enum { query_tosend, query_tcpw, query_childw, query_done } state; @@ -301,13 +317,6 @@ struct adns__query { struct timeval timeout; time_t expires; /* Earliest expiry time of any record we used. */ - union { - struct { - size_t nrrty, onrrty; - adns_rrtype rrty[ADDR_MAXRRTYPES]; - } addr; - } t; /* type-specific state */ - qcontext ctx; /* Possible states: @@ -508,7 +517,7 @@ adns_status adns__internal_submit(adns_state ads, adns_query *query_r, const typeinfo *typei, adns_rrtype, vbuf *qumsg_vb, int id, adns_queryflags flags, struct timeval now, - const qcontext *ctx); + qcontext *ctx); /* Submits a query (for internal use, called during external submits). * * The new query is returned in *query_r, or we return adns_s_nomemory.