Annotation of /trunk/systemd/patches/systemd-220-udevd-fix-sigchld-handling-in-daemon-mode.patch
Parent Directory | Revision Log
Revision 2587 -
(hide annotations)
(download)
Thu Jun 18 13:12:27 2015 UTC (9 years, 3 months ago) by niro
File size: 2555 byte(s)
Thu Jun 18 13:12:27 2015 UTC (9 years, 3 months ago) by niro
File size: 2555 byte(s)
upstream fixes
1 | niro | 2587 | From 86c3bece38bcf55da6387d20c6f01da9ad0284dc Mon Sep 17 00:00:00 2001 |
2 | From: Tom Gundersen <teg@jklm.no> | ||
3 | Date: Wed, 27 May 2015 18:39:36 +0200 | ||
4 | Subject: udevd: fix SIGCHLD handling in --daemon mode | ||
5 | |||
6 | We were listening for SIGCHLD in the wrong process. | ||
7 | |||
8 | diff --git a/src/udev/udevd.c b/src/udev/udevd.c | ||
9 | index 87e677e..299fda8 100644 | ||
10 | --- a/src/udev/udevd.c | ||
11 | +++ b/src/udev/udevd.c | ||
12 | @@ -1288,13 +1288,6 @@ static int parse_argv(int argc, char *argv[]) { | ||
13 | |||
14 | static int manager_new(Manager **ret) { | ||
15 | _cleanup_(manager_freep) Manager *manager = NULL; | ||
16 | - struct epoll_event ep_ctrl = { .events = EPOLLIN }; | ||
17 | - struct epoll_event ep_inotify = { .events = EPOLLIN }; | ||
18 | - struct epoll_event ep_signal = { .events = EPOLLIN }; | ||
19 | - struct epoll_event ep_netlink = { .events = EPOLLIN }; | ||
20 | - struct epoll_event ep_worker = { .events = EPOLLIN }; | ||
21 | - sigset_t mask; | ||
22 | - int r, one = 1; | ||
23 | |||
24 | assert(ret); | ||
25 | |||
26 | @@ -1323,6 +1316,23 @@ static int manager_new(Manager **ret) { | ||
27 | udev_list_node_init(&manager->events); | ||
28 | udev_list_init(manager->udev, &manager->properties, true); | ||
29 | |||
30 | + *ret = manager; | ||
31 | + manager = NULL; | ||
32 | + | ||
33 | + return 0; | ||
34 | +} | ||
35 | + | ||
36 | +static int manager_listen(Manager *manager) { | ||
37 | + struct epoll_event ep_ctrl = { .events = EPOLLIN }; | ||
38 | + struct epoll_event ep_inotify = { .events = EPOLLIN }; | ||
39 | + struct epoll_event ep_signal = { .events = EPOLLIN }; | ||
40 | + struct epoll_event ep_netlink = { .events = EPOLLIN }; | ||
41 | + struct epoll_event ep_worker = { .events = EPOLLIN }; | ||
42 | + sigset_t mask; | ||
43 | + int r, one = 1; | ||
44 | + | ||
45 | + assert(manager); | ||
46 | + | ||
47 | r = systemd_fds(&manager->fd_ctrl, &manager->fd_uevent); | ||
48 | if (r >= 0) { | ||
49 | /* get control and netlink socket from systemd */ | ||
50 | @@ -1404,10 +1414,7 @@ static int manager_new(Manager **ret) { | ||
51 | epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_worker, &ep_worker) < 0) | ||
52 | return log_error_errno(errno, "fail to add fds to epoll: %m"); | ||
53 | |||
54 | - *ret = manager; | ||
55 | - manager = NULL; | ||
56 | - | ||
57 | - return 1; | ||
58 | + return 0; | ||
59 | } | ||
60 | |||
61 | int main(int argc, char *argv[]) { | ||
62 | @@ -1518,6 +1525,10 @@ int main(int argc, char *argv[]) { | ||
63 | } else | ||
64 | sd_notify(1, "READY=1"); | ||
65 | |||
66 | + r = manager_listen(manager); | ||
67 | + if (r < 0) | ||
68 | + return log_error_errno(r, "failed to set up fds and listen for events: %m"); | ||
69 | + | ||
70 | for (;;) { | ||
71 | static usec_t last_usec; | ||
72 | struct epoll_event ev[8]; | ||
73 | -- | ||
74 | cgit v0.10.2 | ||
75 |