]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
Compatiable network abbreviation support
authorStephen Hemminger <stephen.hemminger@vyatta.com>
Tue, 14 Oct 2008 22:02:16 +0000 (15:02 -0700)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Tue, 14 Oct 2008 22:02:16 +0000 (15:02 -0700)
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

index 21cf0ea0914cea72662676991b441ff7e99923ad..bcc6a730d5b989e7d9451c2b075b1b30744c1066 100644 (file)
@@ -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;