X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Finternal.h;h=24c5c829f69162094a67c121337bc179eb5050f8;hp=0b39418433c859b464aa2c19606769e5dd728e0c;hb=c0af047b137721acff216e6d5665433ff2a366cb;hpb=82ae109eba3901127fcd5267872b0afd64af4a7c diff --git a/src/internal.h b/src/internal.h index 0b39418..24c5c82 100644 --- a/src/internal.h +++ b/src/internal.h @@ -39,6 +39,7 @@ typedef unsigned char byte; #include #include #include +#include #include @@ -69,9 +70,6 @@ typedef unsigned char byte; #define DNS_IDOFFSET 0 #define DNS_CLASS_IN 1 -#define DNS_INADDR_ARPA "in-addr", "arpa" -#define DNS_IP6_ARPA "ip6", "arpa" - #define MAX_POLLFDS ADNS_POLLFDS_RECOMMENDED /* Some preprocessor hackery */ @@ -131,10 +129,10 @@ typedef struct { struct timeval now; } parseinfo; -#define NREVDOMAINS 2 /* keep in sync with addrfam! */ +#define MAXREVLABELS 34 /* keep in sync with addrfam! */ struct revparse_state { - unsigned map; /* which domains are still live */ - byte ipv[NREVDOMAINS][32]; /* address components so far */ + uint16_t labstart[MAXREVLABELS]; + uint8_t lablen[MAXREVLABELS]; }; union checklabel_state { @@ -198,7 +196,8 @@ typedef struct typeinfo { adns_status (*checklabel)(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, - int labnum, const char *label, int lablen); + int labnum, const char *dgram, + int labstart, int lablen); /* Check a label from the query domain string. The label is not * necessarily null-terminated. The hook can refuse the query's submission * by returning a nonzero status. State can be stored in *cls between @@ -230,7 +229,7 @@ typedef struct typeinfo { adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, int labnum, - const char *label, int lablen); + const char *dgram, int labstart, int lablen); /* implemented in query.c, used by types.c as default * and as part of implementation for some fancier types * doesn't require any state */ @@ -470,24 +469,26 @@ extern int adns__make_reverse_domain(const struct sockaddr *sa, * allocate an output buffer failed. */ -extern int adns__revparse_label(struct revparse_state *rps, int labnum, - const char *label, int lablen); +extern bool adns__revparse_label(struct revparse_state *rps, int labnum, + const char *dgram, + int labstart, int lablen); /* Parse a label in a reverse-domain name, given its index labnum (starting * from zero), a pointer to its contents (which need not be null-terminated), * and its length. The state in *rps is initialized implicitly when labnum * is zero. * - * Returns zero if the parse was successful, nonzero if the domain name is - * definitely invalid and the parse must be abandoned. + * Returns 1 if the parse is proceeding successfully, 0 if the domain + * name is definitely invalid and the parse must be abandoned. */ -extern int adns__revparse_done(struct revparse_state *rps, int nlabels, - adns_rrtype *rrtype_r, adns_sockaddr *addr_r); +extern bool adns__revparse_done(struct revparse_state *rps, + const char *dgram, int nlabels, + adns_rrtype *rrtype_r, adns_sockaddr *addr_r); /* Finishes parsing a reverse-domain name, given the total number of * labels in the name. On success, fills in the af and protocol * address in *addr_r, and the forward query type in *rrtype_r - * (because that turns out to be useful). Returns nonzero if the - * parse must be abandoned. + * (because that turns out to be useful). Returns 1 if the parse + * was successful. */ /* From setup.c: */ @@ -865,6 +866,8 @@ void adns__update_expires(adns_query qu, unsigned long ttl, int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len); +bool adns__labels_equal(const byte *a, int al, const byte *b, int bl); + /* From event.c: */ void adns__tcp_broken(adns_state ads, const char *what, const char *why); @@ -913,6 +916,9 @@ 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_toupper(int c) { + return ctype_alpha(c) ? (c & ~32) : c; +} static inline int ctype_822special(int c) { return strchr("()<>@,;:\\\".[]",c) != 0; }