* - comments regarding library data structures
*/
/*
- * This file is
- * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *
- * It is part of adns, which is
- * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- * Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ * 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
#define DNS_CLASS_IN 1
#define DNS_INADDR_ARPA "in-addr", "arpa"
+#define DNS_IP6_ARPA "ip6", "arpa"
+
+#define STRINGIFY(x) REALLY_STRINGIFY(x)
+#define REALLY_STRINGIFY(x) #x
#define MAX_POLLFDS ADNS_POLLFDS_RECOMMENDED
struct timeval now;
} parseinfo;
+union gen_addr {
+ struct in_addr v4;
+ struct in6_addr v6;
+};
+
typedef struct {
- adns_rrtype type;
+ int af;
+ int width;
+ int delim;
+ int nrevcomp;
+ int revcompwd;
+ adns_rrtype rrtype;
+ void *(*sockaddr_to_inaddr)(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 typeinfo {
+ adns_rrtype typekey;
const char *rrtname;
const char *fmtname;
int rrsz;
/* 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;
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;
struct query_queue { adns_query head, tail; };
+#define MAXUDP 2
+
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;
- int nextid, udpsocket, tcpsocket;
+ int nextid, tcpsocket;
+ struct udpsocket { const afinfo *ai; int fd; } udpsocket[MAXUDP];
+ int nudp;
vbuf tcpsend, tcprecv;
int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
enum adns__tcpstate {
struct sigaction stdsigpipe;
sigset_t stdsigmask;
struct pollfd pollfds_buf[MAX_POLLFDS];
- struct server {
- struct in_addr addr;
- } servers[MAXSERVERS];
+ adns_rr_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 */
/* From general.c: */
+const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n);
+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);
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.
*/