X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-network.c;h=048017e22968f000882c7716cccb31cbcc1bf123;hp=ca79d4ff6d5c796b22ae8e055650c4b53c6c33d2;hb=505f8da7325591defe5f751f328bd26915267602;hpb=fe6b2d55bcb379d01664ed28cea40634cb6b52e3 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index ca79d4ff6..048017e22 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -20,7 +20,7 @@ ***/ #include "networkd.h" -#include "net-util.h" +#include "network-internal.h" #include "path-util.h" #include "conf-files.h" #include "conf-parser.h" @@ -41,7 +41,7 @@ static int network_load_one(Manager *manager, const char *filename) { if (errno == ENOENT) return 0; else - return errno; + return -errno; } network = new0(Network, 1); @@ -69,6 +69,10 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network->routes_by_section) return log_oom(); + network->dns = set_new(NULL, NULL); + if (!network->dns) + return log_oom(); + network->filename = strdup(filename); if (!network->filename) return log_oom(); @@ -136,6 +140,7 @@ int network_load(Manager *manager) { void network_free(Network *network) { Route *route; Address *address; + Iterator i; if (!network) return; @@ -150,7 +155,10 @@ void network_free(Network *network) { free(network->description); - address_free(network->dns); + SET_FOREACH(address, network->dns, i) + address_free(address); + + set_free(network->dns); hashmap_free(network->vlans); @@ -168,31 +176,36 @@ void network_free(Network *network) { if (network->manager && network->manager->networks) LIST_REMOVE(networks, network->manager->networks, network); + condition_free_list(network->match_host); + condition_free_list(network->match_virt); + condition_free_list(network->match_kernel); + condition_free_list(network->match_arch); + free(network); } -int network_get(Manager *manager, struct udev_device *device, Network **ret) { +int network_get(Manager *manager, struct udev_device *device, + const char *ifname, const struct ether_addr *address, + Network **ret) { Network *network; assert(manager); - assert(device); assert(ret); 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, - network->match_arch, - udev_device_get_sysattr_value(device, "address"), - udev_device_get_property_value(device, "ID_PATH"), - udev_device_get_driver(udev_device_get_parent(device)), - udev_device_get_property_value(device, "ID_NET_DRIVER"), - udev_device_get_devtype(device), - udev_device_get_sysname(device))) { - log_debug("%s: found matching network '%s'", - udev_device_get_sysname(device), - network->filename); + network->match_driver, network->match_type, + network->match_name, network->match_host, + network->match_virt, network->match_kernel, + network->match_arch, + address, + udev_device_get_property_value(device, "ID_PATH"), + udev_device_get_driver(udev_device_get_parent(device)), + udev_device_get_property_value(device, "ID_NET_DRIVER"), + udev_device_get_devtype(device), + ifname)) { + log_debug("%s: found matching network '%s'", ifname, + network->filename); *ret = network; return 0; } @@ -208,10 +221,6 @@ int network_apply(Manager *manager, Network *network, Link *link) { link->network = network; - r = link_configure(link); - if (r < 0) - return r; - if (network->dns) { r = manager_update_resolv_conf(manager); if (r < 0)