+#define ADNS_ADDR2TEXT_BUFLEN \
+ (INET6_ADDRSTRLEN + 1/*%*/ \
+ + ((IF_NAMESIZE-1) > 9 ? (IF_NAMESIZE-1) : 9/*uint32*/) \
+ + 1/* nul; included in IF_NAMESIZE */)
+
+int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags,
+ struct sockaddr *sa_r,
+ socklen_t *salen_io /* updated iff OK or ENOSPC */);
+int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags,
+ char *buffer, int *buflen_io /* updated ONLY on ENOSPC */,
+ int *port_r /* may be 0 */);
+ /*
+ * port is always in host byte order and is simply copied to and
+ * from the appropriate sockaddr field (byteswapped as necessary).
+ *
+ * The only flags supported are adns_qf_addrlit_...; others are
+ * ignored.
+ *
+ * Error return values are:
+ *
+ * ENOSPC Output buffer is too small. Can only happen if
+ * *buflen_io < ADNS_ADDR2TEXT_BUFLEN or
+ * *salen_io < sizeof(adns_sockaddr). On return,
+ * *buflen_io or *salen_io has been updated by adns.
+ *
+ * EINVAL text has invalid syntax.
+ *
+ * text represents an address family not supported by
+ * this version of adns.
+ *
+ * Scoped address supplied (text contained "%" or
+ * sin6_scope_id nonzero) but caller specified
+ * adns_qf_addrlit_scope_forbid.
+ *
+ * Scope name (rather than number) supplied in text but
+ * caller specified adns_qf_addrlit_scope_numeric.
+ *
+ * EAFNOSUPPORT sa->sa_family is not supported (addr2text only).
+ *
+ * Only if neither adns_qf_addrlit_scope_forbid nor
+ * adns_qf_addrlit_scope_numeric are set:
+ *
+ * ENOSYS Scope name supplied in text but IPv6 address part of
+ * sockaddr is not a link local address.
+ *
+ * ENXIO Scope name supplied in text but if_nametoindex
+ * said it wasn't a valid local interface name.
+ *
+ * EIO Scoped address supplied but if_nametoindex failed
+ * in an unexpected way; adns has printed a message to
+ * stderr.
+ *
+ * any other if_nametoindex failed in a more-or-less expected way.
+ */