Magellan Linux

Annotation of /trunk/systemd/patches/systemd-220-udevd-fix-sigchld-handling-in-daemon-mode.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2587 - (hide annotations) (download)
Thu Jun 18 13:12:27 2015 UTC (8 years, 10 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