X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-network%2Fnetwork-internal.c;h=41f43d338988ad5de76602719e9f8a6e2d69061f;hp=372f3ed371e0279413ba7f963b066ec06b2efc68;hb=910889b6170cb484e0bf0b8a3a13c1ba6226ac07;hpb=2833796106420e4634543d06052482f75cbb5762 diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 372f3ed37..41f43d338 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -83,10 +83,10 @@ int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8 } 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, + char * const *match_paths, + char * const *match_drivers, + char * const *match_types, + char * const *match_names, Condition *match_host, Condition *match_virt, Condition *match_kernel, @@ -97,39 +97,71 @@ bool net_match_config(const struct ether_addr *match_mac, const char *dev_driver, const char *dev_type, const char *dev_name) { + char * const *match_path; + char * const *match_driver; + char * const *match_type; + char * const *match_name; - if (match_host && !condition_test_host(match_host)) - return 0; + if (match_host && !condition_test(match_host)) + return false; - if (match_virt && !condition_test_virtualization(match_virt)) - return 0; + if (match_virt && !condition_test(match_virt)) + return false; - if (match_kernel && !condition_test_kernel_command_line(match_kernel)) - return 0; + if (match_kernel && !condition_test(match_kernel)) + return false; - if (match_arch && !condition_test_architecture(match_arch)) - return 0; + if (match_arch && !condition_test(match_arch)) + return false; if (match_mac && (!dev_mac || memcmp(match_mac, dev_mac, ETH_ALEN))) - return 0; + return false; - if (match_path && (!dev_path || fnmatch(match_path, dev_path, 0))) - return 0; + if (!strv_isempty(match_paths)) { + if (!dev_path) + return false; - if (match_driver) { - if (dev_parent_driver && !streq(match_driver, dev_parent_driver)) - return 0; - else if (!streq_ptr(match_driver, dev_driver)) - return 0; + STRV_FOREACH(match_path, match_paths) + if (fnmatch(*match_path, dev_path, 0) == 0) + return true; + + return false; } - if (match_type && !streq_ptr(match_type, dev_type)) - return 0; + if (!strv_isempty(match_drivers)) { + if (!dev_driver) + return false; - if (match_name && (!dev_name || fnmatch(match_name, dev_name, 0))) - return 0; + STRV_FOREACH(match_driver, match_drivers) + if (fnmatch(*match_driver, dev_driver, 0) == 0) + return true; + + return false; + } + + if (!strv_isempty(match_types)) { + if (!dev_type) + return false; + + STRV_FOREACH(match_type, match_types) + if (fnmatch(*match_type, dev_type, 0) == 0) + return true; - return 1; + return false; + } + + if (!strv_isempty(match_names)) { + if (!dev_name) + return false; + + STRV_FOREACH(match_name, match_names) + if (fnmatch(*match_name, dev_name, 0) == 0) + return true; + + return false; + } + + return true; } int config_parse_net_condition(const char *unit, @@ -212,6 +244,49 @@ int config_parse_ifname(const char *unit, return 0; } +int config_parse_ifnames(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 ***sv = data; + const char *word, *state; + size_t l; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + FOREACH_WORD(word, l, rvalue, state) { + char *n; + + n = strndup(word, l); + if (!n) + return log_oom(); + + if (!ascii_is_valid(n) || strlen(n) >= IFNAMSIZ) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Interface name is not ASCII clean or is too long, ignoring assignment: %s", rvalue); + free(n); + return 0; + } + + r = strv_consume(sv, n); + if (r < 0) + return log_oom(); + } + + return 0; +} + int config_parse_ifalias(const char *unit, const char *filename, unsigned line, @@ -224,7 +299,7 @@ int config_parse_ifalias(const char *unit, void *userdata) { char **s = data; - char *n; + _cleanup_free_ char *n = NULL; assert(filename); assert(lvalue); @@ -238,17 +313,15 @@ int config_parse_ifalias(const char *unit, 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) + if (*n) { *s = n; - else { - free(n); + n = NULL; + } else *s = NULL; - } return 0; } @@ -392,10 +465,12 @@ void serialize_dhcp_routes(FILE *f, const char *key, struct sd_dhcp_route *route fprintf(f, "%s=", key); - for (i = 0; i < size; i++) - fprintf(f, "%s/%" PRIu8 ",%s%s", inet_ntoa(routes[i].dst_addr), - routes[i].dst_prefixlen, inet_ntoa(routes[i].gw_addr), + for (i = 0; i < size; i++) { + fprintf(f, "%s/%" PRIu8, inet_ntoa(routes[i].dst_addr), + routes[i].dst_prefixlen); + fprintf(f, ",%s%s", inet_ntoa(routes[i].gw_addr), (i < (size - 1)) ? " ": ""); + } fputs("\n", f); }