From: Yu Watanabe Date: Wed, 7 Aug 2024 06:19:23 +0000 (+0900) Subject: network-generator: introduce network_acquire() and netdev_acquire() X-Git-Tag: v257-rc1~707^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8a57ea56bff1c531e8dc0ea8539168de0e68663;p=thirdparty%2Fsystemd.git network-generator: introduce network_acquire() and netdev_acquire() No functional change, just refactoring. --- diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c index 428414bd73c..a24d8abba8b 100644 --- a/src/network/generator/network-generator.c +++ b/src/network/generator/network-generator.c @@ -251,6 +251,21 @@ Network* network_get(Context *context, const char *ifname) { return hashmap_get(context->networks_by_name, ifname); } +static int network_acquire(Context *context, const char *ifname, Network **ret) { + Network *network; + + assert(context); + assert(ifname); + + network = network_get(context, ifname); + if (!network) + return network_new(context, ifname, ret); + + if (ret) + *ret = network; + return 0; +} + static NetDev* netdev_free(NetDev *netdev) { if (!netdev) return NULL; @@ -308,6 +323,25 @@ NetDev* netdev_get(Context *context, const char *ifname) { return hashmap_get(context->netdevs_by_name, ifname); } +static int netdev_acquire(Context *context, const char *kind, const char *name, NetDev **ret) { + NetDev *netdev; + + assert(context); + assert(kind); + assert(name); + + netdev = netdev_get(context, name); + if (!netdev) + return netdev_new(context, kind, name, ret); + + if (!streq_ptr(netdev->kind, kind)) + return -EEXIST; /* conflicting netdev already exists. */ + + if (ret) + *ret = netdev; + return 0; +} + static Link* link_free(Link *link) { if (!link) return NULL; @@ -394,12 +428,9 @@ static int network_set_dhcp_type(Context *context, const char *ifname, const cha if (t < 0) return log_debug_errno(t, "Invalid DHCP type '%s'", dhcp_type); - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); network->dhcp_type = t; return 0; @@ -490,12 +521,9 @@ static int network_set_route(Context *context, const char *ifname, int family, u !(gateway && in_addr_is_set(family, gateway))) return 0; - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); return route_new(network, family, prefixlen, dest, gateway, NULL); } @@ -517,12 +545,9 @@ static int network_set_dns(Context *context, const char *ifname, int family, con if (r < 0) return log_debug_errno(r, "Invalid DNS address '%s' for '%s'", dns, ifname); - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); return strv_extend(&network->dns, dns); } @@ -534,12 +559,9 @@ static int network_set_dhcp_use_dns(Context *context, const char *ifname, bool v assert(context); assert(ifname); - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); network->dhcp_use_dns = value; @@ -555,12 +577,9 @@ static int network_set_vlan(Context *context, const char *ifname, const char *va if (isempty(ifname)) return 0; - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); return strv_extend(&network->vlan, value); } @@ -574,12 +593,9 @@ static int network_set_bridge(Context *context, const char *ifname, const char * if (isempty(ifname)) return 0; - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); return free_and_strdup(&network->bridge, value); } @@ -593,12 +609,9 @@ static int network_set_bond(Context *context, const char *ifname, const char *va if (isempty(ifname)) return 0; - network = network_get(context, ifname); - if (!network) { - r = network_new(context, ifname, &network); - if (r < 0) - return log_debug_errno(r, "Failed to create network for '%s': %m", ifname); - } + r = network_acquire(context, ifname, &network); + if (r < 0) + return log_debug_errno(r, "Failed to acquire network for '%s': %m", ifname); return free_and_strdup(&network->bond, value); } @@ -1019,12 +1032,9 @@ static int parse_cmdline_vlan(Context *context, const char *key, const char *val name = strndupa_safe(value, p - value); - netdev = netdev_get(context, name); - if (!netdev) { - r = netdev_new(context, "vlan", name, &netdev); - if (r < 0) - return log_debug_errno(r, "Failed to create VLAN device for '%s': %m", name); - } + r = netdev_acquire(context, "vlan", name, &netdev); + if (r < 0) + return log_debug_errno(r, "Failed to acquire VLAN device for '%s': %m", name); r = extract_vlan_id(name, &netdev->vlan_id); if (r < 0) @@ -1050,12 +1060,9 @@ static int parse_cmdline_bridge(Context *context, const char *key, const char *v name = strndupa_safe(value, p - value); - netdev = netdev_get(context, name); - if (!netdev) { - r = netdev_new(context, "bridge", name, &netdev); - if (r < 0) - return log_debug_errno(r, "Failed to create bridge device for '%s': %m", name); - } + r = netdev_acquire(context, "bridge", name, &netdev); + if (r < 0) + return log_debug_errno(r, "Failed to acquire bridge device for '%s': %m", name); p++; @@ -1091,12 +1098,9 @@ static int parse_cmdline_bond(Context *context, const char *key, const char *val name = strndupa_safe(value, p - value); - netdev = netdev_get(context, name); - if (!netdev) { - r = netdev_new(context, "bond", name, &netdev); - if (r < 0) - return log_debug_errno(r, "Failed to create bond device for '%s': %m", name); - } + r = netdev_acquire(context, "bond", name, &netdev); + if (r < 0) + return log_debug_errno(r, "Failed to acquire bond device for '%s': %m", name); value = p + 1; p = strchr(value, ':');