Contents of /trunk/systemd/patches/systemd-220-udevd-fix-sigchld-handling-in-daemon-mode.patch
Parent Directory | Revision Log
Revision 2587 -
(show 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 | 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 |