WIP before no debug log
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 26 May 2014 13:48:10 +0000 (14:48 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 26 May 2014 13:48:10 +0000 (14:48 +0100)
src/addrfam.c
src/adns.h
src/general.c

index af14e67..3ae14c4 100644 (file)
@@ -198,6 +198,103 @@ const void *adns__sockaddr_to_inaddr(const struct sockaddr *sa)
 }
 
 /*
+ * addr2text and text2addr
+ */
+
+int adns__addr2text(adns_state ads /* 0 ok */, adns_query qu /* 0 ok */,
+                  const struct sockaddr *sa,
+                  char *addr_buffer, int *addr_buflen,
+                  int *port_r) {
+  void *src;
+  int port;
+
+  if (*addr_buflen < ADNS_ADDR2TEXT_BUFLEN) {
+    *addr_buflen = ADNS_ADDR2TEXT_BUFLEN;
+    return ENOSPC;
+  }
+
+  switch (sa->sa_family) {
+    AF_CASES(af);
+    af_inet:  src= &CSIN(sa)->sin_addr;    port= SIN(sa)->sin_port;    break;
+    af_inet6: src= &CSIN6(sa)->sin6_addr;  port= SIN6(sa)->sin6_port;  break;
+    default: return EAFNOSUPPORT;
+  }
+
+  const char *ok= inet_ntop(sa->sa_family, src, addr_buffer, *addr_buflen);
+  assert(ok);
+
+  if (sa->sa_family == AF_INET6) {
+    uint32_t scope = CSIN6(sa)->sin6_scope_id;
+    if (scope) {
+      scope = ntohl(scope);
+      int scopeoffset = strlen(addr_buffer);
+      int remain = *addr_buflen - scopeoffset,
+      int r = snprintf(addr_buffer + scopeoffset, remain,
+                      "%%%"PRIu32"", scope);
+      assert(r < *addr_buflen - scopeoffset);
+      adns__debug(ads,-1,qu, "addr2text: converted scoped address %s",
+                 addr_buffer);
+    }
+  }
+
+  if (port_r) *port_r= ntohs(port);
+  return 0;
+}
+
+int adns_addr2text(adns_state ads,
+                  const struct sockaddr *sa,
+                  char *addr_buffer, int *addr_buflen /* set iff ENOSPC */,
+                  int *port_r) {
+  return adns__addr2text(ads,0, sa,addr_buffer,addr_buflen,port_r);
+}
+
+static void text2addr_einval(adns_state ads, adns_query qu,
+                            const char *addr, const char *problem) {
+  if (!ads)
+  char dumpbuf[ADNS_ADDR2TEXT_BUFLEN * 4];
+  
+}
+
+int adns__text2addr(adns_state ads /* 0 ok */, adns_query qu /* 0 ok */,
+                  const char *addr, uint16_t port, struct sockaddr *sa,
+                  socklen_t *salen /* set if OK or ENOSPC */) {
+  int af;
+  char copybuf[INET6_ADDRSTRLEN];
+  char *parse;
+
+  if (strchr(addr, ":")) {
+
+    af= AF_INET6;
+
+    const char *percent= strchr(addr, "%");
+    if (percent) {
+      ptrdiff_t lhslen = percent - addr;
+      if (lhslen >= INET6_ADDRSTRLEN) {
+       adns__debug(ads,-1,qu, "text2addr: scoped addr lhs too long
+       return EINVAL;
+      }
+      memcpy(copy
+
+int adns_text2addr(adns_state ads /* may be 0!  used for debug log only */,
+                  const char *addr, int port, struct sockaddr *sa,
+                  socklen_t *salen /* set if OK or ENOSPC */);
+
+
+
+  assert(*addr_buflen > INET_ADDRSTRLEN && *addr_buflen > INET6_ADDRSTRLEN);
+  switch (sa->sa_family) {
+    AF_CASES(af);
+    af_inet:  dst= &CSIN(sa)->sin_addr;    port= CSIN(sa)->sin_port;    break;
+    af_inet6: dst= &CSIN6(sa)->sin6_addr;  port= CSIN6(sa)->sin6_port;  break;
+    default: return EAFNOSUPPORT;
+  }
+
+  inet_pton(sa->sa_family, 
+      const struct sockaddr *sin = 
+      
+    
+
+/*
  * Reverse-domain parsing and construction.
  */
 
index e5063b7..63a46e8 100644 (file)
@@ -682,6 +682,24 @@ void adns_finish(adns_state ads);
  * they will be cancelled.
  */
 
+#define ADNS_ADDR2TEXT_BUFLEN (INET6_ADDRSTRLEN +1/*%*/ +9/*uint32*/ +1/*nul*/)
+
+int adns_addr2text(adns_state ads /* may be 0!  used for debug log only */,
+                  const struct sockaddr *sa, socklen_t salen,
+                  char *addr_buffer, int *addr_buflen /* set iff ENOSPC */,
+                  int *port_r);
+int adns_text2addr(adns_state ads /* may be 0!  used for debug log only */,
+                  const char *addr, int port, struct sockaddr *sa,
+                  socklen_t *salen /* set if OK or ENOSPC */);
+  /* These DO NOT return an adns_status.  Instead, 0 on success,
+   * or an errno value on failure.  Error values are:
+   *   EAFNOSUPPORT addr2text only
+   *   EINVAL       addr has invalid syntax
+   *   ENOSPC       only if *buflen < _BUFLEN or *salen < sizeof(adns_sockaddr)
+   *   ENXIO        addr specifies a scope name and 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);
index 7703254..92da47d 100644 (file)
@@ -64,7 +64,8 @@ void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
   const char *bef, *aft;
   vbuf vb;
   
-  if (!ads->logfn ||
+  if (!ads ||
+      !ads->logfn ||
       (!(ads->iflags & adns_if_debug)
        && (!prevent || (ads->iflags & prevent))))
     return;