]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: add parse_ip_prefix (#5867)
authorSusant Sahani <ssahani@users.noreply.github.com>
Sat, 6 May 2017 00:04:07 +0000 (00:04 +0000)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 6 May 2017 00:04:07 +0000 (20:04 -0400)
networkd: replace parse prefix with generic in_addr_prefix_from_string

src/basic/in-addr-util.c
src/basic/in-addr-util.h
src/network/networkd-address-label.c
src/network/networkd-address-label.h

index 3927df2955862436349fdee73e48487cd3eba5f1..d52fdad3ac974c670783a8c8bd4ef00bd040b2ae 100644 (file)
@@ -464,3 +464,45 @@ int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen)
 
         return -EAFNOSUPPORT;
 }
+
+int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen) {
+        union in_addr_union buffer;
+        const char *e, *l;
+        uint8_t k;
+        int r;
+
+        assert(p);
+
+        if (!IN_SET(family, AF_INET, AF_INET6))
+                return -EAFNOSUPPORT;
+
+        e = strchr(p, '/');
+        if (e)
+                l = strndupa(p, e - p);
+        else
+                l = p;
+
+        r = in_addr_from_string(family, l, &buffer);
+        if (r < 0)
+                return r;
+
+        k = FAMILY_ADDRESS_SIZE(family) * 8;
+
+        if (e) {
+                uint8_t n;
+
+                r = safe_atou8(e + 1, &n);
+                if (r < 0)
+                        return r;
+
+                if (n > k)
+                        return -ERANGE;
+
+                k = n;
+        }
+
+        *ret_prefix = buffer;
+        *ret_prefixlen = k;
+
+        return 0;
+}
index 51a5aa67e4101b6ec1934748dd5475e81a10a492..14e27246b59684d6f7594afaef7d423902a83311 100644 (file)
@@ -60,6 +60,7 @@ struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char
 int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
 int in_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
 int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
+int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen);
 
 static inline size_t FAMILY_ADDRESS_SIZE(int family) {
         assert(family == AF_INET || family == AF_INET6);
index 1248719cf349c10f33c300517e848e89dd3c9b81..b89995ec4426556e6d5a2b721064c29ec36022b6 100644 (file)
@@ -117,7 +117,7 @@ int address_label_configure(
         assert(link->manager->rtnl);
 
         r = sd_rtnl_message_new_addrlabel(link->manager->rtnl, &req, RTM_NEWADDRLABEL,
-                                          link->ifindex, label->family);
+                                          link->ifindex, AF_INET6);
         if (r < 0)
                 return log_error_errno(r, "Could not allocate RTM_NEWADDR message: %m");
 
@@ -155,9 +155,7 @@ int config_parse_address_label_prefix(const char *unit,
 
         _cleanup_address_label_free_ AddressLabel *n = NULL;
         Network *network = userdata;
-        const char *prefix, *e;
-        union in_addr_union buffer;
-        int r, f;
+        int r;
 
         assert(filename);
         assert(section);
@@ -169,44 +167,12 @@ int config_parse_address_label_prefix(const char *unit,
         if (r < 0)
                 return r;
 
-        /* AddressLabel=prefix/prefixlen */
-
-        /* prefixlen */
-        e = strchr(rvalue, '/');
-        if (e) {
-                unsigned i;
-
-                r = safe_atou(e + 1, &i);
-                if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Prefix length is invalid, ignoring assignment: %s", e + 1);
-                        return 0;
-                }
-
-                if (i > 128) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Prefix length is out of range, ignoring assignment: %s", e + 1);
-                        return 0;
-                }
-
-                n->prefixlen = (unsigned char) i;
-
-                prefix = strndupa(rvalue, e - rvalue);
-        } else
-                prefix = rvalue;
-
-        r = in_addr_from_string_auto(prefix, &f, &buffer);
+        r = in_addr_prefix_from_string(rvalue, AF_INET6, &n->in_addr, &n->prefixlen);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", prefix);
-                return 0;
-        }
-
-        if (f != AF_INET6) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Address label family is not IPv6, ignoring assignment: %s", prefix);
+                log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", rvalue);
                 return 0;
         }
 
-        n->family = f;
-        n->in_addr = buffer;
-
         n = NULL;
 
         return 0;
index 05bb24924c0168b3e3661c4f2c74a799c939aca3..8724ea8cb5223f3a49eb1bb3eb2ac27dc5bd3d45 100644 (file)
@@ -38,7 +38,6 @@ struct AddressLabel {
         Link *link;
         NetworkConfigSection *section;
 
-        int family;
         unsigned char prefixlen;
         uint32_t label;