From: Tom Gundersen Date: Sun, 31 May 2015 21:58:39 +0000 (+0200) Subject: udevd: open sockets before forking X-Git-Tag: v221~233 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3d7dc8e4f9273ed0f14116ee7400718b7459df0d;p=thirdparty%2Fsystemd.git udevd: open sockets before forking The communication channels must all be opened before forknig in daemon mode, or we cannot guarantee that udevadm will work correctly as soon as udevd is started. --- diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 5717edd4350..34e88af5398 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1439,7 +1439,7 @@ static int parse_argv(int argc, char *argv[]) { static int manager_new(Manager **ret) { _cleanup_(manager_freep) Manager *manager = NULL; - int r; + int r, fd_ctrl, fd_uevent; assert(ret); @@ -1464,18 +1464,6 @@ static int manager_new(Manager **ret) { udev_list_node_init(&manager->events); udev_list_init(manager->udev, &manager->properties, true); - *ret = manager; - manager = NULL; - - return 0; -} - -static int manager_listen(Manager *manager) { - sigset_t mask; - int r, fd_worker, fd_ctrl, fd_uevent, one = 1; - - assert(manager); - r = systemd_fds(&fd_ctrl, &fd_uevent); if (r >= 0) { /* get control and netlink socket from systemd */ @@ -1516,6 +1504,18 @@ static int manager_listen(Manager *manager) { if (r < 0) return log_error_errno(EINVAL, "error binding udev control socket"); + *ret = manager; + manager = NULL; + + return 0; +} + +static int manager_listen(Manager *manager) { + sigset_t mask; + int r, fd_worker, one = 1; + + assert(manager); + /* unnamed socket from workers to the main daemon */ r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch); if (r < 0) @@ -1561,7 +1561,7 @@ static int manager_listen(Manager *manager) { if (r < 0) return log_error_errno(r, "error creating watchdog event source: %m"); - r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager); + r = sd_event_add_io(manager->event, &manager->ctrl_event, udev_ctrl_get_fd(manager->ctrl), EPOLLIN, on_ctrl_msg, manager); if (r < 0) return log_error_errno(r, "error creating ctrl event source: %m"); @@ -1577,7 +1577,7 @@ static int manager_listen(Manager *manager) { if (r < 0) return log_error_errno(r, "error creating inotify event source: %m"); - r = sd_event_add_io(manager->event, &manager->uevent_event, fd_uevent, EPOLLIN, on_uevent, manager); + r = sd_event_add_io(manager->event, &manager->uevent_event, udev_monitor_get_fd(manager->monitor), EPOLLIN, on_uevent, manager); if (r < 0) return log_error_errno(r, "error creating uevent event source: %m");