chiark / gitweb /
fix parsing of SRVs
[adns.git] / src / adns.h
index f262d478ce38898a978d5089c519dff818d4f2e8..cd0f463698121f9f8f14e9876e13b96ab4dbcdba 100644 (file)
@@ -75,7 +75,8 @@ extern "C" { /* I really dislike this - iwj. */
 typedef struct adns__state *adns_state;
 typedef struct adns__query *adns_query;
 
-typedef enum {
+typedef enum { /* In general, or together the desired flags: */
+ adns_if_none=        0x0000,/* no flags.  nicer than 0 for some compilers */
  adns_if_noenv=       0x0001,/* do not look at environment */
  adns_if_noerrprint=  0x0002,/* never print to stderr (_debug overrides) */
  adns_if_noserverwarn=0x0004,/* do not warn to stderr about duff servers etc */
@@ -88,7 +89,8 @@ typedef enum {
  adns_if_checkc_freq= 0x0300 /* consistency checks very frequently (slow!) */
 } adns_initflags;
 
-typedef enum {
+typedef enum { /* In general, or together the desired flags: */
+ adns_qf_none=           0x00000000,/* no flags */
  adns_qf_search=         0x00000001,/* use the searchlist */
  adns_qf_usevc=          0x00000002,/* use a virtual circuit (TCP conn) */
  adns_qf_owner=          0x00000004,/* fill in the owner field in the answer */
@@ -103,8 +105,8 @@ typedef enum {
 
 typedef enum {
  adns__rrt_typemask=0x0ffff,
- adns__qtf_deref=   0x10000, /* dereference domains; perhaps get extra data */
- adns__qtf_mail822= 0x20000, /* return mailboxes in RFC822 rcpt field fmt   */
+ adns__qtf_deref=    0x10000,/* dereference domains; perhaps get extra data */
+ adns__qtf_mail822=  0x20000,/* return mailboxes in RFC822 rcpt field fmt   */
                     
  adns_r_none=             0,
                     
@@ -130,6 +132,12 @@ typedef enum {
                     
  adns_r_rp_raw=          17,
  adns_r_rp=                  adns_r_rp_raw|adns__qtf_mail822,
+
+ /* For SRV records, query domain without _qf_quoteok_query must look
+  * as expected from SRV RFC with hostname-like Name.  _With_
+  * _quoteok_query, any query domain is allowed. */
+ adns_r_srv_raw=         33,
+ adns_r_srv=                 adns_r_srv_raw|adns__qtf_deref,
                     
  adns_r_addr=                adns_r_a|adns__qtf_deref
  
@@ -299,6 +307,16 @@ typedef struct {
   unsigned long serial, refresh, retry, expire, minimum;
 } adns_rr_soa;
 
+typedef struct {
+  int priority, weight, port;
+  char *host;
+} adns_rr_srvraw;
+
+typedef struct {
+  int priority, weight, port;
+  adns_rr_hostaddr ha;
+} adns_rr_srvha;
+
 typedef struct {
   adns_status status;
   char *cname; /* always NULL if query was for CNAME records */
@@ -319,6 +337,8 @@ typedef struct {
     adns_rr_inthostaddr *inthostaddr;/* mx */
     adns_rr_intstr *intstr;          /* mx_raw */
     adns_rr_soa *soa;                /* soa, soa_raw */
+    adns_rr_srvraw *srvraw;          /* srv_raw */
+    adns_rr_srvha *srvha;/* srv */
   } rrs;
 } adns_answer;
 
@@ -338,7 +358,8 @@ typedef struct {
  *
  *  For _init, _init_strcfg, _submit and _synchronous, system errors
  *  (eg, failure to create sockets, malloc failure, etc.) return errno
- *  values.
+ *  values.  EINVAL from _init et al means the configuration file
+ *  is erroneous and cannot be parsed.
  * 
  *  For _wait and _check failures are reported in the answer
  *  structure, and only 0, ESRCH or (for _check) EAGAIN is