* Copyright (C)1998 Ian Jackson.
* This version provided for review and comment only.
*
- * $Id: adns.h,v 1.26 1998/11/10 02:43:02 ian Exp $
+ * $Id: adns.h,v 1.32 1998/11/15 19:11:59 ian Exp $
*/
/*
* This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson
adns_if_noserverwarn= 0x0004, /* do not warn to stderr about duff nameservers etc */
adns_if_debug= 0x0008, /* enable all output to stderr plus debug msgs */
adns_if_noautosys= 0x0010, /* do not make syscalls at every opportunity */
+ adns_if_eintr= 0x0020, /* allow _wait and _synchronous to return EINTR */
} adns_initflags;
typedef enum {
- adns_qf_search= 0x0001, /* use the searchlist */
- adns_qf_usevc= 0x0002, /* use a virtual circuit (TCP connection) */
- adns_qf_anyquote= 0x0004,
- adns_qf_loosecname= 0x0008, /* allow refs to CNAMEs - without, get _s_cname */
- adns_qf_nocname= 0x0010, /* don't follow CNAMEs, instead give _s_cname */
+ adns_qf_search= 0x000001, /* use the searchlist */
+ adns_qf_usevc= 0x000002, /* use a virtual circuit (TCP connection) */
+ adns_qf_quoteok_query= 0x000010, /* allow quote-requiring chars in query domain */
+ adns_qf_quoteok_cname= 0x000020, /* allow ... in CNAME we go via */
+ adns_qf_quoteok_anshost= 0x000040, /* allow ... in answers expected to be hostnames */
+ adns_qf_cname_loose= 0x000100, /* allow refs to CNAMEs - without, get _s_cname */
+ adns_qf_cname_forbid= 0x000200, /* don't follow CNAMEs, instead give _s_cname */
+ adns__qf_internalmask= 0x0ff000
} adns_queryflags;
typedef enum {
adns_r_rp_raw= 17,
adns_r_rp= adns_r_rp_raw|adns__qtf_mail822,
+
+ adns_r_addr= adns_r_a|adns__qtf_deref
} adns_rrtype;
*/
typedef enum {
+ /* fixme: think about error codes */
adns_s_ok,
adns_s_timeout,
adns_s_nolocalmem,
} adns_status;
typedef struct {
- char *dm;
+ int len;
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in inet;
+ } addr;
+} adns_addr;
+
+typedef struct {
+ char *host;
adns_status astatus;
int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0 */
- struct in_addr *addrs;
-} adns_rr_dmaddr;
+ adns_addr *addrs;
+} adns_rr_hostaddr;
typedef struct {
char *a, *b;
typedef struct {
int i;
- adns_rr_dmaddr dmaddr;
-} adns_rr_intdmaddr;
+ adns_rr_hostaddr ha;
+} adns_rr_inthostaddr;
typedef struct {
+ /* Used both for mx_raw, in which case i is the preference and str the domain,
+ * and for txt, in which case each entry has i for the `text' length,
+ * and str for the data (which will have had an extra nul appended
+ * so that if it was plain text it is now a null-terminated string).
+ */
int i;
char *str;
} adns_rr_intstr;
union {
void *untyped;
unsigned char *bytes;
- char *(*str); /* ns_raw, cname, ptr, ptr_raw */
- char *(**manystr); /* txt (list is null-terminated) */
- struct in_addr *inaddr; /* a */
- adns_rr_dmaddr *dmaddr; /* ns */
- adns_rr_strpair *strpair; /* hinfo, rp, rp_raw */
- adns_rr_intdmaddr *intdmaddr; /* mx */
- adns_rr_intstr *intstr; /* mx_raw */
- adns_rr_soa *soa; /* soa, soa_raw */
+ char *(*str); /* ns_raw, cname, ptr, ptr_raw */
+ adns_rr_intstr *(*manyistr); /* txt (list of strings ends with i=-1, str=0) */
+ adns_addr *addr; /* addr */
+ struct in_addr *inaddr; /* a */
+ adns_rr_hostaddr *hostaddr; /* ns */
+ adns_rr_strpair *strpair; /* hinfo ??fixme, rp, rp_raw */
+ adns_rr_inthostaddr *inthostaddr; /* mx */
+ adns_rr_intstr *intstr; /* mx_raw */
+ adns_rr_soa *soa; /* soa, soa_raw */
} rrs;
} adns_answer;
* If no (appropriate) requests are outstanding adns_query and adns_wait return ESRCH;
*/
+/* fixme: separate parsing from instantiation */
int adns_init(adns_state *newstate_r, adns_initflags flags, FILE *diagfile/*0=>stderr*/);
int adns_synchronous(adns_state ads,
adns_rrtype type,
adns_queryflags flags,
adns_answer **answer_r);
-/* Will not return EINTR. */
/* NB: if you set adns_if_noautosys then _submit and _check do not
* make any system calls; you must use adns_callback (possibly after
adns_query *query_io,
adns_answer **answer_r,
void **context_r);
-/* Might return EINTR - if so, try again */
void adns_cancel(adns_query query);