chiark / gitweb /
We do do searchlist now - remove fixme.
[adns.git] / src / adns.h
index 938fb18fcbd7d21bcf9b4ad09cb3ab4f7726b82d..400ba9f466b68a26bc303475be1c1d738cf6392d 100644 (file)
@@ -1,11 +1,9 @@
 /*
- * Copyright (C)1998 Ian Jackson.
- * This version provided for review and comment only.
- *
- * $Id$
+ * adns.h
+ * - adns user-visible API (single-threaded, without any locking)
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson
+ *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
  *  
  *  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
@@ -19,7 +17,9 @@
  *  
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software Foundation,
- *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *  $Id$
  */
 
 #ifndef ADNS_H_INCLUDED
@@ -30,6 +30,8 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 
+/* All struct in_addr anywhere in adns are in NETWORK byte order. */
+
 typedef struct adns__state *adns_state;
 typedef struct adns__query *adns_query;
 
@@ -40,11 +42,13 @@ typedef enum {
   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_if_nosigpipe=    0x0040, /* applic has SIGPIPE set to SIG_IGN, do not protect */
 } adns_initflags;
 
 typedef enum {
   adns_qf_search=          0x000001, /* use the searchlist */
   adns_qf_usevc=           0x000002, /* use a virtual circuit (TCP connection) */
+  adns_qf_owner=           0x000004, /* fill in the owner field in the answer */
   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 */
@@ -87,7 +91,7 @@ typedef enum {
   
 } adns_rrtype;
 
-/* In queries without qtf_anyquote, all domains must have standard
+/* In queries without qtf_quoteok_*, all domains must have standard
  * legal syntax.  In queries _with_ qtf_anyquote, domains in the query
  * or response may contain any characters, quoted according to
  * RFC1035 5.1.  On input to adns, the char* is a pointer to the
@@ -102,29 +106,48 @@ typedef enum {
  */
 
 typedef enum {
-  /* fixme: think about error codes */
   adns_s_ok,
+
+  /* locally induced errors */
+  adns_s_nomemory,
+  adns_s_unknownrrtype,
+  
+  /* remotely induced errors, detected locally */
   adns_s_timeout,
-  adns_s_nolocalmem,
   adns_s_allservfail,
-  adns_s_servfail,
-  adns_s_notimplemented,
-  adns_s_refused,
-  adns_s_reasonunknown,
   adns_s_norecurse,
-  adns_s_serverfaulty,
-  adns_s_unknownreply,
-  adns_s_invaliddata,
+  adns_s_invalidresponse,
+  adns_s_unknownformat,
+  
+  /* remotely induced errors, reported by remote server to us */
+  adns_s_rcodeservfail,
+  adns_s_rcodeformaterror,
+  adns_s_rcodenotimplemented,
+  adns_s_rcoderefused,
+  adns_s_rcodeunknown,
+  
   adns_s_max_tempfail= 99,
-  adns_s_inconsistent, /* PTR gives domain whose A does not match */
-  adns_s_cname, /* CNAME found where data eg A expected (not if _qf_loosecname) */
-  adns_s_invalidanswerdomain,
-  /* fixme: implement _s_cname */
-  adns_s_max_remotemisconfig= 199,
+
+  /* remote configuration errors */
+  adns_s_inconsistent, /* PTR gives domain whose A does not exist and match */
+  adns_s_prohibitedcname, /* CNAME found where eg A expected (not if _qf_loosecname) */
+  adns_s_answerdomaininvalid,
+  adns_s_answerdomaintoolong,
+  adns_s_invaliddata,
+  
+  adns_s_max_misconfig= 199,
+
+  /* permanent problems with the query */
+  adns_s_querydomainwrong,
+  adns_s_querydomaininvalid,
+  adns_s_querydomaintoolong,
+  
+  adns_s_max_misquery= 299,
+
+  /* permanent errors */
   adns_s_nxdomain,
   adns_s_nodata,
-  adns_s_invalidquerydomain,
-  adns_s_domaintoolong,
+  
 } adns_status;
 
 typedef struct {
@@ -133,17 +156,17 @@ typedef struct {
     struct sockaddr sa;
     struct sockaddr_in inet;
   } addr;
-} adns_addr;
+} adns_rr_addr;
 
 typedef struct {
   char *host;
   adns_status astatus;
   int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0 */
-  adns_addr *addrs;
+  adns_rr_addr *addrs;
 } adns_rr_hostaddr;
 
 typedef struct {
-  char *a, *b;
+  char *(array[2]);
 } adns_rr_strpair;
 
 typedef struct {
@@ -162,24 +185,31 @@ typedef struct {
 } adns_rr_intstr;
 
 typedef struct {
-  char *ns0, *rp;
+  adns_rr_intstr array[2];
+} adns_rr_intstrpair;
+
+typedef struct {
+  char *mname, *rname;
   unsigned long serial, refresh, retry, expire, minimum;
 } adns_rr_soa;
 
 typedef struct {
   adns_status status;
   char *cname; /* always NULL if query was for CNAME records */
+  char *owner; /* only set if requested in query flags */
   adns_rrtype type; /* guaranteed to be same as in query */
+  time_t expires; /* expiry time, defined only if _s_ok, nxdomain or nodata. NOT TTL! */
   int nrrs, rrsz;
   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) */
-    adns_addr *addr;                  /* addr */
+    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_intstrpair *intstrpair;   /* hinfo */
+    adns_rr_strpair *strpair;         /* rp, rp_raw */
     adns_rr_inthostaddr *inthostaddr; /* mx */
     adns_rr_intstr *intstr;           /* mx_raw */
     adns_rr_soa *soa;                 /* soa, soa_raw */
@@ -209,8 +239,11 @@ 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_init(adns_state *newstate_r, adns_initflags flags,
+             FILE *diagfile /*0=>stderr*/);
+
+int adns_init_strcfg(adns_state *newstate_r, adns_initflags flags,
+                    FILE *diagfile /*0=>discard*/, const char *configtext);
 
 int adns_synchronous(adns_state ads,
                     const char *owner,
@@ -242,7 +275,7 @@ int adns_wait(adns_state ads,
 
 void adns_cancel(adns_query query);
 
-int adns_finish(adns_state);
+void adns_finish(adns_state);
 /* You may call this even if you have queries outstanding;
  * they will be cancelled.
  */
@@ -316,7 +349,7 @@ adns_status adns_rr_info(adns_rrtype type,
  *
  * Usually this routine will succeed.  Possible errors include:
  *  adns_s_nomemory
- *  adns_s_notimplemented (RR type not known)
+ *  adns_s_rrtypeunknown
  *  adns_s_invaliddata (*datap contained garbage)
  * If an error occurs then no memory has been allocated,
  * and *rrtname_r, *fmtname_r, *len_r and *data_r are undefined.