Also: try ./addrtext_s 12345 - getaddrinfo likes it
[adns] / src / adns.h
index 6a19024..78b7832 100644 (file)
@@ -104,7 +104,18 @@ typedef enum { /* In general, or together the desired flags: */
  adns_if_eintr=       0x0020,/* allow _wait and _synchronous to return EINTR */
  adns_if_nosigpipe=   0x0040,/* applic has SIGPIPE ignored, do not protect */
  adns_if_checkc_entex=0x0100,/* consistency checks on entry/exit to adns fns */
- adns_if_checkc_freq= 0x0300 /* consistency checks very frequently (slow!) */
+ adns_if_checkc_freq= 0x0300,/* consistency checks very frequently (slow!) */
+
+ adns_if_af_v4only=   0x0400,/* only return IPv4 addresses, given the choice */
+ adns_if_af_v6only=   0x0800,/* only return IPv6 addresses, ... */
+ adns_if_afmask=      adns_if_af_v4only|adns_if_af_v6only
+   /* Only set one of these.  They are policy flags, and overridden by the
+    * adns_af:... options in resolv.conf.  If the adns_qf_ipv... query
+    * flags are incompatible with these settings (in the sense that no
+    * address families are permitted at all) then the query flags take
+    * precedence; otherwise only records which satisfy all of the stated
+    * requirements are allowed.
+    */
 } adns_initflags;
 
 typedef enum { /* In general, or together the desired flags: */
@@ -119,10 +130,11 @@ typedef enum { /* In general, or together the desired flags: */
  adns_qf_cname_loose=    0x00000100,/* allow refs to CNAMEs - without, get _s_cname */
  adns_qf_cname_forbid=   0x00000200,/* don't follow CNAMEs, instead give _s_cname */
  adns_qf_ipv4_only=     0x00000400,/* only ever return IPv4 addresses */
- adns_qf_ipv6_ok=       0x00000800,/* returning IPv6 addresses is acceptable */
- adns_qf_ipv6_mapv4=    0x00001800,/*  ... and IPv4 addresses should be v6-mapped */
- adns_qf_ipv6_only=     0x00002800,/*  ... and don't bother looking for IPv4 */
- adns__qf_afmask=       0x00003800,/* all the above flag bits */
+ adns_qf_ipv6_only=     0x00000800,/*  ... and don't bother looking for IPv4 */
+ adns_qf_ipv6_ok=       0x00000c00,/* returning IPv6 addresses is acceptable */
+ adns_qf_domapv4=       0x00001000,/*  ... any IPv4 addresses should be v6-mapped */
+ adns_qf_ipv6_mapv4=    adns_qf_ipv6_ok|adns_qf_domapv4,
+ adns__qf_afmask=       0x00001c00,/* all the above flag bits */
  adns__qf_internalmask=  0x0ff00000
 } adns_queryflags;
 
@@ -554,6 +566,17 @@ int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
  *   Changes the consistency checking frequency; this overrides the
  *   setting of adns_if_check_entex, adns_if_check_freq, or neither,
  *   in the flags passed to adns_init.
+ *
+ *  adns_af:v4only
+ *  adns_af:v6only
+ *  adns_af:any
+ *   Controls whether ADNS looks for IPv4 (A records) and IPv6 (AAAA
+ *   records) addresses when it's trying to build a socket address.
+ *   The default is `any' which means to allow both.  The `sortlist'
+ *   directive can be used to control the relative preference of IPv4
+ *   and IPv6 addresses if both are returned for the same query.
+ *   These override the corresponding init flags (covered by
+ *   adns_if_afmask).
  * 
  * There are a number of environment variables which can modify the
  * behaviour of adns.  They take effect only if adns_init is used, and
@@ -659,6 +682,27 @@ void adns_finish(adns_state ads);
  * they will be cancelled.
  */
 
+#define ADNS_ADDR2TEXT_BUFLEN (INET6_ADDRSTRLEN +1/*%*/ +9/*uint32*/ +1/*nul*/)
+
+int adns_text2addr(const char *addr, uint16_t port, struct sockaddr *sa,
+                  socklen_t *salen /* set if OK or ENOSPC; otherwise undef */);
+int adns_addr2text(const struct sockaddr *sa,
+                  char *addr_buffer, int *addr_buflen /* set iff ENOSPC */,
+                  int *port_r /* may be 0 */);
+  /* These DO NOT return an adns_status.  Instead, 0 on success,
+   * or an errno value on failure.  Error values are:
+   *   EAFNOSUPPORT addr2text only
+   *   EINVAL       text2addr only: addr has invalid syntax
+   *   ENOSPC       only if *buflen < _BUFLEN or *salen < sizeof(adns_sockaddr)
+   * Extra errors are possible from text2addr if addr specifies a scope
+   * name suffix (ie, it has a "%" and the scope suffix is not numeric):
+   *   ENOSYS       address is not link local
+   *   ENXIO        if_nametoindex said it wasn't a valid name
+   *   EIO          if_nametoindex went crazy (adns prints a message to stderr)
+   *   any other    if_nametoindex failed
+   * port is always in host byte order and is simply copied to and
+   * from the appropriate sockaddr field (byteswapped as necessary).
+   */
 
 void adns_forallqueries_begin(adns_state ads);
 adns_query adns_forallqueries_next(adns_state ads, void **context_r);