X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fnet-util.c;h=06c50b593ee3652e8818b561264c3aabe74fe38c;hp=f2fd0819d375dc5170058b6859251d541dbd1f0f;hb=2cc412b59353576cece2d5b30c6a39c70552f0a0;hpb=d2df0d0ed3a88e491405b403e6022e6619750130 diff --git a/src/shared/net-util.c b/src/shared/net-util.c index f2fd0819d..06c50b593 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -28,65 +28,101 @@ #include "utf8.h" #include "util.h" #include "conf-parser.h" +#include "condition.h" bool net_match_config(const struct ether_addr *match_mac, const char *match_path, const char *match_driver, const char *match_type, const char *match_name, + Condition *match_host, + Condition *match_virt, + Condition *match_kernel, const char *dev_mac, const char *dev_path, const char *dev_driver, const char *dev_type, const char *dev_name) { - if (match_mac) { - if (!dev_mac || memcmp(match_mac, ether_aton(dev_mac), ETH_ALEN)) { - log_debug("Interface MAC address (%s) did not match MACAddress=%s", - dev_mac, ether_ntoa(match_mac)); - return 0; - } - } + if (match_host && !condition_test_host(match_host)) + return 0; - if (match_path) { - if (!streq_ptr(match_path, dev_path)) { - log_debug("Interface persistent path (%s) did not match Path=%s", - dev_path, match_path); - return 0; - } - } + if (match_virt && !condition_test_virtualization(match_virt)) + return 0; - if (match_driver) { - if (!streq_ptr(match_driver, dev_driver)) { - log_debug("Interface device driver (%s) did not match Driver=%s", - dev_driver, match_driver); - return 0; - } - } + if (match_kernel && !condition_test_kernel_command_line(match_kernel)) + return 0; - if (match_type) { - if (!streq_ptr(match_type, dev_type)) { - log_debug("Interface type (%s) did not match Type=%s", - dev_type, match_type); - return 0; - } - } + if (match_mac && (!dev_mac || memcmp(match_mac, ether_aton(dev_mac), ETH_ALEN))) + return 0; - if (match_name) { - if (!streq_ptr(match_name, dev_name)) { - log_debug("Interface name (%s) did not match Name=%s", - dev_name, match_name); - return 0; - } - } + if (match_path && !streq_ptr(match_path, dev_path)) + return 0; + + if (match_driver && !streq_ptr(match_driver, dev_driver)) + 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_net_condition(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) { + + ConditionType cond = ltype; + Condition **ret = data; + bool negate; + Condition *c; + _cleanup_free_ char *s = NULL; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + negate = rvalue[0] == '!'; + if (negate) + rvalue++; + + s = strdup(rvalue); + if (!s) + return log_oom(); + + c = condition_new(cond, s, false, negate); + if (!c) + return log_oom(); + + if (*ret) + condition_free(*ret); + + *ret = c; + return 0; +} + 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, @@ -127,6 +163,7 @@ 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, @@ -167,6 +204,7 @@ 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, @@ -214,16 +252,24 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst) { /* IPv4 */ r = inet_pton(AF_INET, address, dst); - if (r > 0) - *family = AF_INET; /* successfully parsed IPv4 address */ - else if (r < 0) + 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) - *family = AF_INET6; /* successfully parsed IPv6 address */ - else if (r < 0) + 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;