diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-03-08 15:20:01 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-03-21 23:37:39 +0900 |
commit | c4f58deab56282cd438922203287cb073b861513 (patch) | |
tree | fb4b10b82f34ad951a768c79a59ab2ac552a43a9 /src | |
parent | 2bd0da7a054184053f6af2043233d5c513a0bc69 (diff) | |
download | systemd-c4f58deab56282cd438922203287cb073b861513.tar.gz systemd-c4f58deab56282cd438922203287cb073b861513.tar.bz2 systemd-c4f58deab56282cd438922203287cb073b861513.zip |
network,udev: split static condition tests from net_match_config()
Diffstat (limited to 'src')
-rw-r--r-- | src/libsystemd-network/network-internal.c | 34 | ||||
-rw-r--r-- | src/libsystemd-network/network-internal.h | 6 | ||||
-rw-r--r-- | src/network/netdev/netdev-gperf.gperf | 10 | ||||
-rw-r--r-- | src/network/netdev/netdev.c | 13 | ||||
-rw-r--r-- | src/network/netdev/netdev.h | 6 | ||||
-rw-r--r-- | src/network/networkd-network-gperf.gperf | 10 | ||||
-rw-r--r-- | src/network/networkd-network.c | 16 | ||||
-rw-r--r-- | src/network/networkd-network.h | 7 | ||||
-rw-r--r-- | src/shared/condition.c | 12 | ||||
-rw-r--r-- | src/shared/condition.h | 5 | ||||
-rw-r--r-- | src/udev/net/link-config-gperf.gperf | 10 | ||||
-rw-r--r-- | src/udev/net/link-config.c | 16 | ||||
-rw-r--r-- | src/udev/net/link-config.h | 6 |
13 files changed, 47 insertions, 104 deletions
diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 63d4d85665..2154cf7eac 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -100,32 +100,12 @@ bool net_match_config(Set *match_mac, char * const *match_drivers, char * const *match_types, char * const *match_names, - Condition *match_host, - Condition *match_virt, - Condition *match_kernel_cmdline, - Condition *match_kernel_version, - Condition *match_arch, const struct ether_addr *dev_mac, const char *dev_path, const char *dev_driver, const char *dev_type, const char *dev_name) { - if (match_host && condition_test(match_host) <= 0) - return false; - - if (match_virt && condition_test(match_virt) <= 0) - return false; - - if (match_kernel_cmdline && condition_test(match_kernel_cmdline) <= 0) - return false; - - if (match_kernel_version && condition_test(match_kernel_version) <= 0) - return false; - - if (match_arch && condition_test(match_arch) <= 0) - return false; - if (match_mac && (!dev_mac || !set_contains(match_mac, dev_mac))) return false; @@ -156,15 +136,19 @@ int config_parse_net_condition(const char *unit, void *userdata) { ConditionType cond = ltype; - Condition **ret = data; + Condition **list = data, *c; bool negate; - Condition *c; assert(filename); assert(lvalue); assert(rvalue); assert(data); + if (isempty(rvalue)) { + *list = condition_free_list_type(*list, cond); + return 0; + } + negate = rvalue[0] == '!'; if (negate) rvalue++; @@ -173,10 +157,10 @@ int config_parse_net_condition(const char *unit, if (!c) return log_oom(); - if (*ret) - condition_free(*ret); + /* Drop previous assignment. */ + *list = condition_free_list_type(*list, cond); - *ret = c; + LIST_PREPEND(conditions, *list, c); return 0; } diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h index 9d30c52eea..62f5a4a76c 100644 --- a/src/libsystemd-network/network-internal.h +++ b/src/libsystemd-network/network-internal.h @@ -6,7 +6,6 @@ #include "sd-device.h" #include "sd-dhcp-lease.h" -#include "condition.h" #include "conf-parser.h" #include "def.h" #include "set.h" @@ -20,11 +19,6 @@ bool net_match_config(Set *match_mac, char * const *match_driver, char * const *match_type, char * const *match_name, - Condition *match_host, - Condition *match_virt, - Condition *match_kernel_cmdline, - Condition *match_kernel_version, - Condition *match_arch, const struct ether_addr *dev_mac, const char *dev_path, const char *dev_driver, diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index 3365023b32..96632da0b6 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -34,11 +34,11 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(NetDev, match_host) -Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(NetDev, match_virt) -Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, match_kernel_cmdline) -Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(NetDev, match_kernel_version) -Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(NetDev, match_arch) +Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(NetDev, conditions) +Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(NetDev, conditions) +Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, conditions) +Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(NetDev, conditions) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(NetDev, conditions) NetDev.Description, config_parse_string, 0, offsetof(NetDev, description) NetDev.Name, config_parse_ifname, 0, offsetof(NetDev, ifname) NetDev.Kind, config_parse_netdev_kind, 0, offsetof(NetDev, kind) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index f60214ae11..5cdd09d775 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -174,12 +174,7 @@ static NetDev *netdev_free(NetDev *netdev) { free(netdev->description); free(netdev->ifname); free(netdev->mac); - - condition_free_list(netdev->match_host); - condition_free_list(netdev->match_virt); - condition_free_list(netdev->match_kernel_cmdline); - condition_free_list(netdev->match_kernel_version); - condition_free_list(netdev->match_arch); + condition_free_list(netdev->conditions); /* Invoke the per-kind done() destructor, but only if the state field is initialized. We conditionalize that * because we parse .netdev files twice: once to determine the kind (with a short, minimal NetDev structure @@ -683,11 +678,7 @@ int netdev_load_one(Manager *manager, const char *filename) { return r; /* skip out early if configuration does not match the environment */ - if (!net_match_config(NULL, NULL, NULL, NULL, NULL, - netdev_raw->match_host, netdev_raw->match_virt, - netdev_raw->match_kernel_cmdline, netdev_raw->match_kernel_version, - netdev_raw->match_arch, - NULL, NULL, NULL, NULL, NULL)) { + if (!condition_test_list(netdev_raw->conditions, NULL, NULL, NULL)) { log_debug("%s: Conditions in the file do not match the system environment, skipping.", filename); return 0; } diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index c46ed4d719..3c6990236f 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -81,11 +81,7 @@ typedef struct NetDev { char *filename; - Condition *match_host; - Condition *match_virt; - Condition *match_kernel_cmdline; - Condition *match_kernel_version; - Condition *match_arch; + Condition *conditions; NetDevState state; NetDevKind kind; diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 2db8299b13..47a9f7d808 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -25,11 +25,11 @@ Match.Path, config_parse_strv, Match.Driver, config_parse_strv, 0, offsetof(Network, match_driver) Match.Type, config_parse_strv, 0, offsetof(Network, match_type) Match.Name, config_parse_ifnames, 0, offsetof(Network, match_name) -Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(Network, match_host) -Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(Network, match_virt) -Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, match_kernel_cmdline) -Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(Network, match_kernel_version) -Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(Network, match_arch) +Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(Network, conditions) +Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(Network, conditions) +Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, conditions) +Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(Network, conditions) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(Network, conditions) Link.MACAddress, config_parse_hwaddr, 0, offsetof(Network, mac) Link.MTUBytes, config_parse_mtu, AF_UNSPEC, offsetof(Network, mtu) Link.ARP, config_parse_tristate, 0, offsetof(Network, arp) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 33055d9e3d..c6c3480cd1 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -174,10 +174,7 @@ int network_verify(Network *network) { assert(network->filename); /* skip out early if configuration does not match the environment */ - if (!net_match_config(NULL, NULL, NULL, NULL, NULL, - network->match_host, network->match_virt, network->match_kernel_cmdline, - network->match_kernel_version, network->match_arch, - NULL, NULL, NULL, NULL, NULL)) + if (!condition_test_list(network->conditions, NULL, NULL, NULL)) return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "%s: Conditions in the file do not match the system environment, skipping.", network->filename); @@ -497,6 +494,7 @@ void network_free(Network *network) { strv_free(network->match_driver); strv_free(network->match_type); strv_free(network->match_name); + condition_free_list(network->conditions); free(network->description); free(network->dhcp_vendor_class_identifier); @@ -568,12 +566,6 @@ void network_free(Network *network) { free(network->name); - condition_free_list(network->match_host); - condition_free_list(network->match_virt); - condition_free_list(network->match_kernel_cmdline); - condition_free_list(network->match_kernel_version); - condition_free_list(network->match_arch); - free(network->dhcp_server_timezone); free(network->dhcp_server_dns); free(network->dhcp_server_ntp); @@ -619,9 +611,7 @@ int network_get(Manager *manager, sd_device *device, LIST_FOREACH(networks, network, manager->networks) { if (net_match_config(network->match_mac, network->match_path, network->match_driver, network->match_type, - network->match_name, network->match_host, - network->match_virt, network->match_kernel_cmdline, - network->match_kernel_version, network->match_arch, + network->match_name, address, path, driver, devtype, ifname)) { if (network->match_name && device) { const char *attr; diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index e7f9a68162..7211aee8c6 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -97,12 +97,7 @@ struct Network { char **match_driver; char **match_type; char **match_name; - - Condition *match_host; - Condition *match_virt; - Condition *match_kernel_cmdline; - Condition *match_kernel_version; - Condition *match_arch; + Condition *conditions; char *description; diff --git a/src/shared/condition.c b/src/shared/condition.c index 44d88c37dd..69d65fffbc 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -77,13 +77,17 @@ void condition_free(Condition *c) { free(c); } -Condition* condition_free_list(Condition *first) { - Condition *c, *n; +Condition* condition_free_list_type(Condition *first, ConditionType type) { + Condition *c, *n, *r = NULL; LIST_FOREACH_SAFE(conditions, c, n, first) - condition_free(c); + if (type < 0 || c->type == type) + condition_free(c); + else if (!r) + r = c; - return NULL; + assert(type >= 0 || !r); + return r; } static int condition_test_kernel_command_line(Condition *c) { diff --git a/src/shared/condition.h b/src/shared/condition.h index 773490f052..594c12d5a7 100644 --- a/src/shared/condition.h +++ b/src/shared/condition.h @@ -65,7 +65,10 @@ typedef struct Condition { Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate); void condition_free(Condition *c); -Condition* condition_free_list(Condition *c); +Condition* condition_free_list_type(Condition *first, ConditionType type); +static inline Condition* condition_free_list(Condition *first) { + return condition_free_list_type(first, _CONDITION_TYPE_INVALID); +} int condition_test(Condition *c); typedef int (*condition_test_logger_t)(void *userdata, int level, int error, const char *file, int line, const char *func, const char *format, ...) _printf_(7, 8); diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf index 2bc18bff56..558996cf2e 100644 --- a/src/udev/net/link-config-gperf.gperf +++ b/src/udev/net/link-config-gperf.gperf @@ -24,11 +24,11 @@ Match.OriginalName, config_parse_ifnames, 0, Match.Path, config_parse_strv, 0, offsetof(link_config, match_path) Match.Driver, config_parse_strv, 0, offsetof(link_config, match_driver) Match.Type, config_parse_strv, 0, offsetof(link_config, match_type) -Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(link_config, match_host) -Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(link_config, match_virt) -Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, match_kernel_cmdline) -Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(link_config, match_kernel_version) -Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(link_config, match_arch) +Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(link_config, conditions) +Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(link_config, conditions) +Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, conditions) +Match.KernelVersion, config_parse_net_condition, CONDITION_KERNEL_VERSION, offsetof(link_config, conditions) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(link_config, conditions) Link.Description, config_parse_string, 0, offsetof(link_config, description) Link.MACAddressPolicy, config_parse_mac_policy, 0, offsetof(link_config, mac_policy) Link.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, mac) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 438ff473ae..58d5d27883 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -51,12 +51,7 @@ static void link_config_free(link_config *link) { strv_free(link->match_driver); strv_free(link->match_type); strv_free(link->match_name); - - condition_free_list(link->match_host); - condition_free_list(link->match_virt); - condition_free_list(link->match_kernel_cmdline); - condition_free_list(link->match_kernel_version); - condition_free_list(link->match_arch); + condition_free_list(link->conditions); free(link->description); free(link->mac); @@ -164,10 +159,7 @@ int link_load_one(link_config_ctx *ctx, const char *filename) { if (link->speed > UINT_MAX) return -ERANGE; - if (!net_match_config(NULL, NULL, NULL, NULL, NULL, - link->match_host, link->match_virt, link->match_kernel_cmdline, - link->match_kernel_version, link->match_arch, - NULL, NULL, NULL, NULL, NULL)) { + if (!condition_test_list(link->conditions, NULL, NULL, NULL)) { log_debug("%s: Conditions do not match the system environment, skipping.", filename); return 0; } @@ -251,9 +243,7 @@ int link_config_get(link_config_ctx *ctx, sd_device *device, link_config **ret) (void) sd_device_get_sysname(device, &sysname); if (net_match_config(link->match_mac, link->match_path, link->match_driver, - link->match_type, link->match_name, link->match_host, - link->match_virt, link->match_kernel_cmdline, - link->match_kernel_version, link->match_arch, + link->match_type, link->match_name, address ? ether_aton(address) : NULL, id_path, id_net_driver, diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index 4335b593d1..f18b2afa79 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -40,11 +40,7 @@ struct link_config { char **match_driver; char **match_type; char **match_name; - Condition *match_host; - Condition *match_virt; - Condition *match_kernel_cmdline; - Condition *match_kernel_version; - Condition *match_arch; + Condition *conditions; char *description; struct ether_addr *mac; |