X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fnet-util.c;h=ba21ae437f3da968aae980c584a32c07a0ffca1c;hp=c4cb3337ae7efe852cee9da1a304e74ed85bdc39;hb=b6e2f3293d0f9a821819d96038eec2a19062151f;hpb=be32eb9b7fbcb22e4b648086d644135e38279633 diff --git a/src/shared/net-util.c b/src/shared/net-util.c index c4cb3337a..ba21ae437 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -20,7 +20,8 @@ ***/ #include -#include +#include +#include #include "net-util.h" #include "log.h" @@ -33,63 +34,41 @@ bool net_match_config(const struct ether_addr *match_mac, const char *match_driver, const char *match_type, const char *match_name, - struct udev_device *device) { - const char *property; - - assert(device); - - if (match_mac) { - property = udev_device_get_sysattr_value(device, "address"); - if (!property || memcmp(match_mac, ether_aton(property), ETH_ALEN)) { - log_debug("Interface MAC address (%s) did not match MACAddress=%s", - property, ether_ntoa(match_mac)); - return 0; - } - } + const char *dev_mac, + const char *dev_path, + const char *dev_driver, + const char *dev_type, + const char *dev_name) { - if (match_path) { - property = udev_device_get_property_value(device, "ID_PATH"); - if (!streq_ptr(match_path, property)) { - log_debug("Interface persistent path (%s) did not match Path=%s", - property, match_path); - return 0; - } - } + if (match_mac && (!dev_mac || memcmp(match_mac, ether_aton(dev_mac), ETH_ALEN))) + return 0; - if (match_driver) { - property = udev_device_get_driver(device); - if (!streq_ptr(match_driver, property)) { - log_debug("Interface device driver (%s) did not match Driver=%s", - property, match_driver); - return 0; - } - } + if (match_path && !streq_ptr(match_path, dev_path)) + return 0; - if (match_type) { - property = udev_device_get_devtype(device); - if (!streq_ptr(match_type, property)) { - log_debug("Interface type (%s) did not match Type=%s", - property, match_type); - return 0; - } - } + if (match_driver && !streq_ptr(match_driver, dev_driver)) + return 0; - if (match_name) { - property = udev_device_get_sysname(device); - if (!streq_ptr(match_name, property)) { - log_debug("Interface name (%s) did not match Name=%s", - property, match_name); - return 0; - } - } + if (match_type && !streq_ptr(match_type, dev_type)) + return 0; + + if (match_name && !streq_ptr(match_name, dev_name)) + return 0; return 1; } +unsigned net_netmask_to_prefixlen(const struct in_addr *addr) { + assert(addr); + + return 32 - u32ctz(be32toh(addr->s_addr)); +} + int config_parse_ifname(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -126,10 +105,52 @@ int config_parse_ifname(const char *unit, return 0; } +int config_parse_ifalias(const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **s = data; + char *n; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + n = strdup(rvalue); + if (!n) + return log_oom(); + + if (!ascii_is_valid(n) || strlen(n) >= IFALIASZ) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Interface alias is not ASCII clean or is too long, ignoring assignment: %s", rvalue); + free(n); + return 0; + } + + free(*s); + if (*n) + *s = n; + else { + free(n); + *s = NULL; + } + + return 0; +} + int config_parse_hwaddr(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -167,3 +188,38 @@ int config_parse_hwaddr(const char *unit, return 0; } + +int net_parse_inaddr(const char *address, unsigned char *family, void *dst) { + int r; + + assert(address); + assert(family); + assert(dst); + + /* IPv4 */ + r = inet_pton(AF_INET, address, dst); + if (r > 0) { + /* succsefully parsed IPv4 address */ + if (*family == AF_UNSPEC) + *family = AF_INET; + else if (*family != AF_INET) + return -EINVAL; + } else if (r < 0) + return -errno; + else { + /* not an IPv4 address, so let's try IPv6 */ + r = inet_pton(AF_INET6, address, dst); + if (r > 0) { + /* successfully parsed IPv6 address */ + if (*family == AF_UNSPEC) + *family = AF_INET6; + else if (*family != AF_INET6) + return -EINVAL; + } else if (r < 0) + return -errno; + else + return -EINVAL; + } + + return 0; +}