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;
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;
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;
!(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);
}
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);
}
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;
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);
}
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);
}
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);
}
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)
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++;
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, ':');