chiark / gitweb /
Reads some config file directives; simple test program created.
[adns.git] / src / adns.h
index 61b3fc8138d3c33fa2bc096420d3896c811d8a4d..fd4c8ee2194440dcbe5e6953c2304648fe06289a 100644 (file)
@@ -3,8 +3,11 @@
 #ifndef ADNS_H_INCLUDED
 #define ADNS_H_INCLUDED
 
-typedef struct adns__state adns_state;
-typedef struct adns__query adns_query;
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+typedef struct adns__state *adns_state;
+typedef struct adns__query *adns_query;
 
 typedef enum {
   adns_if_noenv=      0x0001, /* do not look at environment */
@@ -15,30 +18,45 @@ typedef enum {
 typedef enum {
   adns_f_search=     0x0001, /* use the searchlist */
   adns_f_usevc=      0x0002, /* use a virtual circuit (TCP connection) */
+  adns_f_anyquote=   0x0004,
 } adns_queryflags;
 
 typedef enum {
-  adns_rrttype_mask=  0x0fff,
-  adns_qtf_deref=     0x1000,
-  adns_qtf_mailconv=  0x2000,
-  adns_r_none=             0,
-  adns_r_a=                1,
-  adns_r_ns_raw=           2,
-  adns_r_ns=                  adns_r_ns_raw|adns_qtf_deref,
-  adns_r_cname=            5,
-  adns_r_soa_raw=          6,
-  adns_r_soa=                 adns_r_soa_raw|adns_qtf_mailconv,
-  adns_r_null=            10,
-  adns_r_ptr_raw=         12,
-  adns_r_ptr=                 adns_r_ptr_raw|adns_rf_deref,
-  adns_r_hinfo=           13,  
-  adns_r_mx_raw=          15,
-  adns_r_mx=                  adns_r_mx_raw|adns_qtf_deref,
-  adns_r_txt=             16,
-  adns_r_rp_raw           17,
-  adns_r_rp=                  adns_r_rp_raw|adns_qtf_mailconv
+  adns__rrttype_mask=  0x0fff,
+  adns__qtf_deref=     0x1000, /* dereference domains and produce extra data */
+  adns__qtf_mailconv=  0x2000, /* put @ between first and second labels */
+  adns_r_none=              0,
+  adns_r_a=                 1,
+  adns_r_ns_raw=            2,
+  adns_r_ns=                   adns_r_ns_raw|adns__qtf_deref,
+  adns_r_cname=             5,
+  adns_r_soa_raw=           6,
+  adns_r_soa=                  adns_r_soa_raw|adns__qtf_mailconv,
+  adns_r_null=             10,
+  adns_r_ptr_raw=          12,
+  adns_r_ptr=                  adns_r_ptr_raw|adns__qtf_deref,
+  adns_r_hinfo=            13,  
+  adns_r_mx_raw=           15,
+  adns_r_mx=                   adns_r_mx_raw|adns__qtf_deref,
+  adns_r_txt=              16,
+  adns_r_rp_raw=           17,
+  adns_r_rp=                   adns_r_rp_raw|adns__qtf_mailconv
 } adns_rrtype;
 
+/* In queries without qtf_anyquote, 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
+ * interior of a " delimited string, except that " may appear in it,
+ * and on output, the char* is a pointer to a string which would be
+ * legal either inside or outside " delimiters, and any characters
+ * not usually legal in domain names will be quoted as \X
+ * (if the character is 33-126 except \ and ") or \DDD.
+ *
+ * Do not ask for records containing mailboxes without
+ * specifying qtf_mailconv or qtf_anyquote.
+ */
+
 typedef enum {
   adns_s_ok,
   adns_s_notresponding,
@@ -54,7 +72,8 @@ typedef enum {
 /* In dereferenced answers, multiple addresses show up as multiple
  * answers with all the dm pointers being the same.  If no
  * address is available (permanent failure) then INADDR_NONE is
- * used. */
+ * used.
+ */
 
 struct adns_answer {
   adns_status status;
@@ -98,7 +117,7 @@ struct adns_answer {
  *  ands_query, _wait and _answer set *answer to 0.
  */
 
-int adns_init(adns_state *newstate_r);
+int adns_init(adns_state *newstate_r, adns_initflags flags);
 
 int adns_synchronous(adns_state ads,
                     const char *owner,
@@ -111,9 +130,9 @@ int adns_submit(adns_state ads,
                adns_rrtype type,
                int flags,
                void *context,
-               const struct adns_query *query_r);
+               adns_query *query_r);
 
-int adns_query(adns_state ads,
+int adns_check(adns_state ads,
               adns_query *query_io,
               struct adns_answer *answer,
               void *context_r);
@@ -121,18 +140,29 @@ int adns_query(adns_state ads,
 int adns_wait(adns_state ads,
              adns_query *query_io,
              struct adns_answer *answer,
-              void *context_r);
+             void *context_r);
 
 int adns_cancel(adns_state ads, adns_query query);
 
 int adns_finish(adns_state);
 
-void adns_event(adns_state, fd_set *readfds_mod,
-               fd_set *writefds_mod, fd_set *exceptfds_mod,
-               int *maxfd_mod, struct timeval *tv_mod);
-/* You may call this with *_mod=0 to have a simple callback,
-   or with *fds_mod=*maxfd_mod=0 but tv_mod!=0 if you are
-   not going to sleep, or with all !=0 if you are going to sleep. */
+void adns_interest(adns_state, fd_set *readfds_mod,
+                  fd_set *writefds_mod, fd_set *exceptfds_mod,
+                  int *maxfd_mod, struct timeval **tv_mod, struct timeval *tv_buf);
+/* You may call this with *_mod=0 to allow adns to have flow-of-control
+ * briefly, or with *fds_mod=*maxfd_mod=0 but tv_mod!=0 if you are
+ * not going to sleep, or with all !=0 if you are going to sleep.
+ * If tv_mod!=0 and *tv_mod=0 then tv_buf must be !0 and *tv_buf is irrelevant
+ * and may be overwritten (and *tv_mod set to tv_buf); otherwise tv_buf is ignored.
+ */
+
+int adns_callback(adns_state, fd_set readfds, fd_set writefds,
+                 fd_set exceptfds, int maxfd);
+/* For select-driven programs, this allows adns to know which fd's are relevant,
+ * so that it doesn't need to make syscalls on others of its fd's.  It's a kind
+ * of limited flow-of-control allowance.  It will return how many adns fd's were
+ * in the set, so you can tell if your select handling code is missing things.
+ */
 
 /* Example expected/legal calling sequences:
  *  adns_init
@@ -140,7 +170,7 @@ void adns_event(adns_state, fd_set *readfds_mod,
  *  adns_submit 2
  *  adns_submit 3
  *  adns_wait 1
- *  adns_query 3 -> EWOULDBLOCK
+ *  adns_check 3 -> EWOULDBLOCK
  *  adns_wait 2
  *  adns_wait 3
  *  ....
@@ -149,7 +179,7 @@ void adns_event(adns_state, fd_set *readfds_mod,
  *  adns_init
  *  adns_submit ...
  *  loop {
- *   adns_query
+ *   adns_check
  *   adns_interest
  *   select
  *   adns_callback