+union gen_addr {
+ struct in_addr v4;
+ 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;
+ int delim;
+ int nrevcomp;
+ int revcompwd;
+ adns_rrtype rrtype;
+ const void *(*sockaddr_to_inaddr)(const struct sockaddr *sa);
+ int (*sockaddr_equalp)(const struct sockaddr *sa,
+ const struct sockaddr *sb);
+ void (*prefix_mask)(int len, union gen_addr *a);
+ int (*guess_len)(const union gen_addr *a);
+ int (*matchp)(const union gen_addr *addr,
+ const union gen_addr *base, const union gen_addr *mask);
+ int (*rev_parsecomp)(const char *p, size_t n);
+ void (*rev_mkaddr)(union gen_addr *addr, const byte *ipv);
+ char *(*rev_mkname)(const struct sockaddr *sa, char *buf);
+} afinfo;
+
+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;
+