X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Finternal.h;h=f459a24766a61c3138062f28fa04d3f5a4b7c04a;hp=f8d443db7413e2c8fa1514cca01d1a45f9d4ef9c;hb=c5fd1fbbe4976af30ac18f600b275036dbbe688f;hpb=0d66e3739146c9349ceb7600adc814d7d968e14c diff --git a/src/internal.h b/src/internal.h index f8d443d..f459a24 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 @@ -73,6 +72,27 @@ typedef unsigned char byte; #define MAX_POLLFDS ADNS_POLLFDS_RECOMMENDED +/* Some preprocessor hackery */ + +#define GLUE(x, y) GLUE_(x, y) +#define GLUE_(x, y) x##y + +/* C99 macro `...' must match at least one argument, so the naive definition + * `#define CAR(car, ...) car' won't work. But it's easy to arrange for the + * tail to be nonempty if we're just going to discard it anyway. */ +#define CAR(...) CAR_(__VA_ARGS__, _) +#define CAR_(car, ...) car + +/* Extracting the tail of an argument list is rather more difficult. The + * following trick is based on one by Laurent Deniau to count the number of + * arguments to a macro, simplified in two ways: (a) it only handles up to + * eight arguments, and (b) it only needs to distinguish the one-argument + * case from many arguments. */ +#define CDR(...) CDR_(__VA_ARGS__, m, m, m, m, m, m, m, 1, _)(__VA_ARGS__) +#define CDR_(_1, _2, _3, _4, _5, _6, _7, _8, n, ...) CDR_##n +#define CDR_1(_) +#define CDR_m(_, ...) __VA_ARGS__ + typedef enum { cc_user, cc_entex, @@ -90,15 +110,6 @@ typedef enum { /* Shared data structures */ -typedef union { - adns_status status; - char *cp; - adns_rrtype type; - int i; - struct in_addr ia; - unsigned long ul; -} rr_align; - typedef struct { int used, avail; byte *buf; @@ -113,8 +124,8 @@ typedef struct { struct timeval now; } parseinfo; -typedef struct { - adns_rrtype type; +typedef struct typeinfo { + adns_rrtype typekey; const char *rrtname; const char *fmtname; int rrsz; @@ -147,8 +158,34 @@ typedef struct { /* Returns !0 if RR a should be strictly after RR b in the sort order, * 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 `.'. */ + + 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, + 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 */ + typedef struct allocnode { struct allocnode *next, *back; } allocnode; @@ -165,10 +202,15 @@ union maxalign { typedef struct { void *ext; void (*callback)(adns_query parent, adns_query child); + + union { + adns_rr_addr ptr_addr; + } tinfo; /* type-specific state for the query itself: zero-init if you + * don't know better. */ + union { - adns_rr_addr ptr_parent_addr; adns_rr_hostaddr *hostaddr; - } info; + } pinfo; /* state for use by parent's callback function */ } qcontext; struct adns__query { @@ -283,7 +325,8 @@ struct query_queue { adns_query head, tail; }; struct adns__state { adns_initflags iflags; - FILE *diagfile; + adns_logcallbackfn *logfn; + void *logfndata; int configerrno; struct query_queue udpw, tcpw, childw, output; adns_query forallnext; @@ -310,6 +353,7 @@ struct adns__state { struct in_addr base, mask; } sortlist[MAXSORTLIST]; char **searchlist; + unsigned short rand48xsubi[3]; }; /* From setup.c: */ @@ -318,6 +362,10 @@ int adns__setnonblock(adns_state ads, int fd); /* => errno value */ /* From general.c: */ +void adns__vlprintf(adns_state ads, const char *fmt, va_list al); +void adns__lprintf(adns_state ads, const char *fmt, + ...) PRINTFFORMAT(2,3); + void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, int serv, adns_query qu, const char *fmt, va_list al); @@ -372,7 +420,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. */