summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@users.noreply.github.com>2017-05-06 00:04:07 +0000
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-05-05 20:04:07 -0400
commitf7bf1abef9b4db7ffe18a6cf84db2aaef7d908d3 (patch)
tree76375c21a042debd6c1fe92de593eadc03f3cc88
parent192fa38bef60ecb7916145a050a683d7fced6915 (diff)
socket-util: add parse_ip_prefix (#5867)systemd/master
networkd: replace parse prefix with generic in_addr_prefix_from_string
-rw-r--r--src/basic/in-addr-util.c42
-rw-r--r--src/basic/in-addr-util.h1
-rw-r--r--src/network/networkd-address-label.c42
-rw-r--r--src/network/networkd-address-label.h1
4 files changed, 47 insertions, 39 deletions
diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c
index 3927df2955..d52fdad3ac 100644
--- a/src/basic/in-addr-util.c
+++ b/src/basic/in-addr-util.c
@@ -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;
+}
diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h
index 51a5aa67e4..14e27246b5 100644
--- a/src/basic/in-addr-util.h
+++ b/src/basic/in-addr-util.h
@@ -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);
diff --git a/src/network/networkd-address-label.c b/src/network/networkd-address-label.c
index 1248719cf3..b89995ec44 100644
--- a/src/network/networkd-address-label.c
+++ b/src/network/networkd-address-label.c
@@ -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;
diff --git a/src/network/networkd-address-label.h b/src/network/networkd-address-label.h
index 05bb24924c..8724ea8cb5 100644
--- a/src/network/networkd-address-label.h
+++ b/src/network/networkd-address-label.h
@@ -38,7 +38,6 @@ struct AddressLabel {
Link *link;
NetworkConfigSection *section;
- int family;
unsigned char prefixlen;
uint32_t label;