X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/d4e363f4e7ec5ece1d36f04edc974665dd07fb82..8a53cf7f63a4decacd4b293b32167a23cdeea412:/src/internal.h diff --git a/src/internal.h b/src/internal.h index 55fb2ad..7cf4cec 100644 --- a/src/internal.h +++ b/src/internal.h @@ -5,12 +5,11 @@ * - comments regarding library data structures */ /* - * This file is - * Copyright (C) 1997-2000 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999-2000 Tony Finch + * This file is part of adns, which is + * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1999-2000,2003,2006 Tony Finch + * Copyright (C) 1991 Massachusetts Institute of Technology + * (See the file INSTALL for full details.) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -70,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 @@ -113,8 +113,32 @@ typedef struct { struct timeval now; } parseinfo; +union gen_addr { + struct in_addr v4; + struct in6_addr v6; +}; + +typedef struct { + int af; + int width; + int delim; + int nrevcomp; + int revcompwd; + adns_rrtype rrtype; + void *(*sockaddr_to_inaddr)(struct sockaddr *sa); + 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)(struct sockaddr *sa, char *buf); +} afinfo; + +struct afinfo_addr { const afinfo *ai; union gen_addr addr; }; + typedef struct typeinfo { - adns_rrtype type; + adns_rrtype typekey; const char *rrtname; const char *fmtname; int rrsz; @@ -159,6 +183,12 @@ typedef struct typeinfo { * string. On successful return, label_r[] and *ll_io are filled in * and *p_io points to *pe or just after the label-ending `.'. */ + void (*postsort)(adns_state ads, void *array, int nrrs, + const struct typeinfo *typei); + /* Called immediately after the RRs have been sorted, and may rearrange + * them. (This is really for the benefit of SRV's bizarre weighting + * stuff.) May be 0 to mean nothing needs to be done. + */ } typeinfo; adns_status adns__qdpl_normal(adns_state ads, @@ -186,7 +216,7 @@ typedef struct { void *ext; void (*callback)(adns_query parent, adns_query child); union { - adns_rr_addr ptr_parent_addr; + struct afinfo_addr ptr_parent_addr; adns_rr_hostaddr *hostaddr; } info; } qcontext; @@ -328,11 +358,17 @@ struct adns__state { struct in_addr addr; } servers[MAXSERVERS]; struct sortlist { - struct in_addr base, mask; + const afinfo *ai; + union gen_addr base, mask; } sortlist[MAXSORTLIST]; char **searchlist; + unsigned short rand48xsubi[3]; }; +/* From addrfam.c: */ + +extern const afinfo adns__inet_afinfo, adns__inet6_afinfo; + /* From setup.c: */ int adns__setnonblock(adns_state ads, int fd); /* => errno value */ @@ -397,7 +433,8 @@ void adns__sigpipe_unprotect(adns_state); adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, const char *owner, int ol, - const typeinfo *typei, adns_queryflags flags); + const typeinfo *typei, adns_rrtype type, + adns_queryflags flags); /* Assembles a query packet in vb. A new id is allocated and returned. */