X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/96818a1359d6f856b032f848217f2cd370d495f0..ef514bbcec865ded4d2d040358e13c7432c15e1a:/src/internal.h diff --git a/src/internal.h b/src/internal.h index 40da52d..3e85a58 100644 --- a/src/internal.h +++ b/src/internal.h @@ -72,6 +72,8 @@ typedef unsigned char byte; #define DNS_INADDR_ARPA "in-addr", "arpa" #define DNS_IP6_ARPA "ip6", "arpa" +#define MAX_ADDRSTRLEN 64 + #define STRINGIFY(x) REALLY_STRINGIFY(x) #define REALLY_STRINGIFY(x) #x @@ -93,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 */ }; @@ -129,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; @@ -150,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; @@ -185,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); @@ -203,6 +232,11 @@ typedef struct typeinfo { * stuff.) May be 0 to mean nothing needs to be done. */ + int (*getrrsz)(adns_rrtype type); + /* Return the output resource-record element size; if this is null, then + * the rrsz member can be used. + */ + void (*query_send)(adns_query qu, struct timeval now); /* Send the query to nameservers, and hook it into the appropriate queue. * Normal behaviour is to call adns__query_send, but this can be overridden @@ -210,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; @@ -232,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; @@ -397,7 +421,9 @@ int adns__setnonblock(adns_state ads, int fd); /* => errno value */ /* From general.c: */ -const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n); +const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n, char *buf); +/* Buffer must be at least MAX_ADDRSTRLEN bytes long. */ + void adns__vlprintf(adns_state ads, const char *fmt, va_list al); void adns__lprintf(adns_state ads, const char *fmt, ...) PRINTFFORMAT(2,3); @@ -491,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.