chiark / gitweb /
Does further A lookups and uses answers.
[adns.git] / src / adns.h
index d5cddecf98a450d906a2f89473785e50cfe3237f..a87767a98be468d9c6c8110420b95bd1675a1a48 100644 (file)
@@ -39,14 +39,18 @@ typedef enum {
   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 {
@@ -78,6 +82,8 @@ 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;
 
@@ -122,11 +128,19 @@ typedef enum {
 } adns_status;
 
 typedef struct {
-  char *dm;
+  int len;
+  union {
+    struct sockaddr sa;
+    struct sockaddr_in inet;
+  } addr;
+} adns_rr_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_rr_addr *addrs;
+} adns_rr_hostaddr;
 
 typedef struct {
   char *a, *b;
@@ -134,8 +148,8 @@ typedef struct {
 
 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,
@@ -160,14 +174,15 @@ typedef struct {
   union {
     void *untyped;
     unsigned char *bytes;
-    char *(*str);                  /* ns_raw, cname, ptr, ptr_raw */
-    adns_rr_intstr *(*manyistr);   /* txt (list of strings ends with i=-1, str=0) */
-    struct in_addr *inaddr;        /* a */
-    adns_rr_dmaddr *dmaddr;        /* ns */
-    adns_rr_strpair *strpair;      /* hinfo ??fixme, 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_rr_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;
 
@@ -194,6 +209,7 @@ typedef struct {
  *  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,
@@ -201,7 +217,6 @@ 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
@@ -224,7 +239,6 @@ int adns_wait(adns_state ads,
              adns_query *query_io,
              adns_answer **answer_r,
              void **context_r);
-/* Might return EINTR - if so, try again */
 
 void adns_cancel(adns_query query);