]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
libudev: monitor - set nl_pid when reusing fd in udev_monitor_new_from_netlink_fd
[thirdparty/systemd.git] / src / udev / udevd.c
CommitLineData
7fafc032 1/*
1298001e 2 * Copyright (C) 2004-2012 Kay Sievers <kay@vrfy.org>
2f6cbd19 3 * Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
bb38678e
SJR
4 * Copyright (C) 2009 Canonical Ltd.
5 * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
7fafc032 6 *
55e9959b
KS
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 2 of the License, or
10 * (at your option) any later version.
7fafc032 11 *
55e9959b
KS
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
7fafc032 16 *
55e9959b
KS
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
7fafc032
KS
19 */
20
a695feae 21#include <stddef.h>
7fafc032
KS
22#include <signal.h>
23#include <unistd.h>
24#include <errno.h>
25#include <stdio.h>
26#include <stdlib.h>
c3804728 27#include <stdbool.h>
7fafc032 28#include <string.h>
085cce37 29#include <fcntl.h>
b52a01ee 30#include <getopt.h>
3ebdb81e 31#include <sys/file.h>
820fc48f 32#include <sys/time.h>
1e03b754
KS
33#include <sys/prctl.h>
34#include <sys/socket.h>
35#include <sys/signalfd.h>
ff2c503d 36#include <sys/epoll.h>
ede34445 37#include <sys/mount.h>
138068d6 38#include <sys/wait.h>
dc117daa 39#include <sys/stat.h>
c895fd00 40#include <sys/ioctl.h>
01618658 41#include <sys/inotify.h>
7fafc032 42
392ef7a2 43#include "sd-daemon.h"
693d371d 44#include "sd-event.h"
8314de1d
TG
45
46#include "signal-util.h"
693d371d 47#include "event-util.h"
d7b8eec7 48#include "rtnl-util.h"
194bbe33 49#include "cgroup-util.h"
4fa4d885 50#include "process-util.h"
5ba2dc25 51#include "dev-setup.h"
a5c32cff 52#include "fileio.h"
d7b8eec7
LP
53#include "selinux-util.h"
54#include "udev.h"
55#include "udev-util.h"
6482f626 56#include "formats-util.h"
a505965d 57#include "hashmap.h"
7fafc032 58
bba7a484
TG
59static bool arg_debug = false;
60static int arg_daemonize = false;
61static int arg_resolve_names = 1;
020328e1 62static unsigned arg_children_max;
bba7a484
TG
63static int arg_exec_delay;
64static usec_t arg_event_timeout_usec = 180 * USEC_PER_SEC;
65static usec_t arg_event_timeout_warn_usec = 180 * USEC_PER_SEC / 3;
c0c6806b
TG
66
67typedef struct Manager {
68 struct udev *udev;
693d371d 69 sd_event *event;
c0c6806b 70 Hashmap *workers;
ecb17862 71 struct udev_list_node events;
c26d1879 72 const char *cgroup;
cb49a4f2 73 pid_t pid; /* the process that originally allocated the manager object */
c0c6806b 74
ecb17862 75 struct udev_rules *rules;
c0c6806b
TG
76 struct udev_list properties;
77
78 struct udev_monitor *monitor;
79 struct udev_ctrl *ctrl;
80 struct udev_ctrl_connection *ctrl_conn_blocking;
e237d8cb 81 int fd_inotify;
e237d8cb
TG
82 int worker_watch[2];
83
693d371d
TG
84 sd_event_source *ctrl_event;
85 sd_event_source *uevent_event;
86 sd_event_source *inotify_event;
87
7c4c7e89
TG
88 usec_t last_usec;
89
c0c6806b 90 bool stop_exec_queue:1;
c0c6806b
TG
91 bool exit:1;
92} Manager;
1e03b754 93
1e03b754 94enum event_state {
912541b0
KS
95 EVENT_UNDEF,
96 EVENT_QUEUED,
97 EVENT_RUNNING,
1e03b754
KS
98};
99
100struct event {
912541b0 101 struct udev_list_node node;
cb49a4f2 102 Manager *manager;
912541b0
KS
103 struct udev *udev;
104 struct udev_device *dev;
6969c349 105 struct udev_device *dev_kernel;
c6aa11f2 106 struct worker *worker;
912541b0 107 enum event_state state;
912541b0
KS
108 unsigned long long int delaying_seqnum;
109 unsigned long long int seqnum;
110 const char *devpath;
111 size_t devpath_len;
112 const char *devpath_old;
113 dev_t devnum;
912541b0 114 int ifindex;
ea6039a3 115 bool is_block;
693d371d
TG
116 sd_event_source *timeout_warning;
117 sd_event_source *timeout;
1e03b754
KS
118};
119
9ec6e95b 120static inline struct event *node_to_event(struct udev_list_node *node) {
b27ee00b 121 return container_of(node, struct event, node);
1e03b754
KS
122}
123
ecb17862 124static void event_queue_cleanup(Manager *manager, enum event_state type);
ff2c503d 125
1e03b754 126enum worker_state {
912541b0
KS
127 WORKER_UNDEF,
128 WORKER_RUNNING,
129 WORKER_IDLE,
130 WORKER_KILLED,
1e03b754
KS
131};
132
133struct worker {
c0c6806b 134 Manager *manager;
912541b0 135 struct udev_list_node node;
912541b0
KS
136 int refcount;
137 pid_t pid;
138 struct udev_monitor *monitor;
139 enum worker_state state;
140 struct event *event;
1e03b754
KS
141};
142
143/* passed from worker to main process */
144struct worker_message {
1e03b754
KS
145};
146
c6aa11f2 147static void event_free(struct event *event) {
cb49a4f2
TG
148 int r;
149
c6aa11f2
TG
150 if (!event)
151 return;
152
912541b0 153 udev_list_node_remove(&event->node);
912541b0 154 udev_device_unref(event->dev);
6969c349 155 udev_device_unref(event->dev_kernel);
c6aa11f2 156
693d371d
TG
157 sd_event_source_unref(event->timeout_warning);
158 sd_event_source_unref(event->timeout);
159
c6aa11f2
TG
160 if (event->worker)
161 event->worker->event = NULL;
162
cb49a4f2
TG
163 assert(event->manager);
164
165 if (udev_list_node_is_empty(&event->manager->events)) {
166 /* only clean up the queue from the process that created it */
167 if (event->manager->pid == getpid()) {
168 r = unlink("/run/udev/queue");
169 if (r < 0)
170 log_warning_errno(errno, "could not unlink /run/udev/queue: %m");
171 }
172 }
173
912541b0 174 free(event);
aa8734ff 175}
7a770250 176
c6aa11f2
TG
177static void worker_free(struct worker *worker) {
178 if (!worker)
179 return;
bc113de9 180
c0c6806b
TG
181 assert(worker->manager);
182
183 hashmap_remove(worker->manager->workers, UINT_TO_PTR(worker->pid));
912541b0 184 udev_monitor_unref(worker->monitor);
c6aa11f2
TG
185 event_free(worker->event);
186
c6aa11f2 187 free(worker);
ff2c503d
KS
188}
189
c0c6806b 190static void manager_workers_free(Manager *manager) {
a505965d
TG
191 struct worker *worker;
192 Iterator i;
ff2c503d 193
c0c6806b
TG
194 assert(manager);
195
196 HASHMAP_FOREACH(worker, manager->workers, i)
c6aa11f2 197 worker_free(worker);
a505965d 198
c0c6806b 199 manager->workers = hashmap_free(manager->workers);
fc465079
KS
200}
201
c0c6806b 202static int worker_new(struct worker **ret, Manager *manager, struct udev_monitor *worker_monitor, pid_t pid) {
a505965d
TG
203 _cleanup_free_ struct worker *worker = NULL;
204 int r;
3a19b32a
TG
205
206 assert(ret);
c0c6806b 207 assert(manager);
3a19b32a
TG
208 assert(worker_monitor);
209 assert(pid > 1);
210
211 worker = new0(struct worker, 1);
212 if (!worker)
213 return -ENOMEM;
214
39c19cf1 215 worker->refcount = 1;
c0c6806b 216 worker->manager = manager;
3a19b32a
TG
217 /* close monitor, but keep address around */
218 udev_monitor_disconnect(worker_monitor);
219 worker->monitor = udev_monitor_ref(worker_monitor);
220 worker->pid = pid;
a505965d 221
c0c6806b 222 r = hashmap_ensure_allocated(&manager->workers, NULL);
a505965d
TG
223 if (r < 0)
224 return r;
225
c0c6806b 226 r = hashmap_put(manager->workers, UINT_TO_PTR(pid), worker);
a505965d
TG
227 if (r < 0)
228 return r;
229
3a19b32a 230 *ret = worker;
a505965d 231 worker = NULL;
3a19b32a
TG
232
233 return 0;
234}
235
4fa4d885
TG
236static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
237 struct event *event = userdata;
238
239 assert(event);
240 assert(event->worker);
241
242 kill_and_sigcont(event->worker->pid, SIGKILL);
243 event->worker->state = WORKER_KILLED;
244
245 log_error("seq %llu '%s' killed", udev_device_get_seqnum(event->dev), event->devpath);
246
247 return 1;
248}
249
250static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
251 struct event *event = userdata;
252
253 assert(event);
254
255 log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event->dev), event->devpath);
256
257 return 1;
258}
259
39c19cf1 260static void worker_attach_event(struct worker *worker, struct event *event) {
693d371d
TG
261 sd_event *e;
262 uint64_t usec;
263 int r;
264
c6aa11f2 265 assert(worker);
693d371d 266 assert(worker->manager);
c6aa11f2
TG
267 assert(event);
268 assert(!event->worker);
269 assert(!worker->event);
270
39c19cf1 271 worker->state = WORKER_RUNNING;
39c19cf1
TG
272 worker->event = event;
273 event->state = EVENT_RUNNING;
c6aa11f2 274 event->worker = worker;
693d371d
TG
275
276 e = worker->manager->event;
277
278 r = sd_event_now(e, clock_boottime_or_monotonic(), &usec);
279 if (r < 0)
280 return;
281
282 (void) sd_event_add_time(e, &event->timeout_warning, clock_boottime_or_monotonic(),
283 usec + arg_event_timeout_warn_usec, USEC_PER_SEC, on_event_timeout_warning, event);
284
285 (void) sd_event_add_time(e, &event->timeout, clock_boottime_or_monotonic(),
286 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
39c19cf1
TG
287}
288
e237d8cb
TG
289static void manager_free(Manager *manager) {
290 if (!manager)
291 return;
292
b2d21d93
TG
293 udev_builtin_exit(manager->udev);
294
693d371d
TG
295 sd_event_source_unref(manager->ctrl_event);
296 sd_event_source_unref(manager->uevent_event);
297 sd_event_source_unref(manager->inotify_event);
298
e237d8cb 299 udev_unref(manager->udev);
693d371d 300 sd_event_unref(manager->event);
e237d8cb
TG
301 manager_workers_free(manager);
302 event_queue_cleanup(manager, EVENT_UNDEF);
303
304 udev_monitor_unref(manager->monitor);
305 udev_ctrl_unref(manager->ctrl);
306 udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
307
308 udev_list_cleanup(&manager->properties);
309 udev_rules_unref(manager->rules);
e237d8cb 310
e237d8cb
TG
311 safe_close(manager->fd_inotify);
312 safe_close_pair(manager->worker_watch);
313
314 free(manager);
315}
316
317DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
318
9a73bd7c
TG
319static int worker_send_message(int fd) {
320 struct worker_message message = {};
321
322 return loop_write(fd, &message, sizeof(message), false);
323}
324
c0c6806b 325static void worker_spawn(Manager *manager, struct event *event) {
912541b0 326 struct udev *udev = event->udev;
3a19b32a 327 _cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
912541b0
KS
328 pid_t pid;
329
330 /* listen for new events */
331 worker_monitor = udev_monitor_new_from_netlink(udev, NULL);
332 if (worker_monitor == NULL)
333 return;
334 /* allow the main daemon netlink address to send devices to the worker */
c0c6806b 335 udev_monitor_allow_unicast_sender(worker_monitor, manager->monitor);
912541b0
KS
336 udev_monitor_enable_receiving(worker_monitor);
337
912541b0
KS
338 pid = fork();
339 switch (pid) {
340 case 0: {
341 struct udev_device *dev = NULL;
2dd9f98d 342 _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
912541b0 343 int fd_monitor;
e237d8cb 344 _cleanup_close_ int fd_signal = -1, fd_ep = -1;
2dd9f98d
TG
345 struct epoll_event ep_signal = { .events = EPOLLIN };
346 struct epoll_event ep_monitor = { .events = EPOLLIN };
912541b0 347 sigset_t mask;
6af5e6a4 348 int r = 0;
912541b0 349
43095991 350 /* take initial device from queue */
912541b0
KS
351 dev = event->dev;
352 event->dev = NULL;
353
39fd2ca1
TG
354 unsetenv("NOTIFY_SOCKET");
355
c0c6806b 356 manager_workers_free(manager);
ecb17862 357 event_queue_cleanup(manager, EVENT_UNDEF);
6d1b1e0b 358
e237d8cb 359 manager->monitor = udev_monitor_unref(manager->monitor);
6d1b1e0b 360 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
e237d8cb 361 manager->ctrl = udev_ctrl_unref(manager->ctrl);
693d371d 362 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
e237d8cb 363 manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
912541b0 364
693d371d
TG
365 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
366 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
367 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
368
369 manager->event = sd_event_unref(manager->event);
370
912541b0
KS
371 sigfillset(&mask);
372 fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
373 if (fd_signal < 0) {
6af5e6a4 374 r = log_error_errno(errno, "error creating signalfd %m");
912541b0
KS
375 goto out;
376 }
2dd9f98d
TG
377 ep_signal.data.fd = fd_signal;
378
379 fd_monitor = udev_monitor_get_fd(worker_monitor);
380 ep_monitor.data.fd = fd_monitor;
912541b0
KS
381
382 fd_ep = epoll_create1(EPOLL_CLOEXEC);
383 if (fd_ep < 0) {
6af5e6a4 384 r = log_error_errno(errno, "error creating epoll fd: %m");
912541b0
KS
385 goto out;
386 }
387
912541b0
KS
388 if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
389 epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) {
6af5e6a4 390 r = log_error_errno(errno, "fail to add fds to epoll: %m");
912541b0
KS
391 goto out;
392 }
393
394 /* request TERM signal if parent exits */
395 prctl(PR_SET_PDEATHSIG, SIGTERM);
396
145dae7e 397 /* reset OOM score, we only protect the main daemon */
574d5f2d 398 write_string_file("/proc/self/oom_score_adj", "0");
145dae7e 399
912541b0
KS
400 for (;;) {
401 struct udev_event *udev_event;
6af5e6a4 402 int fd_lock = -1;
912541b0 403
3b64e4d4
TG
404 assert(dev);
405
9f6445e3 406 log_debug("seq %llu running", udev_device_get_seqnum(dev));
912541b0
KS
407 udev_event = udev_event_new(dev);
408 if (udev_event == NULL) {
6af5e6a4 409 r = -ENOMEM;
912541b0
KS
410 goto out;
411 }
412
bba7a484
TG
413 if (arg_exec_delay > 0)
414 udev_event->exec_delay = arg_exec_delay;
912541b0 415
3ebdb81e 416 /*
2e5b17d0 417 * Take a shared lock on the device node; this establishes
3ebdb81e 418 * a concept of device "ownership" to serialize device
2e5b17d0 419 * access. External processes holding an exclusive lock will
3ebdb81e 420 * cause udev to skip the event handling; in the case udev
2e5b17d0 421 * acquired the lock, the external process can block until
3ebdb81e
KS
422 * udev has finished its event handling.
423 */
2e5b17d0
KS
424 if (!streq_ptr(udev_device_get_action(dev), "remove") &&
425 streq_ptr("block", udev_device_get_subsystem(dev)) &&
426 !startswith(udev_device_get_sysname(dev), "dm-") &&
427 !startswith(udev_device_get_sysname(dev), "md")) {
3ebdb81e
KS
428 struct udev_device *d = dev;
429
430 if (streq_ptr("partition", udev_device_get_devtype(d)))
431 d = udev_device_get_parent(d);
432
433 if (d) {
434 fd_lock = open(udev_device_get_devnode(d), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
435 if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
56f64d95 436 log_debug_errno(errno, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
3d06f418 437 fd_lock = safe_close(fd_lock);
6af5e6a4 438 r = -EAGAIN;
3ebdb81e
KS
439 goto skip;
440 }
441 }
442 }
443
4c83d994
TG
444 /* needed for renaming netifs */
445 udev_event->rtnl = rtnl;
446
912541b0 447 /* apply rules, create node, symlinks */
adeba500
KS
448 udev_event_execute_rules(udev_event,
449 arg_event_timeout_usec, arg_event_timeout_warn_usec,
c0c6806b 450 &manager->properties,
8314de1d 451 manager->rules);
adeba500
KS
452
453 udev_event_execute_run(udev_event,
8314de1d 454 arg_event_timeout_usec, arg_event_timeout_warn_usec);
912541b0 455
523c620b
TG
456 if (udev_event->rtnl)
457 /* in case rtnl was initialized */
458 rtnl = sd_rtnl_ref(udev_event->rtnl);
4c83d994 459
912541b0 460 /* apply/restore inotify watch */
bf9bead1 461 if (udev_event->inotify_watch) {
912541b0
KS
462 udev_watch_begin(udev, dev);
463 udev_device_update_db(dev);
464 }
465
3d06f418 466 safe_close(fd_lock);
3ebdb81e 467
912541b0
KS
468 /* send processed event back to libudev listeners */
469 udev_monitor_send_device(worker_monitor, NULL, dev);
470
3ebdb81e 471skip:
4914cb2d 472 log_debug("seq %llu processed", udev_device_get_seqnum(dev));
b66f29a1 473
912541b0 474 /* send udevd the result of the event execution */
e237d8cb 475 r = worker_send_message(manager->worker_watch[WRITE_END]);
b66f29a1 476 if (r < 0)
9a73bd7c 477 log_error_errno(r, "failed to send result of seq %llu to main daemon: %m",
b66f29a1 478 udev_device_get_seqnum(dev));
912541b0
KS
479
480 udev_device_unref(dev);
481 dev = NULL;
482
73814ca2 483 udev_event_unref(udev_event);
47e737dc 484
912541b0
KS
485 /* wait for more device messages from main udevd, or term signal */
486 while (dev == NULL) {
487 struct epoll_event ev[4];
488 int fdcount;
489 int i;
490
8fef0ff2 491 fdcount = epoll_wait(fd_ep, ev, ELEMENTSOF(ev), -1);
912541b0
KS
492 if (fdcount < 0) {
493 if (errno == EINTR)
494 continue;
6af5e6a4 495 r = log_error_errno(errno, "failed to poll: %m");
912541b0
KS
496 goto out;
497 }
498
499 for (i = 0; i < fdcount; i++) {
500 if (ev[i].data.fd == fd_monitor && ev[i].events & EPOLLIN) {
501 dev = udev_monitor_receive_device(worker_monitor);
502 break;
503 } else if (ev[i].data.fd == fd_signal && ev[i].events & EPOLLIN) {
504 struct signalfd_siginfo fdsi;
505 ssize_t size;
506
507 size = read(fd_signal, &fdsi, sizeof(struct signalfd_siginfo));
508 if (size != sizeof(struct signalfd_siginfo))
509 continue;
510 switch (fdsi.ssi_signo) {
511 case SIGTERM:
512 goto out;
513 }
514 }
515 }
516 }
517 }
82063a88 518out:
912541b0 519 udev_device_unref(dev);
e237d8cb 520 manager_free(manager);
baa30fbc 521 log_close();
8b46c3fc 522 _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
912541b0
KS
523 }
524 case -1:
912541b0 525 event->state = EVENT_QUEUED;
56f64d95 526 log_error_errno(errno, "fork of child failed: %m");
912541b0
KS
527 break;
528 default:
e03c7cc2
TG
529 {
530 struct worker *worker;
3a19b32a 531 int r;
e03c7cc2 532
c0c6806b 533 r = worker_new(&worker, manager, worker_monitor, pid);
3a19b32a 534 if (r < 0)
e03c7cc2 535 return;
e03c7cc2 536
39c19cf1
TG
537 worker_attach_event(worker, event);
538
1fa2f38f 539 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
912541b0
KS
540 break;
541 }
e03c7cc2 542 }
7fafc032
KS
543}
544
c0c6806b 545static void event_run(Manager *manager, struct event *event) {
a505965d
TG
546 struct worker *worker;
547 Iterator i;
912541b0 548
c0c6806b
TG
549 assert(manager);
550 assert(event);
551
552 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
553 ssize_t count;
554
555 if (worker->state != WORKER_IDLE)
556 continue;
557
c0c6806b 558 count = udev_monitor_send_device(manager->monitor, worker->monitor, event->dev);
912541b0 559 if (count < 0) {
1fa2f38f
ZJS
560 log_error_errno(errno, "worker ["PID_FMT"] did not accept message %zi (%m), kill it",
561 worker->pid, count);
912541b0
KS
562 kill(worker->pid, SIGKILL);
563 worker->state = WORKER_KILLED;
564 continue;
565 }
39c19cf1 566 worker_attach_event(worker, event);
912541b0
KS
567 return;
568 }
569
c0c6806b 570 if (hashmap_size(manager->workers) >= arg_children_max) {
bba7a484 571 if (arg_children_max > 1)
c0c6806b 572 log_debug("maximum number (%i) of children reached", hashmap_size(manager->workers));
912541b0
KS
573 return;
574 }
575
576 /* start new worker and pass initial device */
c0c6806b 577 worker_spawn(manager, event);
1e03b754
KS
578}
579
ecb17862 580static int event_queue_insert(Manager *manager, struct udev_device *dev) {
912541b0 581 struct event *event;
cb49a4f2 582 int r;
912541b0 583
ecb17862
TG
584 assert(manager);
585 assert(dev);
586
040e6896
TG
587 /* only one process can add events to the queue */
588 if (manager->pid == 0)
589 manager->pid = getpid();
590
cb49a4f2
TG
591 assert(manager->pid == getpid());
592
955d98c9 593 event = new0(struct event, 1);
cb49a4f2
TG
594 if (!event)
595 return -ENOMEM;
912541b0
KS
596
597 event->udev = udev_device_get_udev(dev);
cb49a4f2 598 event->manager = manager;
912541b0 599 event->dev = dev;
6969c349
TG
600 event->dev_kernel = udev_device_shallow_clone(dev);
601 udev_device_copy_properties(event->dev_kernel, dev);
912541b0
KS
602 event->seqnum = udev_device_get_seqnum(dev);
603 event->devpath = udev_device_get_devpath(dev);
604 event->devpath_len = strlen(event->devpath);
605 event->devpath_old = udev_device_get_devpath_old(dev);
606 event->devnum = udev_device_get_devnum(dev);
ea6039a3 607 event->is_block = streq("block", udev_device_get_subsystem(dev));
912541b0
KS
608 event->ifindex = udev_device_get_ifindex(dev);
609
9f6445e3 610 log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev),
912541b0
KS
611 udev_device_get_action(dev), udev_device_get_subsystem(dev));
612
613 event->state = EVENT_QUEUED;
cb49a4f2
TG
614
615 if (udev_list_node_is_empty(&manager->events)) {
616 r = touch("/run/udev/queue");
617 if (r < 0)
618 log_warning_errno(r, "could not touch /run/udev/queue: %m");
619 }
620
ecb17862 621 udev_list_node_append(&event->node, &manager->events);
cb49a4f2 622
912541b0 623 return 0;
fc465079
KS
624}
625
c0c6806b 626static void manager_kill_workers(Manager *manager) {
a505965d
TG
627 struct worker *worker;
628 Iterator i;
1e03b754 629
c0c6806b
TG
630 assert(manager);
631
632 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
633 if (worker->state == WORKER_KILLED)
634 continue;
1e03b754 635
912541b0
KS
636 worker->state = WORKER_KILLED;
637 kill(worker->pid, SIGTERM);
638 }
1e03b754
KS
639}
640
e3196993 641/* lookup event for identical, parent, child device */
ecb17862 642static bool is_devpath_busy(Manager *manager, struct event *event) {
912541b0
KS
643 struct udev_list_node *loop;
644 size_t common;
645
646 /* check if queue contains events we depend on */
ecb17862 647 udev_list_node_foreach(loop, &manager->events) {
912541b0
KS
648 struct event *loop_event = node_to_event(loop);
649
650 /* we already found a later event, earlier can not block us, no need to check again */
651 if (loop_event->seqnum < event->delaying_seqnum)
652 continue;
653
654 /* event we checked earlier still exists, no need to check again */
655 if (loop_event->seqnum == event->delaying_seqnum)
656 return true;
657
658 /* found ourself, no later event can block us */
659 if (loop_event->seqnum >= event->seqnum)
660 break;
661
662 /* check major/minor */
663 if (major(event->devnum) != 0 && event->devnum == loop_event->devnum && event->is_block == loop_event->is_block)
664 return true;
665
666 /* check network device ifindex */
667 if (event->ifindex != 0 && event->ifindex == loop_event->ifindex)
668 return true;
669
670 /* check our old name */
090be865 671 if (event->devpath_old != NULL && streq(loop_event->devpath, event->devpath_old)) {
912541b0
KS
672 event->delaying_seqnum = loop_event->seqnum;
673 return true;
674 }
675
676 /* compare devpath */
677 common = MIN(loop_event->devpath_len, event->devpath_len);
678
679 /* one devpath is contained in the other? */
680 if (memcmp(loop_event->devpath, event->devpath, common) != 0)
681 continue;
682
683 /* identical device event found */
684 if (loop_event->devpath_len == event->devpath_len) {
685 /* devices names might have changed/swapped in the meantime */
686 if (major(event->devnum) != 0 && (event->devnum != loop_event->devnum || event->is_block != loop_event->is_block))
687 continue;
688 if (event->ifindex != 0 && event->ifindex != loop_event->ifindex)
689 continue;
690 event->delaying_seqnum = loop_event->seqnum;
691 return true;
692 }
693
694 /* parent device event found */
695 if (event->devpath[common] == '/') {
696 event->delaying_seqnum = loop_event->seqnum;
697 return true;
698 }
699
700 /* child device event found */
701 if (loop_event->devpath[common] == '/') {
702 event->delaying_seqnum = loop_event->seqnum;
703 return true;
704 }
705
706 /* no matching device */
707 continue;
708 }
709
710 return false;
7fafc032
KS
711}
712
693d371d
TG
713static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
714 Manager *manager = userdata;
715
716 assert(manager);
717
718 log_error_errno(ETIMEDOUT, "giving up waiting for workers to finish");
719
720 sd_event_exit(manager->event, -ETIMEDOUT);
721
722 return 1;
723}
724
62d43dac 725static void manager_exit(Manager *manager) {
693d371d
TG
726 uint64_t usec;
727 int r;
62d43dac
TG
728
729 assert(manager);
730
731 manager->exit = true;
732
b79aacbf
TG
733 sd_notify(false,
734 "STOPPING=1\n"
735 "STATUS=Starting shutdown...");
736
62d43dac 737 /* close sources of new events and discard buffered events */
693d371d
TG
738 manager->ctrl = udev_ctrl_unref(manager->ctrl);
739 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
62d43dac 740
693d371d
TG
741 manager->fd_inotify = safe_close(manager->fd_inotify);
742 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
62d43dac 743
693d371d
TG
744 manager->monitor = udev_monitor_unref(manager->monitor);
745 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
62d43dac
TG
746
747 /* discard queued events and kill workers */
748 event_queue_cleanup(manager, EVENT_QUEUED);
749 manager_kill_workers(manager);
693d371d
TG
750
751 r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
752 if (r < 0)
753 return;
754
755 r = sd_event_add_time(manager->event, NULL, clock_boottime_or_monotonic(),
756 usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
757 if (r < 0)
758 return;
62d43dac
TG
759}
760
761/* reload requested, HUP signal received, rules changed, builtin changed */
762static void manager_reload(Manager *manager) {
763
764 assert(manager);
765
b79aacbf
TG
766 sd_notify(false,
767 "RELOADING=1\n"
768 "STATUS=Flushing configuration...");
769
62d43dac
TG
770 manager_kill_workers(manager);
771 manager->rules = udev_rules_unref(manager->rules);
772 udev_builtin_exit(manager->udev);
b79aacbf
TG
773
774 sd_notify(false,
775 "READY=1\n"
776 "STATUS=Processing...");
62d43dac
TG
777}
778
c0c6806b 779static void event_queue_start(Manager *manager) {
912541b0 780 struct udev_list_node *loop;
693d371d
TG
781 usec_t usec;
782 int r;
8ab44e3f 783
c0c6806b
TG
784 assert(manager);
785
7c4c7e89
TG
786 if (udev_list_node_is_empty(&manager->events) ||
787 manager->exit || manager->stop_exec_queue)
788 return;
789
693d371d
TG
790 r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
791 if (r >= 0) {
792 /* check for changed config, every 3 seconds at most */
793 if (manager->last_usec == 0 ||
794 (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
795 if (udev_rules_check_timestamp(manager->rules) ||
796 udev_builtin_validate(manager->udev))
797 manager_reload(manager);
798
799 manager->last_usec = usec;
800 }
7c4c7e89
TG
801 }
802
803 udev_builtin_init(manager->udev);
804
805 if (!manager->rules) {
806 manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
807 if (!manager->rules)
808 return;
809 }
810
ecb17862 811 udev_list_node_foreach(loop, &manager->events) {
912541b0 812 struct event *event = node_to_event(loop);
0bc74ea7 813
912541b0
KS
814 if (event->state != EVENT_QUEUED)
815 continue;
0bc74ea7 816
912541b0 817 /* do not start event if parent or child event is still running */
ecb17862 818 if (is_devpath_busy(manager, event))
912541b0 819 continue;
fc465079 820
c0c6806b 821 event_run(manager, event);
912541b0 822 }
1e03b754
KS
823}
824
ecb17862 825static void event_queue_cleanup(Manager *manager, enum event_state match_type) {
912541b0 826 struct udev_list_node *loop, *tmp;
ff2c503d 827
ecb17862 828 udev_list_node_foreach_safe(loop, tmp, &manager->events) {
912541b0 829 struct event *event = node_to_event(loop);
ff2c503d 830
912541b0
KS
831 if (match_type != EVENT_UNDEF && match_type != event->state)
832 continue;
ff2c503d 833
c6aa11f2 834 event_free(event);
912541b0 835 }
ff2c503d
KS
836}
837
e82e8fa5 838static int on_worker(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b
TG
839 Manager *manager = userdata;
840
841 assert(manager);
842
912541b0
KS
843 for (;;) {
844 struct worker_message msg;
979558f3
TG
845 struct iovec iovec = {
846 .iov_base = &msg,
847 .iov_len = sizeof(msg),
848 };
849 union {
850 struct cmsghdr cmsghdr;
851 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
852 } control = {};
853 struct msghdr msghdr = {
854 .msg_iov = &iovec,
855 .msg_iovlen = 1,
856 .msg_control = &control,
857 .msg_controllen = sizeof(control),
858 };
859 struct cmsghdr *cmsg;
912541b0 860 ssize_t size;
979558f3 861 struct ucred *ucred = NULL;
a505965d 862 struct worker *worker;
912541b0 863
e82e8fa5 864 size = recvmsg(fd, &msghdr, MSG_DONTWAIT);
979558f3 865 if (size < 0) {
738a7907
TG
866 if (errno == EINTR)
867 continue;
868 else if (errno == EAGAIN)
869 /* nothing more to read */
870 break;
979558f3 871
e82e8fa5 872 return log_error_errno(errno, "failed to receive message: %m");
979558f3
TG
873 } else if (size != sizeof(struct worker_message)) {
874 log_warning_errno(EIO, "ignoring worker message with invalid size %zi bytes", size);
e82e8fa5 875 continue;
979558f3
TG
876 }
877
878 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
879 if (cmsg->cmsg_level == SOL_SOCKET &&
880 cmsg->cmsg_type == SCM_CREDENTIALS &&
881 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
882 ucred = (struct ucred*) CMSG_DATA(cmsg);
883 }
884
885 if (!ucred || ucred->pid <= 0) {
886 log_warning_errno(EIO, "ignoring worker message without valid PID");
887 continue;
888 }
912541b0
KS
889
890 /* lookup worker who sent the signal */
c0c6806b 891 worker = hashmap_get(manager->workers, UINT_TO_PTR(ucred->pid));
a505965d
TG
892 if (!worker) {
893 log_debug("worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
894 continue;
912541b0 895 }
c0bbfd72 896
a505965d
TG
897 if (worker->state != WORKER_KILLED)
898 worker->state = WORKER_IDLE;
899
900 /* worker returned */
901 event_free(worker->event);
912541b0 902 }
e82e8fa5 903
8302fe5a
TG
904 /* we have free workers, try to schedule events */
905 event_queue_start(manager);
906
e82e8fa5
TG
907 return 1;
908}
909
910static int on_uevent(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 911 Manager *manager = userdata;
e82e8fa5
TG
912 struct udev_device *dev;
913 int r;
914
c0c6806b 915 assert(manager);
e82e8fa5 916
c0c6806b 917 dev = udev_monitor_receive_device(manager->monitor);
e82e8fa5
TG
918 if (dev) {
919 udev_device_ensure_usec_initialized(dev, NULL);
ecb17862 920 r = event_queue_insert(manager, dev);
e82e8fa5
TG
921 if (r < 0)
922 udev_device_unref(dev);
8302fe5a
TG
923 else
924 /* we have fresh events, try to schedule them */
925 event_queue_start(manager);
e82e8fa5
TG
926 }
927
928 return 1;
88f4b648
KS
929}
930
3b47c739 931/* receive the udevd message from userspace */
e82e8fa5 932static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 933 Manager *manager = userdata;
e4f66b77
TG
934 _cleanup_udev_ctrl_connection_unref_ struct udev_ctrl_connection *ctrl_conn = NULL;
935 _cleanup_udev_ctrl_msg_unref_ struct udev_ctrl_msg *ctrl_msg = NULL;
912541b0
KS
936 const char *str;
937 int i;
938
c0c6806b 939 assert(manager);
e4f66b77 940
c0c6806b 941 ctrl_conn = udev_ctrl_get_connection(manager->ctrl);
e4f66b77 942 if (!ctrl_conn)
e82e8fa5 943 return 1;
912541b0
KS
944
945 ctrl_msg = udev_ctrl_receive_msg(ctrl_conn);
e4f66b77 946 if (!ctrl_msg)
e82e8fa5 947 return 1;
912541b0
KS
948
949 i = udev_ctrl_get_set_log_level(ctrl_msg);
950 if (i >= 0) {
ed14edc0 951 log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i);
baa30fbc 952 log_set_max_level(i);
c0c6806b 953 manager_kill_workers(manager);
912541b0
KS
954 }
955
956 if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
9f6445e3 957 log_debug("udevd message (STOP_EXEC_QUEUE) received");
c0c6806b 958 manager->stop_exec_queue = true;
912541b0
KS
959 }
960
961 if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
9f6445e3 962 log_debug("udevd message (START_EXEC_QUEUE) received");
c0c6806b 963 manager->stop_exec_queue = false;
8302fe5a 964 event_queue_start(manager);
912541b0
KS
965 }
966
967 if (udev_ctrl_get_reload(ctrl_msg) > 0) {
9f6445e3 968 log_debug("udevd message (RELOAD) received");
62d43dac 969 manager_reload(manager);
912541b0
KS
970 }
971
972 str = udev_ctrl_get_set_env(ctrl_msg);
973 if (str != NULL) {
c0c6806b 974 _cleanup_free_ char *key = NULL;
912541b0
KS
975
976 key = strdup(str);
c0c6806b 977 if (key) {
912541b0
KS
978 char *val;
979
980 val = strchr(key, '=');
981 if (val != NULL) {
982 val[0] = '\0';
983 val = &val[1];
984 if (val[0] == '\0') {
9f6445e3 985 log_debug("udevd message (ENV) received, unset '%s'", key);
c0c6806b 986 udev_list_entry_add(&manager->properties, key, NULL);
912541b0 987 } else {
9f6445e3 988 log_debug("udevd message (ENV) received, set '%s=%s'", key, val);
c0c6806b 989 udev_list_entry_add(&manager->properties, key, val);
912541b0 990 }
c0c6806b 991 } else
9f6445e3 992 log_error("wrong key format '%s'", key);
912541b0 993 }
c0c6806b 994 manager_kill_workers(manager);
912541b0
KS
995 }
996
997 i = udev_ctrl_get_set_children_max(ctrl_msg);
998 if (i >= 0) {
9f6445e3 999 log_debug("udevd message (SET_MAX_CHILDREN) received, children_max=%i", i);
bba7a484 1000 arg_children_max = i;
912541b0
KS
1001 }
1002
cb49a4f2 1003 if (udev_ctrl_get_ping(ctrl_msg) > 0)
9f6445e3 1004 log_debug("udevd message (SYNC) received");
912541b0
KS
1005
1006 if (udev_ctrl_get_exit(ctrl_msg) > 0) {
9f6445e3 1007 log_debug("udevd message (EXIT) received");
62d43dac 1008 manager_exit(manager);
c0c6806b
TG
1009 /* keep reference to block the client until we exit
1010 TODO: deal with several blocking exit requests */
1011 manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
912541b0 1012 }
e4f66b77 1013
e82e8fa5 1014 return 1;
88f4b648 1015}
4a231017 1016
f3a740a5 1017static int synthesize_change(struct udev_device *dev) {
edd32000 1018 char filename[UTIL_PATH_SIZE];
f3a740a5 1019 int r;
edd32000 1020
f3a740a5 1021 if (streq_ptr("block", udev_device_get_subsystem(dev)) &&
ede34445 1022 streq_ptr("disk", udev_device_get_devtype(dev)) &&
638ca89c 1023 !startswith(udev_device_get_sysname(dev), "dm-")) {
e9fc29f4
KS
1024 bool part_table_read = false;
1025 bool has_partitions = false;
ede34445 1026 int fd;
f3a740a5
KS
1027 struct udev *udev = udev_device_get_udev(dev);
1028 _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
1029 struct udev_list_entry *item;
1030
ede34445 1031 /*
e9fc29f4
KS
1032 * Try to re-read the partition table. This only succeeds if
1033 * none of the devices is busy. The kernel returns 0 if no
1034 * partition table is found, and we will not get an event for
1035 * the disk.
ede34445 1036 */
02ba8fb3 1037 fd = open(udev_device_get_devnode(dev), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
ede34445 1038 if (fd >= 0) {
02ba8fb3
KS
1039 r = flock(fd, LOCK_EX|LOCK_NB);
1040 if (r >= 0)
1041 r = ioctl(fd, BLKRRPART, 0);
1042
ede34445
KS
1043 close(fd);
1044 if (r >= 0)
e9fc29f4 1045 part_table_read = true;
ede34445
KS
1046 }
1047
e9fc29f4 1048 /* search for partitions */
f3a740a5
KS
1049 e = udev_enumerate_new(udev);
1050 if (!e)
1051 return -ENOMEM;
1052
1053 r = udev_enumerate_add_match_parent(e, dev);
1054 if (r < 0)
1055 return r;
1056
1057 r = udev_enumerate_add_match_subsystem(e, "block");
1058 if (r < 0)
1059 return r;
1060
1061 r = udev_enumerate_scan_devices(e);
47a3fa0f
TA
1062 if (r < 0)
1063 return r;
e9fc29f4
KS
1064
1065 udev_list_entry_foreach(item, udev_enumerate_get_list_entry(e)) {
1066 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
1067
1068 d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
1069 if (!d)
1070 continue;
1071
1072 if (!streq_ptr("partition", udev_device_get_devtype(d)))
1073 continue;
1074
1075 has_partitions = true;
1076 break;
1077 }
1078
1079 /*
1080 * We have partitions and re-read the table, the kernel already sent
1081 * out a "change" event for the disk, and "remove/add" for all
1082 * partitions.
1083 */
1084 if (part_table_read && has_partitions)
1085 return 0;
1086
1087 /*
1088 * We have partitions but re-reading the partition table did not
1089 * work, synthesize "change" for the disk and all partitions.
1090 */
1091 log_debug("device %s closed, synthesising 'change'", udev_device_get_devnode(dev));
1092 strscpyl(filename, sizeof(filename), udev_device_get_syspath(dev), "/uevent", NULL);
1093 write_string_file(filename, "change");
1094
f3a740a5
KS
1095 udev_list_entry_foreach(item, udev_enumerate_get_list_entry(e)) {
1096 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
1097
1098 d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
1099 if (!d)
1100 continue;
1101
1102 if (!streq_ptr("partition", udev_device_get_devtype(d)))
1103 continue;
1104
1105 log_debug("device %s closed, synthesising partition '%s' 'change'",
1106 udev_device_get_devnode(dev), udev_device_get_devnode(d));
1107 strscpyl(filename, sizeof(filename), udev_device_get_syspath(d), "/uevent", NULL);
1108 write_string_file(filename, "change");
1109 }
ede34445
KS
1110
1111 return 0;
f3a740a5
KS
1112 }
1113
ede34445
KS
1114 log_debug("device %s closed, synthesising 'change'", udev_device_get_devnode(dev));
1115 strscpyl(filename, sizeof(filename), udev_device_get_syspath(dev), "/uevent", NULL);
1116 write_string_file(filename, "change");
1117
f3a740a5 1118 return 0;
edd32000
KS
1119}
1120
e82e8fa5 1121static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1122 Manager *manager = userdata;
0254e944 1123 union inotify_event_buffer buffer;
f7c1ad4f
LP
1124 struct inotify_event *e;
1125 ssize_t l;
912541b0 1126
c0c6806b 1127 assert(manager);
e82e8fa5
TG
1128
1129 l = read(fd, &buffer, sizeof(buffer));
f7c1ad4f
LP
1130 if (l < 0) {
1131 if (errno == EAGAIN || errno == EINTR)
e82e8fa5 1132 return 1;
912541b0 1133
f7c1ad4f 1134 return log_error_errno(errno, "Failed to read inotify fd: %m");
912541b0
KS
1135 }
1136
f7c1ad4f 1137 FOREACH_INOTIFY_EVENT(e, buffer, l) {
e82e8fa5 1138 _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
912541b0 1139
c0c6806b 1140 dev = udev_watch_lookup(manager->udev, e->wd);
edd32000
KS
1141 if (!dev)
1142 continue;
912541b0 1143
f7c1ad4f 1144 log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev));
a8389097 1145 if (e->mask & IN_CLOSE_WRITE) {
edd32000 1146 synthesize_change(dev);
a8389097
TG
1147
1148 /* settle might be waiting on us to determine the queue
1149 * state. If we just handled an inotify event, we might have
1150 * generated a "change" event, but we won't have queued up
1151 * the resultant uevent yet. Do that.
1152 */
c0c6806b 1153 on_uevent(NULL, -1, 0, manager);
a8389097 1154 } else if (e->mask & IN_IGNORED)
c0c6806b 1155 udev_watch_end(manager->udev, dev);
912541b0
KS
1156 }
1157
e82e8fa5 1158 return 1;
bd284db1
SJR
1159}
1160
0561329d 1161static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1162 Manager *manager = userdata;
1163
1164 assert(manager);
1165
62d43dac 1166 manager_exit(manager);
912541b0 1167
e82e8fa5
TG
1168 return 1;
1169}
912541b0 1170
0561329d 1171static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1172 Manager *manager = userdata;
1173
1174 assert(manager);
1175
62d43dac 1176 manager_reload(manager);
912541b0 1177
e82e8fa5
TG
1178 return 1;
1179}
912541b0 1180
e82e8fa5 1181static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1182 Manager *manager = userdata;
1183
1184 assert(manager);
1185
e82e8fa5
TG
1186 for (;;) {
1187 pid_t pid;
1188 int status;
1189 struct worker *worker;
d1317d02 1190
e82e8fa5
TG
1191 pid = waitpid(-1, &status, WNOHANG);
1192 if (pid <= 0)
f29328d6 1193 break;
e82e8fa5 1194
c0c6806b 1195 worker = hashmap_get(manager->workers, UINT_TO_PTR(pid));
e82e8fa5
TG
1196 if (!worker) {
1197 log_warning("worker ["PID_FMT"] is unknown, ignoring", pid);
f29328d6 1198 continue;
912541b0 1199 }
e82e8fa5
TG
1200
1201 if (WIFEXITED(status)) {
1202 if (WEXITSTATUS(status) == 0)
1203 log_debug("worker ["PID_FMT"] exited", pid);
1204 else
1205 log_warning("worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
1206 } else if (WIFSIGNALED(status)) {
1207 log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
1208 } else if (WIFSTOPPED(status)) {
1209 log_info("worker ["PID_FMT"] stopped", pid);
f29328d6 1210 continue;
e82e8fa5
TG
1211 } else if (WIFCONTINUED(status)) {
1212 log_info("worker ["PID_FMT"] continued", pid);
f29328d6 1213 continue;
e82e8fa5
TG
1214 } else
1215 log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);
1216
1217 if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
1218 if (worker->event) {
1219 log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath);
1220 /* delete state from disk */
1221 udev_device_delete_db(worker->event->dev);
1222 udev_device_tag_index(worker->event->dev, NULL, false);
1223 /* forward kernel event without amending it */
c0c6806b 1224 udev_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
e82e8fa5
TG
1225 }
1226 }
1227
1228 worker_free(worker);
912541b0 1229 }
e82e8fa5 1230
8302fe5a
TG
1231 /* we can start new workers, try to schedule events */
1232 event_queue_start(manager);
1233
e82e8fa5 1234 return 1;
f27125f9 1235}
1236
693d371d
TG
1237static int on_post(sd_event_source *s, void *userdata) {
1238 Manager *manager = userdata;
1239 int r;
1240
1241 assert(manager);
1242
1243 if (udev_list_node_is_empty(&manager->events)) {
1244 /* no pending events */
1245 if (!hashmap_isempty(manager->workers)) {
1246 /* there are idle workers */
1247 log_debug("cleanup idle workers");
1248 manager_kill_workers(manager);
1249 } else {
1250 /* we are idle */
1251 if (manager->exit) {
1252 r = sd_event_exit(manager->event, 0);
1253 if (r < 0)
1254 return r;
1255 } else if (manager->cgroup)
1256 /* cleanup possible left-over processes in our cgroup */
1257 cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, false, true, NULL);
1258 }
1259 }
1260
1261 return 1;
1262}
1263
fcff1e72
TG
1264static int listen_fds(int *rctrl, int *rnetlink) {
1265 int ctrl_fd = -1, netlink_fd = -1;
912541b0
KS
1266 int fd, n;
1267
fcff1e72
TG
1268 assert(rctrl);
1269 assert(rnetlink);
1270
912541b0 1271 n = sd_listen_fds(true);
fcff1e72
TG
1272 if (n < 0)
1273 return n;
912541b0
KS
1274
1275 for (fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) {
1276 if (sd_is_socket(fd, AF_LOCAL, SOCK_SEQPACKET, -1)) {
fcff1e72
TG
1277 if (ctrl_fd >= 0)
1278 return -EINVAL;
1279 ctrl_fd = fd;
912541b0
KS
1280 continue;
1281 }
1282
1283 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1)) {
fcff1e72
TG
1284 if (netlink_fd >= 0)
1285 return -EINVAL;
1286 netlink_fd = fd;
912541b0
KS
1287 continue;
1288 }
1289
fcff1e72 1290 return -EINVAL;
912541b0
KS
1291 }
1292
fcff1e72
TG
1293 if (ctrl_fd < 0 || netlink_fd < 0)
1294 return -EINVAL;
1295
1296 log_debug("ctrl=%i netlink=%i", ctrl_fd, netlink_fd);
1297
1298 *rctrl = ctrl_fd;
1299 *rnetlink = netlink_fd;
912541b0 1300
912541b0 1301 return 0;
7459bcdc
KS
1302}
1303
e6f86cac 1304/*
3f85ef0f 1305 * read the kernel command line, in case we need to get into debug mode
614a823c
TG
1306 * udev.log-priority=<level> syslog priority
1307 * udev.children-max=<number of workers> events are fully serialized if set to 1
1308 * udev.exec-delay=<number of seconds> delay execution of every executed program
1309 * udev.event-timeout=<number of seconds> seconds to wait before terminating an event
e6f86cac 1310 */
614a823c 1311static int parse_proc_cmdline_item(const char *key, const char *value) {
74df0fca 1312 int r;
e6f86cac 1313
614a823c 1314 assert(key);
e6f86cac 1315
614a823c
TG
1316 if (!value)
1317 return 0;
e6f86cac 1318
614a823c
TG
1319 if (startswith(key, "rd."))
1320 key += strlen("rd.");
e6f86cac 1321
614a823c
TG
1322 if (startswith(key, "udev."))
1323 key += strlen("udev.");
1324 else
1325 return 0;
e6f86cac 1326
614a823c
TG
1327 if (streq(key, "log-priority")) {
1328 int prio;
e6f86cac 1329
614a823c
TG
1330 prio = util_log_priority(value);
1331 log_set_max_level(prio);
1332 } else if (streq(key, "children-max")) {
020328e1 1333 r = safe_atou(value, &arg_children_max);
614a823c
TG
1334 if (r < 0)
1335 log_warning("invalid udev.children-max ignored: %s", value);
1336 } else if (streq(key, "exec-delay")) {
1337 r = safe_atoi(value, &arg_exec_delay);
1338 if (r < 0)
1339 log_warning("invalid udev.exec-delay ignored: %s", value);
1340 } else if (streq(key, "event-timeout")) {
1341 r = safe_atou64(value, &arg_event_timeout_usec);
1342 if (r < 0)
1343 log_warning("invalid udev.event-timeout ignored: %s", value);
1344 else {
f1e8664e 1345 arg_event_timeout_usec *= USEC_PER_SEC;
bba7a484 1346 arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
023b9d33 1347 }
e6f86cac 1348 }
614a823c
TG
1349
1350 return 0;
e6f86cac
KS
1351}
1352
ed216e1f
TG
1353static void help(void) {
1354 printf("%s [OPTIONS...]\n\n"
1355 "Manages devices.\n\n"
5ac0162c
LP
1356 " -h --help Print this message\n"
1357 " --version Print version of the program\n"
1358 " --daemon Detach and run in the background\n"
1359 " --debug Enable debug output\n"
1360 " --children-max=INT Set maximum number of workers\n"
1361 " --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1362 " --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1363 " --resolve-names=early|late|never\n"
1364 " When to resolve users and groups\n"
ed216e1f
TG
1365 , program_invocation_short_name);
1366}
1367
bba7a484 1368static int parse_argv(int argc, char *argv[]) {
912541b0 1369 static const struct option options[] = {
bba7a484
TG
1370 { "daemon", no_argument, NULL, 'd' },
1371 { "debug", no_argument, NULL, 'D' },
1372 { "children-max", required_argument, NULL, 'c' },
1373 { "exec-delay", required_argument, NULL, 'e' },
1374 { "event-timeout", required_argument, NULL, 't' },
1375 { "resolve-names", required_argument, NULL, 'N' },
1376 { "help", no_argument, NULL, 'h' },
1377 { "version", no_argument, NULL, 'V' },
912541b0
KS
1378 {}
1379 };
689a97f5 1380
bba7a484 1381 int c;
689a97f5 1382
bba7a484
TG
1383 assert(argc >= 0);
1384 assert(argv);
912541b0 1385
bba7a484 1386 while ((c = getopt_long(argc, argv, "c:de:DtN:hV", options, NULL)) >= 0) {
f1e8664e 1387 int r;
912541b0 1388
bba7a484 1389 switch (c) {
912541b0 1390
912541b0 1391 case 'd':
bba7a484 1392 arg_daemonize = true;
912541b0
KS
1393 break;
1394 case 'c':
020328e1 1395 r = safe_atou(optarg, &arg_children_max);
6f5cf8a8
TG
1396 if (r < 0)
1397 log_warning("Invalid --children-max ignored: %s", optarg);
912541b0
KS
1398 break;
1399 case 'e':
6f5cf8a8
TG
1400 r = safe_atoi(optarg, &arg_exec_delay);
1401 if (r < 0)
1402 log_warning("Invalid --exec-delay ignored: %s", optarg);
912541b0 1403 break;
9719859c 1404 case 't':
f1e8664e
TG
1405 r = safe_atou64(optarg, &arg_event_timeout_usec);
1406 if (r < 0)
65fea570 1407 log_warning("Invalid --event-timeout ignored: %s", optarg);
6f5cf8a8
TG
1408 else {
1409 arg_event_timeout_usec *= USEC_PER_SEC;
1410 arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
1411 }
9719859c 1412 break;
912541b0 1413 case 'D':
bba7a484 1414 arg_debug = true;
912541b0
KS
1415 break;
1416 case 'N':
090be865 1417 if (streq(optarg, "early")) {
bba7a484 1418 arg_resolve_names = 1;
090be865 1419 } else if (streq(optarg, "late")) {
bba7a484 1420 arg_resolve_names = 0;
090be865 1421 } else if (streq(optarg, "never")) {
bba7a484 1422 arg_resolve_names = -1;
912541b0 1423 } else {
9f6445e3 1424 log_error("resolve-names must be early, late or never");
bba7a484 1425 return 0;
912541b0
KS
1426 }
1427 break;
1428 case 'h':
ed216e1f 1429 help();
bba7a484 1430 return 0;
912541b0
KS
1431 case 'V':
1432 printf("%s\n", VERSION);
bba7a484
TG
1433 return 0;
1434 case '?':
1435 return -EINVAL;
912541b0 1436 default:
bba7a484
TG
1437 assert_not_reached("Unhandled option");
1438
912541b0
KS
1439 }
1440 }
1441
bba7a484
TG
1442 return 1;
1443}
1444
c26d1879 1445static int manager_new(Manager **ret, const char *cgroup) {
c0c6806b 1446 _cleanup_(manager_freep) Manager *manager = NULL;
3d7dc8e4 1447 int r, fd_ctrl, fd_uevent;
c0c6806b
TG
1448
1449 assert(ret);
1450
1451 manager = new0(Manager, 1);
1452 if (!manager)
1453 return log_oom();
1454
e237d8cb
TG
1455 manager->fd_inotify = -1;
1456 manager->worker_watch[WRITE_END] = -1;
1457 manager->worker_watch[READ_END] = -1;
1458
c0c6806b
TG
1459 manager->udev = udev_new();
1460 if (!manager->udev)
1461 return log_error_errno(errno, "could not allocate udev context: %m");
1462
b2d21d93
TG
1463 udev_builtin_init(manager->udev);
1464
ecb17862
TG
1465 manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
1466 if (!manager->rules)
1467 return log_error_errno(ENOMEM, "error reading rules");
1468
1469 udev_list_node_init(&manager->events);
1470 udev_list_init(manager->udev, &manager->properties, true);
1471
c26d1879
TG
1472 manager->cgroup = cgroup;
1473
fcff1e72 1474 r = listen_fds(&fd_ctrl, &fd_uevent);
e237d8cb
TG
1475 if (r >= 0) {
1476 /* get control and netlink socket from systemd */
693d371d 1477 manager->ctrl = udev_ctrl_new_from_fd(manager->udev, fd_ctrl);
e237d8cb
TG
1478 if (!manager->ctrl)
1479 return log_error_errno(EINVAL, "error taking over udev control socket");
1480
693d371d 1481 manager->monitor = udev_monitor_new_from_netlink_fd(manager->udev, "kernel", fd_uevent);
e237d8cb
TG
1482 if (!manager->monitor)
1483 return log_error_errno(EINVAL, "error taking over netlink socket");
e237d8cb
TG
1484 } else {
1485 /* open control and netlink socket */
1486 manager->ctrl = udev_ctrl_new(manager->udev);
1487 if (!manager->ctrl)
1488 return log_error_errno(EINVAL, "error initializing udev control socket");
1489
693d371d 1490 fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
e237d8cb
TG
1491
1492 manager->monitor = udev_monitor_new_from_netlink(manager->udev, "kernel");
1493 if (!manager->monitor)
1494 return log_error_errno(EINVAL, "error initializing netlink socket");
1495
693d371d 1496 fd_uevent = udev_monitor_get_fd(manager->monitor);
e237d8cb
TG
1497
1498 (void) udev_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
e237d8cb 1499
bf687163
TG
1500 r = udev_monitor_enable_receiving(manager->monitor);
1501 if (r < 0)
1502 return log_error_errno(EINVAL, "error binding netlink socket");
e237d8cb 1503
bf687163
TG
1504 r = udev_ctrl_enable_receiving(manager->ctrl);
1505 if (r < 0)
1506 return log_error_errno(EINVAL, "error binding udev control socket");
1507 }
e237d8cb 1508
3d7dc8e4
TG
1509 *ret = manager;
1510 manager = NULL;
1511
1512 return 0;
1513}
1514
1515static int manager_listen(Manager *manager) {
3d7dc8e4
TG
1516 int r, fd_worker, one = 1;
1517
1518 assert(manager);
1519
e237d8cb
TG
1520 /* unnamed socket from workers to the main daemon */
1521 r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
1522 if (r < 0)
1523 return log_error_errno(errno, "error creating socketpair: %m");
1524
693d371d 1525 fd_worker = manager->worker_watch[READ_END];
e237d8cb 1526
693d371d 1527 r = setsockopt(fd_worker, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
e237d8cb
TG
1528 if (r < 0)
1529 return log_error_errno(errno, "could not enable SO_PASSCRED: %m");
1530
1531 manager->fd_inotify = udev_watch_init(manager->udev);
1532 if (manager->fd_inotify < 0)
1533 return log_error_errno(ENOMEM, "error initializing inotify");
1534
1535 udev_watch_restore(manager->udev);
1536
1537 /* block and listen to all signals on signalfd */
8314de1d 1538 assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) == 0);
693d371d 1539
49f997f3
TG
1540 r = sd_event_default(&manager->event);
1541 if (r < 0)
1542 return log_error_errno(errno, "could not allocate event loop: %m");
1543
693d371d
TG
1544 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1545 if (r < 0)
1546 return log_error_errno(r, "error creating sigint event source: %m");
1547
1548 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1549 if (r < 0)
1550 return log_error_errno(r, "error creating sigterm event source: %m");
1551
1552 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1553 if (r < 0)
1554 return log_error_errno(r, "error creating sighup event source: %m");
1555
1556 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1557 if (r < 0)
1558 return log_error_errno(r, "error creating sigchld event source: %m");
1559
1560 r = sd_event_set_watchdog(manager->event, true);
1561 if (r < 0)
1562 return log_error_errno(r, "error creating watchdog event source: %m");
1563
3d7dc8e4 1564 r = sd_event_add_io(manager->event, &manager->ctrl_event, udev_ctrl_get_fd(manager->ctrl), EPOLLIN, on_ctrl_msg, manager);
693d371d
TG
1565 if (r < 0)
1566 return log_error_errno(r, "error creating ctrl event source: %m");
1567
1568 /* This needs to be after the inotify and uevent handling, to make sure
1569 * that the ping is send back after fully processing the pending uevents
1570 * (including the synthetic ones we may create due to inotify events).
1571 */
1572 r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
1573 if (r < 0)
1574 return log_error_errno(r, "cold not set IDLE event priority for ctrl event source: %m");
1575
1576 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1577 if (r < 0)
1578 return log_error_errno(r, "error creating inotify event source: %m");
1579
3d7dc8e4 1580 r = sd_event_add_io(manager->event, &manager->uevent_event, udev_monitor_get_fd(manager->monitor), EPOLLIN, on_uevent, manager);
693d371d
TG
1581 if (r < 0)
1582 return log_error_errno(r, "error creating uevent event source: %m");
1583
1584 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1585 if (r < 0)
1586 return log_error_errno(r, "error creating worker event source: %m");
1587
1588 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1589 if (r < 0)
1590 return log_error_errno(r, "error creating post event source: %m");
e237d8cb 1591
86c3bece 1592 return 0;
c0c6806b
TG
1593}
1594
bba7a484 1595int main(int argc, char *argv[]) {
c0c6806b 1596 _cleanup_(manager_freep) Manager *manager = NULL;
c26d1879 1597 _cleanup_free_ char *cgroup = NULL;
e237d8cb 1598 int r;
bba7a484 1599
bba7a484
TG
1600 log_set_target(LOG_TARGET_AUTO);
1601 log_parse_environment();
1602 log_open();
1603
bba7a484
TG
1604 r = parse_argv(argc, argv);
1605 if (r <= 0)
1606 goto exit;
1607
614a823c
TG
1608 r = parse_proc_cmdline(parse_proc_cmdline_item);
1609 if (r < 0)
1610 log_warning_errno(r, "failed to parse kernel command line, ignoring: %m");
912541b0 1611
25e773ee 1612 if (arg_debug)
bba7a484 1613 log_set_max_level(LOG_DEBUG);
bba7a484 1614
912541b0 1615 if (getuid() != 0) {
6af5e6a4 1616 r = log_error_errno(EPERM, "root privileges required");
912541b0
KS
1617 goto exit;
1618 }
1619
712cebf1
TG
1620 if (arg_children_max == 0) {
1621 cpu_set_t cpu_set;
ebc164ef 1622
712cebf1 1623 arg_children_max = 8;
d457ff83 1624
712cebf1
TG
1625 if (sched_getaffinity(0, sizeof (cpu_set), &cpu_set) == 0) {
1626 arg_children_max += CPU_COUNT(&cpu_set) * 2;
1627 }
912541b0 1628
712cebf1 1629 log_debug("set children_max to %u", arg_children_max);
d457ff83 1630 }
912541b0 1631
712cebf1
TG
1632 /* set umask before creating any file/directory */
1633 r = chdir("/");
1634 if (r < 0) {
1635 r = log_error_errno(errno, "could not change dir to /: %m");
1636 goto exit;
1637 }
194bbe33 1638
712cebf1 1639 umask(022);
912541b0 1640
712cebf1
TG
1641 r = mac_selinux_init("/dev");
1642 if (r < 0) {
1643 log_error_errno(r, "could not initialize labelling: %m");
1644 goto exit;
912541b0
KS
1645 }
1646
712cebf1
TG
1647 r = mkdir("/run/udev", 0755);
1648 if (r < 0 && errno != EEXIST) {
1649 r = log_error_errno(errno, "could not create /run/udev: %m");
1650 goto exit;
1651 }
1652
03cfe0d5 1653 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1654
c26d1879
TG
1655 if (getppid() == 1) {
1656 /* get our own cgroup, we regularly kill everything udev has left behind
1657 we only do this on systemd systems, and only if we are directly spawned
1658 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1659 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
1660 if (r < 0)
1661 log_warning_errno(r, "failed to get cgroup: %m");
1662 }
1663
1664 r = manager_new(&manager, cgroup);
e237d8cb 1665 if (r < 0)
912541b0 1666 goto exit;
912541b0 1667
ecb17862 1668 r = udev_rules_apply_static_dev_perms(manager->rules);
6af5e6a4
TG
1669 if (r < 0)
1670 log_error_errno(r, "failed to apply permissions on static device nodes: %m");
4d6dac13 1671
bba7a484 1672 if (arg_daemonize) {
912541b0 1673 pid_t pid;
912541b0 1674
3cbb2057
TG
1675 log_info("starting version " VERSION);
1676
912541b0
KS
1677 pid = fork();
1678 switch (pid) {
1679 case 0:
1680 break;
1681 case -1:
6af5e6a4 1682 r = log_error_errno(errno, "fork of daemon failed: %m");
912541b0
KS
1683 goto exit;
1684 default:
f53d1fcd
TG
1685 mac_selinux_finish();
1686 log_close();
1687 _exit(EXIT_SUCCESS);
912541b0
KS
1688 }
1689
1690 setsid();
1691
574d5f2d 1692 write_string_file("/proc/self/oom_score_adj", "-1000");
e237d8cb 1693 } else
39fd2ca1 1694 sd_notify(false,
3cbb2057
TG
1695 "READY=1\n"
1696 "STATUS=Processing...");
912541b0 1697
86c3bece
TG
1698 r = manager_listen(manager);
1699 if (r < 0)
1700 return log_error_errno(r, "failed to set up fds and listen for events: %m");
1701
693d371d
TG
1702 r = sd_event_loop(manager->event);
1703 if (r < 0) {
1704 log_error_errno(r, "event loop failed: %m");
1705 goto exit;
912541b0
KS
1706 }
1707
693d371d
TG
1708 sd_event_get_exit_code(manager->event, &r);
1709
53921bfa 1710exit:
b79aacbf
TG
1711 sd_notify(false,
1712 "STOPPING=1\n"
1713 "STATUS=Shutting down...");
1714
e237d8cb
TG
1715 if (manager)
1716 udev_ctrl_cleanup(manager->ctrl);
cc56fafe 1717 mac_selinux_finish();
baa30fbc 1718 log_close();
6af5e6a4 1719 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
7fafc032 1720}