[or-cvs] r17790: {tor} Refactor tor_addr_t manipulation functions so that as few as (tor/trunk/src/common)

nickm at seul.org nickm at seul.org
Fri Dec 26 21:26:05 UTC 2008


Author: nickm
Date: 2008-12-26 16:26:05 -0500 (Fri, 26 Dec 2008)
New Revision: 17790

Modified:
   tor/trunk/src/common/address.c
   tor/trunk/src/common/address.h
Log:
Refactor tor_addr_t manipulation functions so that as few as possible look at the tor_addr_t representation.

Modified: tor/trunk/src/common/address.c
===================================================================
--- tor/trunk/src/common/address.c	2008-12-26 21:26:03 UTC (rev 17789)
+++ tor/trunk/src/common/address.c	2008-12-26 21:26:05 UTC (rev 17790)
@@ -62,7 +62,8 @@
                      struct sockaddr *sa_out,
                      socklen_t len)
 {
-  if (a->family == AF_INET) {
+  sa_family_t family = tor_addr_family(a);
+  if (family == AF_INET) {
     struct sockaddr_in *sin;
     if (len < (int)sizeof(struct sockaddr_in))
       return -1;
@@ -71,7 +72,7 @@
     sin->sin_port = htons(port);
     sin->sin_addr.s_addr = tor_addr_to_ipv4n(a);
     return sizeof(struct sockaddr_in);
-  } else if (a->family == AF_INET6) {
+  } else if (family == AF_INET6) {
     struct sockaddr_in6 *sin6;
     if (len < (int)sizeof(struct sockaddr_in6))
       return -1;
@@ -79,7 +80,7 @@
     memset(sin6, 0, sizeof(struct sockaddr_in6));
     sin6->sin6_family = AF_INET6;
     sin6->sin6_port = htons(port);
-    memcpy(&sin6->sin6_addr, &a->addr.in6_addr, sizeof(struct in6_addr));
+    memcpy(&sin6->sin6_addr, tor_addr_to_in6(a), sizeof(struct in6_addr));
     return sizeof(struct sockaddr_in6);
   } else {
     return -1;
@@ -94,21 +95,18 @@
 {
   tor_assert(a);
   tor_assert(sa);
-  memset(a, 0, sizeof(tor_addr_t));
   if (sa->sa_family == AF_INET) {
     struct sockaddr_in *sin = (struct sockaddr_in *) sa;
-    a->family = AF_INET;
-    a->addr.in_addr.s_addr = sin->sin_addr.s_addr;
+    tor_addr_from_ipv4n(a, sin->sin_addr.s_addr);
     if (port_out)
       *port_out = ntohs(sin->sin_port);
   } else if (sa->sa_family == AF_INET6) {
     struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
-    a->family = AF_INET6;
-    memcpy(&a->addr.in6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
+    tor_addr_from_in6(a, &sin6->sin6_addr);
     if (port_out)
       *port_out = ntohs(sin6->sin6_port);
   } else {
-    a->family = AF_UNSPEC;
+    tor_addr_make_unspec(a);
     return -1;
   }
   return 0;
@@ -142,7 +140,6 @@
   tor_assert(name);
   tor_assert(addr);
   tor_assert(family == AF_INET || family == AF_INET6 || family == AF_UNSPEC);
-  memset(addr, 0, sizeof(addr)); /* Clear the extraneous fields. */
   if (!*name) {
     /* Empty address is an error. */
     return -1;
@@ -150,14 +147,12 @@
     /* It's an IPv4 IP. */
     if (family == AF_INET6)
       return -1;
-    addr->family = AF_INET;
-    memcpy(&addr->addr.in_addr, &iaddr, sizeof(struct in_addr));
+    tor_addr_from_in(addr, &iaddr);
     return 0;
   } else if (tor_inet_pton(AF_INET6, name, &iaddr6)) {
     if (family == AF_INET)
       return -1;
-    addr->family = AF_INET6;
-    memcpy(&addr->addr.in6_addr, &iaddr6, sizeof(struct in6_addr));
+    tor_addr_from_in6(addr, &iaddr6);
     return 0;
   } else {
 #ifdef HAVE_GETADDRINFO
@@ -188,16 +183,12 @@
       if (!best)
         best = res;
       if (best->ai_family == AF_INET) {
-        addr->family = AF_INET;
-        memcpy(&addr->addr.in_addr,
-               &((struct sockaddr_in*)best->ai_addr)->sin_addr,
-               sizeof(struct in_addr));
+        tor_addr_from_in(addr,
+                         &((struct sockaddr_in*)best->ai_addr)->sin_addr);
         result = 0;
       } else if (best->ai_family == AF_INET6) {
-        addr->family = AF_INET6;
-        memcpy(&addr->addr.in6_addr,
-               &((struct sockaddr_in6*)best->ai_addr)->sin6_addr,
-               sizeof(struct in6_addr));
+        tor_addr_from_in6(addr,
+                          &((struct sockaddr_in6*)best->ai_addr)->sin6_addr);
         result = 0;
       }
       freeaddrinfo(res);
@@ -231,11 +222,10 @@
 #endif
 #endif /* endif HAVE_GETHOSTBYNAME_R_6_ARG. */
     if (ent) {
-      addr->family = ent->h_addrtype;
       if (ent->h_addrtype == AF_INET) {
-        memcpy(&addr->addr.in_addr, ent->h_addr, sizeof(struct in_addr));
+        tor_addr_from_in(addr, (struct in_addr*) ent->h_addr);
       } else if (ent->h_addrtype == AF_INET6) {
-        memcpy(&addr->addr.in6_addr, ent->h_addr, sizeof(struct in6_addr));
+        tor_addr_from_in(addr, (struct in6_addr*) ent->h_addr);
       } else {
         tor_assert(0); /* gethostbyname() returned a bizarre addrtype */
       }
@@ -383,9 +373,7 @@
                      |((inaddr.s_addr & 0xff000000ul) >> 24));
 
     if (result) {
-      memset(result, 0, sizeof(tor_addr_t));
-      result->family = AF_INET;
-      result->addr.in_addr.s_addr = inaddr.s_addr;
+      tor_addr_from_in(result, &inaddr);
     }
     return 1;
   }
@@ -421,8 +409,7 @@
       return -1;
 
     if (result) {
-      result->family = AF_INET6;
-      memcpy(&result->addr.in6_addr, &in6, sizeof(in6));
+      tor_addr_from_in6(result, &in6);
     }
     return 1;
   }
@@ -462,10 +449,11 @@
   } else if (addr->family == AF_INET6) {
     int i;
     char *cp = out;
+    const uint8_t *bytes = tor_addr_to_in6_addr8(addr);
     if (outlen < REVERSE_LOOKUP_NAME_BUF_LEN)
       return -1;
     for (i = 15; i >= 0; --i) {
-      uint8_t byte = addr->addr.in6_addr.s6_addr[i];
+      uint8_t byte = bytes[i];
       *cp++ = "0123456789abcdef"[byte & 0x0f];
       *cp++ = '.';
       *cp++ = "0123456789abcdef"[byte >> 4];
@@ -506,6 +494,9 @@
   char *base = NULL, *address, *mask = NULL, *port = NULL, *rbracket = NULL;
   char *endptr;
   int any_flag=0, v4map=0;
+  sa_family_t family;
+  struct in6_addr in6_tmp;
+  struct in_addr in_tmp;
 
   tor_assert(s);
   tor_assert(addr_out);
@@ -552,12 +543,14 @@
   memset(addr_out, 0, sizeof(tor_addr_t));
 
   if (!strcmp(address, "*")) {
-    addr_out->family = AF_INET; /* AF_UNSPEC ???? XXXX_IP6 */
+    family = AF_INET; /* AF_UNSPEC ???? XXXX_IP6 */
     any_flag = 1;
-  } else if (tor_inet_pton(AF_INET6, address, &addr_out->addr.in6_addr) > 0) {
-    addr_out->family = AF_INET6;
-  } else if (tor_inet_pton(AF_INET, address, &addr_out->addr.in_addr) > 0) {
-    addr_out->family = AF_INET;
+  } else if (tor_inet_pton(AF_INET6, address, &in6_tmp) > 0) {
+    family = AF_INET6;
+    tor_addr_from_in6(addr_out, &in6_tmp);
+  } else if (tor_inet_pton(AF_INET, address, &in_tmp) > 0) {
+    family = AF_INET;
+    tor_addr_from_in(addr_out, &in_tmp);
   } else {
     log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.",
              escaped(address));
@@ -591,7 +584,7 @@
       bits = (int) strtol(mask, &endptr, 10);
       if (!*endptr) {  /* strtol converted everything, so it was an integer */
         if ((bits<0 || bits>128) ||
-            ((tor_addr_family(addr_out) == AF_INET) && bits > 32)) {
+            (family == AF_INET && bits > 32)) {
           log_warn(LD_GENERAL,
                    "Bad number of mask bits (%d) on address range; rejecting.",
                    bits);
@@ -613,7 +606,7 @@
           goto err;
         }
       }
-      if (tor_addr_family(addr_out) == AF_INET6 && v4map) {
+      if (family == AF_INET6 && v4map) {
         if (bits > 32 && bits < 96) { /* Crazy */
           log_warn(LD_GENERAL,
                    "Bad mask bits %i for V4-mapped V6 address; rejecting.",
@@ -829,8 +822,8 @@
       case AF_UNSPEC:
         return 0; /* All unspecified addresses are equal */
       case AF_INET: {
-        uint32_t a1 = ntohl(addr1->addr.in_addr.s_addr);
-        uint32_t a2 = ntohl(addr2->addr.in_addr.s_addr);
+        uint32_t a1 = tor_addr_to_ipv4h(addr1);
+        uint32_t a2 = tor_addr_to_ipv4h(addr2);
         if (mbits <= 0)
           return 0;
         if (mbits > 32)
@@ -841,8 +834,8 @@
         return r;
       }
       case AF_INET6: {
-        const uint8_t *a1 = addr1->addr.in6_addr.s6_addr;
-        const uint8_t *a2 = addr2->addr.in6_addr.s6_addr;
+        const uint8_t *a1 = tor_addr_to_in6_addr8(addr1);
+        const uint8_t *a2 = tor_addr_to_in6_addr8(addr2);
         const int bytes = mbits >> 3;
         const int leftover_bits = mbits & 7;
         if (bytes && (r = memcmp(a1, a2, bytes))) {
@@ -958,14 +951,18 @@
 {
   char *tmp = NULL; /* Holds substring if we got a dotted quad. */
   int result;
+  struct in_addr in_tmp;
+  struct in6_addr in6_tmp;
   tor_assert(addr && src);
   if (src[0] == '[' && src[1])
     src = tmp = tor_strndup(src+1, strlen(src)-2);
 
-  if (tor_inet_pton(AF_INET6, src, &addr->addr.in6_addr) > 0) {
-    result = addr->family = AF_INET6;
-  } else if (tor_inet_pton(AF_INET, src, &addr->addr.in_addr) > 0) {
-    result = addr->family = AF_INET;
+  if (tor_inet_pton(AF_INET6, src, &in6_tmp) > 0) {
+    result = AF_INET6;
+    tor_addr_from_in6(addr, &in6_tmp);
+  } else if (tor_inet_pton(AF_INET, src, &in_tmp) > 0) {
+    result = AF_INET;
+    tor_addr_from_in(addr, &in_tmp);
   } else {
     result = -1;
   }

Modified: tor/trunk/src/common/address.h
===================================================================
--- tor/trunk/src/common/address.h	2008-12-26 21:26:03 UTC (rev 17789)
+++ tor/trunk/src/common/address.h	2008-12-26 21:26:05 UTC (rev 17790)
@@ -157,6 +157,8 @@
 #define tor_addr_from_ipv4h(dest, v4addr)       \
   tor_addr_from_ipv4n((dest), htonl(v4addr))
 void tor_addr_from_ipv6_bytes(tor_addr_t *dest, const char *bytes);
+#define tor_addr_from_in(dest, in) \
+  tor_addr_from_ipv4n((dest), (in)->s_addr);
 void tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6);
 int tor_addr_is_null(const tor_addr_t *addr);
 int tor_addr_is_loopback(const tor_addr_t *addr);



More information about the tor-commits mailing list