mirror of
https://github.com/systemd/systemd.git
synced 2025-03-08 08:58:27 +03:00
socket-util: add parse_ip_prefix (#5867)
networkd: replace parse prefix with generic in_addr_prefix_from_string
This commit is contained in:
parent
192fa38bef
commit
f7bf1abef9
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (f != AF_INET6) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0, "Address label family is not IPv6, ignoring assignment: %s", prefix);
|
||||
return 0;
|
||||
}
|
||||
|
||||
n->family = f;
|
||||
n->in_addr = buffer;
|
||||
|
||||
n = NULL;
|
||||
|
||||
return 0;
|
||||
|
@ -38,7 +38,6 @@ struct AddressLabel {
|
||||
Link *link;
|
||||
NetworkConfigSection *section;
|
||||
|
||||
int family;
|
||||
unsigned char prefixlen;
|
||||
uint32_t label;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user