Rewrite parse_netprefix to no longer use isc_sockaddr_fromin{,6}.
Since this was the last user of those functions we can delete them.

That turd seems to be reasonably shiny with this...

OK?

diff --git dighost.c dighost.c
index 116de3a1c6d..b822a92c756 100644
--- dighost.c
+++ dighost.c
@@ -933,68 +933,34 @@ parse_bits(char *arg, uint32_t max) {
 isc_result_t
 parse_netprefix(struct sockaddr_storage **sap, int *plen, const char *value) {
        struct sockaddr_storage *sa = NULL;
-       struct in_addr in4;
-       struct in6_addr in6;
-       uint32_t prefix_length = 0xffffffff;
-       char *slash = NULL;
-       int parsed = 0;
-       int prefix_parsed = 0;
-       char buf[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX/128")];
-       const char *errstr;
+       struct in_addr *in4;
+       struct in6_addr *in6;
+       int prefix_length;
 
        REQUIRE(sap != NULL && *sap == NULL);
 
-       if (strlcpy(buf, value, sizeof(buf)) >= sizeof(buf))
-               fatal("invalid prefix '%s'\n", value);
-
-       sa = malloc(sizeof(*sa));
+       sa = calloc(1, sizeof(*sa));
        if (sa == NULL)
                fatal("out of memory");
-       memset(sa, 0, sizeof(*sa));
 
-       if (strcmp(buf, "0") == 0) {
+       in4 = &((struct sockaddr_in *)sa)->sin_addr;
+       in6 = &((struct sockaddr_in6 *)sa)->sin6_addr;
+
+       if (strcmp(value, "0") == 0) {
                sa->ss_family = AF_UNSPEC;
                prefix_length = 0;
                goto done;
        }
 
-       slash = strchr(buf, '/');
-       if (slash != NULL) {
-               *slash = '\0';
-               prefix_length = strtonum(slash + 1, 0, 128, &errstr);
-               if (errstr != NULL) {
-                       fatal("prefix length is %s: '%s'", errstr, value);
-               }
-               prefix_parsed = 1;
-       }
-
-       if (inet_pton(AF_INET6, buf, &in6) == 1) {
-               parsed = 1;
-               isc_sockaddr_fromin6(sa, &in6, 0);
-               if (prefix_length > 128)
-                       prefix_length = 128;
-       } else if (inet_pton(AF_INET, buf, &in4) == 1) {
-               parsed = 1;
-               isc_sockaddr_fromin(sa, &in4, 0);
-               if (prefix_length > 32)
-                       prefix_length = 32;
-       } else if (prefix_parsed) {
-               int i;
-
-               for (i = 0; i < 3 && strlen(buf) < sizeof(buf) - 2; i++) {
-                       strlcat(buf, ".0", sizeof(buf));
-                       if (inet_pton(AF_INET, buf, &in4) == 1) {
-                               parsed = 1;
-                               isc_sockaddr_fromin(sa, &in4, 0);
-                               break;
-                       }
-               }
-
-               if (prefix_length > 32)
-                       prefix_length = 32;
-       }
-
-       if (!parsed)
+       if ((prefix_length = inet_net_pton(AF_INET6, value, in6, sizeof(*in6)))
+           != -1) {
+               sa->ss_len = sizeof(struct sockaddr_in6);
+               sa->ss_family = AF_INET6;
+       } else if ((prefix_length = inet_net_pton(AF_INET, value, in4,
+           sizeof(*in4))) != -1) {
+               sa->ss_len = sizeof(struct sockaddr_in);
+               sa->ss_family = AF_INET;
+       } else
                fatal("invalid address '%s'", value);
 
 done:
diff --git lib/isc/include/isc/sockaddr.h lib/isc/include/isc/sockaddr.h
index c29bbd30760..365e9528e84 100644
--- lib/isc/include/isc/sockaddr.h
+++ lib/isc/include/isc/sockaddr.h
@@ -82,20 +82,6 @@ isc_sockaddr_anyofpf(struct sockaddr_storage *sockaddr, int 
family);
  * \li 'family' is AF_INET or AF_INET6.
  */
 
-void
-isc_sockaddr_fromin(struct sockaddr_storage *sockaddr, const struct in_addr 
*ina,
-                   in_port_t port);
-/*%<
- * Construct an struct sockaddr_storage from an IPv4 address and port.
- */
-
-void
-isc_sockaddr_fromin6(struct sockaddr_storage *sockaddr, const struct in6_addr 
*ina6,
-                    in_port_t port);
-/*%<
- * Construct an struct sockaddr_storage from an IPv6 address and port.
- */
-
 int
 isc_sockaddr_pf(const struct sockaddr_storage *sockaddr);
 /*%<
diff --git lib/isc/sockaddr.c lib/isc/sockaddr.c
index 42ee201fb35..56b79d7c881 100644
--- lib/isc/sockaddr.c
+++ lib/isc/sockaddr.c
@@ -195,18 +195,6 @@ isc_sockaddr_any6(struct sockaddr_storage *sockaddr)
        sin6->sin6_port = 0;
 }
 
-void
-isc_sockaddr_fromin(struct sockaddr_storage *sockaddr, const struct in_addr 
*ina,
-                   in_port_t port)
-{
-       struct sockaddr_in *sin = (struct sockaddr_in *) sockaddr;
-       memset(sockaddr, 0, sizeof(*sockaddr));
-       sin->sin_family = AF_INET;
-       sin->sin_len = sizeof(*sin);
-       sin->sin_addr = *ina;
-       sin->sin_port = htons(port);
-}
-
 void
 isc_sockaddr_anyofpf(struct sockaddr_storage *sockaddr, int pf) {
      switch (pf) {
@@ -221,18 +209,6 @@ isc_sockaddr_anyofpf(struct sockaddr_storage *sockaddr, 
int pf) {
      }
 }
 
-void
-isc_sockaddr_fromin6(struct sockaddr_storage *sockaddr, const struct in6_addr 
*ina6,
-                    in_port_t port)
-{
-       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sockaddr;
-       memset(sockaddr, 0, sizeof(*sockaddr));
-       sin6->sin6_family = AF_INET6;
-       sin6->sin6_len = sizeof(*sin6);
-       sin6->sin6_addr = *ina6;
-       sin6->sin6_port = htons(port);
-}
-
 int
 isc_sockaddr_pf(const struct sockaddr_storage *sockaddr) {
 


-- 
I'm not entirely sure you are real.

Reply via email to