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.