diff options
author | Tom Gundersen <teg@jklm.no> | 2015-05-27 18:39:36 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-05-27 18:44:02 +0200 |
commit | 86c3bece38bcf55da6387d20c6f01da9ad0284dc (patch) | |
tree | a3a48d4ad3a69afe163a2bbb69c07c452e98555c | |
parent | 583c14fc04a089e9af70a3fa0b8c0a8c27c06ec0 (diff) |
udevd: fix SIGCHLD handling in --daemon mode
We were listening for SIGCHLD in the wrong process.
-rw-r--r-- | src/udev/udevd.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 87e677eea1..299fda8a3a 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1288,13 +1288,6 @@ static int parse_argv(int argc, char *argv[]) { static int manager_new(Manager **ret) { _cleanup_(manager_freep) Manager *manager = NULL; - struct epoll_event ep_ctrl = { .events = EPOLLIN }; - struct epoll_event ep_inotify = { .events = EPOLLIN }; - struct epoll_event ep_signal = { .events = EPOLLIN }; - struct epoll_event ep_netlink = { .events = EPOLLIN }; - struct epoll_event ep_worker = { .events = EPOLLIN }; - sigset_t mask; - int r, one = 1; assert(ret); @@ -1323,6 +1316,23 @@ 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) { + struct epoll_event ep_ctrl = { .events = EPOLLIN }; + struct epoll_event ep_inotify = { .events = EPOLLIN }; + struct epoll_event ep_signal = { .events = EPOLLIN }; + struct epoll_event ep_netlink = { .events = EPOLLIN }; + struct epoll_event ep_worker = { .events = EPOLLIN }; + sigset_t mask; + int r, one = 1; + + assert(manager); + r = systemd_fds(&manager->fd_ctrl, &manager->fd_uevent); if (r >= 0) { /* get control and netlink socket from systemd */ @@ -1404,10 +1414,7 @@ static int manager_new(Manager **ret) { epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_worker, &ep_worker) < 0) return log_error_errno(errno, "fail to add fds to epoll: %m"); - *ret = manager; - manager = NULL; - - return 1; + return 0; } int main(int argc, char *argv[]) { @@ -1518,6 +1525,10 @@ int main(int argc, char *argv[]) { } else sd_notify(1, "READY=1"); + r = manager_listen(manager); + if (r < 0) + return log_error_errno(r, "failed to set up fds and listen for events: %m"); + for (;;) { static usec_t last_usec; struct epoll_event ev[8]; |