From 94afda752956ddc6ff1accf931bc3d03c070bb18 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 14 Oct 2008 15:02:16 -0700 Subject: [PATCH] Compatiable network abbreviation support Handle 10/8 as 10.0.0.0/8 and check for bogus values like 256/8. This is a comprimise between original iproute2 parsing and standard BSD parsing of abbreviated IPV4 addresses. --- lib/utils.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/utils.c b/lib/utils.c index 21cf0ea0..bcc6a730 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -246,6 +246,9 @@ int get_s8(__s8 *val, const char *arg, int base) int get_addr_1(inet_prefix *addr, const char *name, int family) { + unsigned long n; + char *endp; + memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0 || @@ -284,8 +287,25 @@ int get_addr_1(inet_prefix *addr, const char *name, int family) addr->family = AF_INET; if (family != AF_UNSPEC && family != AF_INET) return -1; - if (inet_aton(name, addr->data) <= 0) + + n = strtoul(name, &endp, 0); + if (n > 255) + return -1; /* bogus network value */ + + if (endp == name) /* not a number */ return -1; + + /* compatable with older usage (ie 10/8 = 10.0.0.0/8) */ + if (strchr(name, '.') == NULL) { + addr->data[0] = n; + addr->bytelen = 4; + addr->bitlen = -1; + return 0; + } + + if (inet_aton(name, (struct in_addr *)addr->data) <= 0) + return -1; + addr->bytelen = 4; addr->bitlen = -1; return 0;