X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-manager.c;h=724e5e5a47f654c27103115d710ffd400907b7d3;hb=23c3a89b897b6bc410d1f321355f9c41fa74fea4;hp=1dc7e88dfd41f46ba6d6495708a649c95dea2680;hpb=02b59d57e0c08231645120077f651151f5bb2bab;p=elogind.git diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 1dc7e88df..724e5e5a4 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -22,6 +22,7 @@ #include "path-util.h" #include "networkd.h" #include "libudev-private.h" +#include "udev-util.h" int manager_new(Manager **ret) { _cleanup_manager_free_ Manager *m = NULL; @@ -35,7 +36,9 @@ int manager_new(Manager **ret) { if (r < 0) return r; - r = sd_rtnl_open(0, &m->rtnl); + sd_event_set_watchdog(m->event, true); + + r = sd_rtnl_open(RTMGRP_LINK | RTMGRP_IPV4_IFADDR, &m->rtnl); if (r < 0) return r; @@ -202,19 +205,13 @@ finish: static int manager_dispatch_link_udev(sd_event_source *source, int fd, uint32_t revents, void *userdata) { Manager *m = userdata; struct udev_monitor *monitor = m->udev_monitor; - struct udev_device *device; - int r; + _cleanup_udev_device_unref_ struct udev_device *device = NULL; device = udev_monitor_receive_device(monitor); if (!device) return -ENOMEM; - r = manager_process_link(m, device); - if (r < 0) - return r; - - udev_device_unref(device); - + manager_process_link(m, device); return 0; } @@ -243,6 +240,26 @@ int manager_udev_listen(Manager *m) { return 0; } +static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) { + Manager *m = userdata; + Link *link; + int r, ifindex; + + r = sd_rtnl_message_link_get_ifindex(message, &ifindex); + if (r < 0) + return 0; + + link = hashmap_get(m->links, &ifindex); + if (!link) + return 0; + + r = link_update(link, message); + if (r < 0) + return 0; + + return 1; +} + int manager_rtnl_listen(Manager *m) { int r; @@ -250,5 +267,9 @@ int manager_rtnl_listen(Manager *m) { if (r < 0) return r; + r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, &manager_rtnl_process_link, m); + if (r < 0) + return r; + return 0; }