X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/0d2449308348bcf48c9b00c0f00391c9a18d30b5..60b40c591fd6136f91f7119383c34524279b7f1b:/src/internal.h diff --git a/src/internal.h b/src/internal.h index 6c6a77e..baf2a29 100644 --- a/src/internal.h +++ b/src/internal.h @@ -69,6 +69,7 @@ typedef unsigned char byte; #define DNS_CLASS_IN 1 #define DNS_INADDR_ARPA "in-addr", "arpa" +#define DNS_IP6_ARPA "ip6", "arpa" #define MAX_POLLFDS ADNS_POLLFDS_RECOMMENDED @@ -131,8 +132,14 @@ union gen_addr { struct af_addr { int af; union gen_addr addr; }; +#define NREVDOMAINS 2 /* keep in sync with addrfam! */ +struct revparse_state { + unsigned map; /* which domains are still live */ + byte ipv[NREVDOMAINS][32]; /* address components so far */ +}; + union checklabel_state { - struct { byte ipv[4]; } ptr; + struct revparse_state ptr; }; typedef struct { @@ -141,6 +148,7 @@ typedef struct { union { struct { + adns_rrtype rev_rrtype; struct af_addr addr; } ptr; } tinfo; /* type-specific state for the query itself: zero-init if you @@ -438,6 +446,40 @@ char *adns__sockaddr_ntoa(const struct sockaddr *sa, char *buf); * ADNS_ADDR2TEXT_BUFLEN bytes long (unchecked). Return buf; can't fail. */ +extern int adns__make_reverse_domain(const struct sockaddr *sa, + const char *zone, + char **buf_io, size_t bufsz, + char **buf_free_r); +/* Construct a reverse domain string, given a socket address and a parent + * zone. If zone is null, then use the standard reverse-lookup zone for the + * address family. If the length of the resulting string is no larger than + * bufsz, then the result is stored starting at *buf_io; otherwise a new + * buffer is allocated is used, and a pointer to it is stored in both *buf_io + * and *buf_free_r (the latter of which should be null on entry). If + * something goes wrong, then an errno value is returned: ENOSYS if the + * address family of sa isn't recognized, or ENOMEM if the attempt to + * allocate an output buffer failed. + */ + +extern int adns__revparse_label(struct revparse_state *rps, int labnum, + const char *label, 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. + */ + +extern int adns__revparse_done(struct revparse_state *rps, int nlabels, + adns_rrtype *rrtype_r, struct af_addr *addr_r); +/* Finishes parsing a reverse-domain name, given the total number of labels + * in the name. On success, fills in the 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. + */ + /* From setup.c: */ int adns__setnonblock(adns_state ads, int fd); /* => errno value */