summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2015-05-27 18:39:36 +0200
committerTom Gundersen <teg@jklm.no>2015-05-27 18:44:02 +0200
commit86c3bece38bcf55da6387d20c6f01da9ad0284dc (patch)
treea3a48d4ad3a69afe163a2bbb69c07c452e98555c
parent583c14fc04a089e9af70a3fa0b8c0a8c27c06ec0 (diff)
udevd: fix SIGCHLD handling in --daemon mode
We were listening for SIGCHLD in the wrong process.
-rw-r--r--src/udev/udevd.c33
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];