]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
Revert "sd-device: ignore bind/unbind events for now"
[thirdparty/systemd.git] / src / udev / udevd.c
CommitLineData
e7145211 1/* SPDX-License-Identifier: GPL-2.0+ */
7fafc032 2/*
810adae9
LP
3 * Copyright © 2004 Chris Friesen <chris_friesen@sympatico.ca>
4 * Copyright © 2009 Canonical Ltd.
5 * Copyright © 2009 Scott James Remnant <scott@netsplit.com>
7fafc032
KS
6 */
7
7fafc032 8#include <errno.h>
618234a5
LP
9#include <fcntl.h>
10#include <getopt.h>
11#include <signal.h>
12#include <stdbool.h>
13#include <stddef.h>
7fafc032
KS
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
618234a5 17#include <sys/epoll.h>
3ebdb81e 18#include <sys/file.h>
618234a5
LP
19#include <sys/inotify.h>
20#include <sys/ioctl.h>
21#include <sys/mount.h>
1e03b754 22#include <sys/prctl.h>
1e03b754 23#include <sys/signalfd.h>
618234a5 24#include <sys/socket.h>
dc117daa 25#include <sys/stat.h>
618234a5
LP
26#include <sys/time.h>
27#include <sys/wait.h>
28#include <unistd.h>
7fafc032 29
392ef7a2 30#include "sd-daemon.h"
693d371d 31#include "sd-event.h"
8314de1d 32
b5efdb8a 33#include "alloc-util.h"
194bbe33 34#include "cgroup-util.h"
618234a5 35#include "cpu-set-util.h"
5ba2dc25 36#include "dev-setup.h"
7f2e3a14 37#include "device-monitor-private.h"
abde5ea8 38#include "device-private.h"
70068602 39#include "device-util.h"
6d63048a 40#include "event-util.h"
3ffd4af2 41#include "fd-util.h"
a5c32cff 42#include "fileio.h"
f97b34a6 43#include "format-util.h"
f4f15635 44#include "fs-util.h"
a505965d 45#include "hashmap.h"
c004493c 46#include "io-util.h"
70068602 47#include "libudev-device-internal.h"
40a57716 48#include "list.h"
0c5a109a 49#include "main-func.h"
5ea78a39 50#include "mkdir.h"
618234a5 51#include "netlink-util.h"
6bedfcbb 52#include "parse-util.h"
294bf0c3 53#include "pretty-print.h"
4e731273 54#include "proc-cmdline.h"
618234a5
LP
55#include "process-util.h"
56#include "selinux-util.h"
57#include "signal-util.h"
8f328d36 58#include "socket-util.h"
07630cea 59#include "string-util.h"
49fe5c09 60#include "strv.h"
5ea78a39 61#include "strxcpyx.h"
46f0fbd8 62#include "syslog-util.h"
07a26e42 63#include "udev-builtin.h"
7d68eb1b 64#include "udev-ctrl.h"
618234a5 65#include "udev-util.h"
70068602 66#include "udev-watch.h"
618234a5 67#include "udev.h"
ee104e11 68#include "user-util.h"
7fafc032 69
bba7a484
TG
70static bool arg_debug = false;
71static int arg_daemonize = false;
c4d44cba 72static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
216e8bbe 73static unsigned arg_children_max = 0;
6b92f429 74static usec_t arg_exec_delay_usec = 0;
bba7a484 75static usec_t arg_event_timeout_usec = 180 * USEC_PER_SEC;
c0c6806b
TG
76
77typedef struct Manager {
693d371d 78 sd_event *event;
c0c6806b 79 Hashmap *workers;
40a57716 80 LIST_HEAD(struct event, events);
c26d1879 81 const char *cgroup;
cb49a4f2 82 pid_t pid; /* the process that originally allocated the manager object */
c0c6806b 83
9a07157d 84 UdevRules *rules;
9b5150b6 85 Hashmap *properties;
c0c6806b 86
0bed242c
YW
87 sd_netlink *rtnl;
88
7f2e3a14 89 sd_device_monitor *monitor;
c0c6806b
TG
90 struct udev_ctrl *ctrl;
91 struct udev_ctrl_connection *ctrl_conn_blocking;
e237d8cb 92 int fd_inotify;
e237d8cb
TG
93 int worker_watch[2];
94
693d371d
TG
95 sd_event_source *ctrl_event;
96 sd_event_source *uevent_event;
97 sd_event_source *inotify_event;
eca195ec 98 sd_event_source *kill_workers_event;
693d371d 99
7c4c7e89
TG
100 usec_t last_usec;
101
c0c6806b 102 bool stop_exec_queue:1;
c0c6806b
TG
103 bool exit:1;
104} Manager;
1e03b754 105
1e03b754 106enum event_state {
912541b0
KS
107 EVENT_UNDEF,
108 EVENT_QUEUED,
109 EVENT_RUNNING,
1e03b754
KS
110};
111
112struct event {
cb49a4f2 113 Manager *manager;
c6aa11f2 114 struct worker *worker;
912541b0 115 enum event_state state;
eb546b35
YW
116
117 sd_device *dev;
118 sd_device *dev_kernel; /* clone of originally received device */
119
120 uint64_t seqnum;
121 uint64_t delaying_seqnum;
d8f462b4
YW
122
123 sd_event_source *timeout_warning_event;
124 sd_event_source *timeout_event;
eb546b35
YW
125
126 LIST_FIELDS(struct event, event);
1e03b754
KS
127};
128
ecb17862 129static void event_queue_cleanup(Manager *manager, enum event_state type);
ff2c503d 130
1e03b754 131enum worker_state {
912541b0
KS
132 WORKER_UNDEF,
133 WORKER_RUNNING,
134 WORKER_IDLE,
135 WORKER_KILLED,
1e03b754
KS
136};
137
138struct worker {
c0c6806b 139 Manager *manager;
912541b0 140 pid_t pid;
7f2e3a14 141 sd_device_monitor *monitor;
912541b0
KS
142 enum worker_state state;
143 struct event *event;
1e03b754
KS
144};
145
146/* passed from worker to main process */
147struct worker_message {
1e03b754
KS
148};
149
c6aa11f2
TG
150static void event_free(struct event *event) {
151 if (!event)
152 return;
ba47b71c 153
40a57716 154 assert(event->manager);
c6aa11f2 155
40a57716 156 LIST_REMOVE(event, event->manager->events, event);
eb546b35
YW
157 sd_device_unref(event->dev);
158 sd_device_unref(event->dev_kernel);
c6aa11f2 159
d8f462b4
YW
160 sd_event_source_unref(event->timeout_warning_event);
161 sd_event_source_unref(event->timeout_event);
693d371d 162
c6aa11f2
TG
163 if (event->worker)
164 event->worker->event = NULL;
165
ba47b71c
YW
166 /* only clean up the queue from the process that created it */
167 if (LIST_IS_EMPTY(event->manager->events) &&
168 event->manager->pid == getpid_cached())
169 if (unlink("/run/udev/queue") < 0)
170 log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m");
cb49a4f2 171
912541b0 172 free(event);
aa8734ff 173}
7a770250 174
c6aa11f2
TG
175static void worker_free(struct worker *worker) {
176 if (!worker)
177 return;
bc113de9 178
c0c6806b
TG
179 assert(worker->manager);
180
4a0b58c4 181 hashmap_remove(worker->manager->workers, PID_TO_PTR(worker->pid));
7f2e3a14 182 sd_device_monitor_unref(worker->monitor);
c6aa11f2
TG
183 event_free(worker->event);
184
c6aa11f2 185 free(worker);
ff2c503d
KS
186}
187
c0c6806b 188static void manager_workers_free(Manager *manager) {
a505965d
TG
189 struct worker *worker;
190 Iterator i;
ff2c503d 191
c0c6806b
TG
192 assert(manager);
193
194 HASHMAP_FOREACH(worker, manager->workers, i)
c6aa11f2 195 worker_free(worker);
a505965d 196
c0c6806b 197 manager->workers = hashmap_free(manager->workers);
fc465079
KS
198}
199
7f2e3a14 200static int worker_new(struct worker **ret, Manager *manager, sd_device_monitor *worker_monitor, pid_t pid) {
a505965d
TG
201 _cleanup_free_ struct worker *worker = NULL;
202 int r;
3a19b32a
TG
203
204 assert(ret);
c0c6806b 205 assert(manager);
3a19b32a
TG
206 assert(worker_monitor);
207 assert(pid > 1);
208
209 worker = new0(struct worker, 1);
210 if (!worker)
211 return -ENOMEM;
212
c0c6806b 213 worker->manager = manager;
3a19b32a 214 /* close monitor, but keep address around */
7f2e3a14
YW
215 device_monitor_disconnect(worker_monitor);
216 worker->monitor = sd_device_monitor_ref(worker_monitor);
3a19b32a 217 worker->pid = pid;
a505965d 218
c0c6806b 219 r = hashmap_ensure_allocated(&manager->workers, NULL);
a505965d
TG
220 if (r < 0)
221 return r;
222
4a0b58c4 223 r = hashmap_put(manager->workers, PID_TO_PTR(pid), worker);
a505965d
TG
224 if (r < 0)
225 return r;
226
ae2a15bc 227 *ret = TAKE_PTR(worker);
3a19b32a
TG
228
229 return 0;
230}
231
4fa4d885
TG
232static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
233 struct event *event = userdata;
234
235 assert(event);
236 assert(event->worker);
237
238 kill_and_sigcont(event->worker->pid, SIGKILL);
239 event->worker->state = WORKER_KILLED;
240
eb546b35 241 log_device_error(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" killed", event->worker->pid, event->seqnum);
4fa4d885
TG
242
243 return 1;
244}
245
246static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
247 struct event *event = userdata;
248
249 assert(event);
044497e2 250 assert(event->worker);
4fa4d885 251
eb546b35 252 log_device_warning(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" is taking a long time", event->worker->pid, event->seqnum);
4fa4d885
TG
253
254 return 1;
255}
256
39c19cf1 257static void worker_attach_event(struct worker *worker, struct event *event) {
693d371d
TG
258 sd_event *e;
259 uint64_t usec;
693d371d 260
c6aa11f2 261 assert(worker);
693d371d 262 assert(worker->manager);
c6aa11f2
TG
263 assert(event);
264 assert(!event->worker);
265 assert(!worker->event);
266
39c19cf1 267 worker->state = WORKER_RUNNING;
39c19cf1
TG
268 worker->event = event;
269 event->state = EVENT_RUNNING;
c6aa11f2 270 event->worker = worker;
693d371d
TG
271
272 e = worker->manager->event;
273
3285baa8 274 assert_se(sd_event_now(e, CLOCK_MONOTONIC, &usec) >= 0);
693d371d 275
d8f462b4 276 (void) sd_event_add_time(e, &event->timeout_warning_event, CLOCK_MONOTONIC,
66f737b4 277 usec + udev_warn_timeout(arg_event_timeout_usec), USEC_PER_SEC, on_event_timeout_warning, event);
693d371d 278
d8f462b4 279 (void) sd_event_add_time(e, &event->timeout_event, CLOCK_MONOTONIC,
693d371d 280 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
39c19cf1
TG
281}
282
0bed242c
YW
283static void manager_clear_for_worker(Manager *manager) {
284 assert(manager);
285
286 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
287 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
288 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
289 manager->kill_workers_event = sd_event_source_unref(manager->kill_workers_event);
290
291 manager->event = sd_event_unref(manager->event);
292
293 manager_workers_free(manager);
294 event_queue_cleanup(manager, EVENT_UNDEF);
295
7f2e3a14 296 manager->monitor = sd_device_monitor_unref(manager->monitor);
0bed242c
YW
297 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
298 manager->ctrl = udev_ctrl_unref(manager->ctrl);
299
300 manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
301}
302
e237d8cb
TG
303static void manager_free(Manager *manager) {
304 if (!manager)
305 return;
306
2024ed61 307 udev_builtin_exit();
b2d21d93 308
0bed242c 309 manager_clear_for_worker(manager);
693d371d 310
0bed242c 311 sd_netlink_unref(manager->rtnl);
e237d8cb 312
9b5150b6 313 hashmap_free_free_free(manager->properties);
981fae90 314 udev_rules_free(manager->rules);
e237d8cb 315
e237d8cb
TG
316 safe_close(manager->fd_inotify);
317 safe_close_pair(manager->worker_watch);
318
319 free(manager);
320}
321
322DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
323
9a73bd7c
TG
324static int worker_send_message(int fd) {
325 struct worker_message message = {};
326
327 return loop_write(fd, &message, sizeof(message), false);
328}
329
b97897e3 330static int worker_lock_block_device(sd_device *dev, int *ret_fd) {
0bed242c 331 _cleanup_close_ int fd = -1;
b97897e3
YW
332 const char *val;
333 int r;
fee854ee 334
0bed242c
YW
335 assert(dev);
336 assert(ret_fd);
337
338 /*
339 * Take a shared lock on the device node; this establishes
340 * a concept of device "ownership" to serialize device
341 * access. External processes holding an exclusive lock will
342 * cause udev to skip the event handling; in the case udev
343 * acquired the lock, the external process can block until
344 * udev has finished its event handling.
345 */
346
b97897e3
YW
347 r = sd_device_get_property_value(dev, "ACTION", &val);
348 if (r < 0)
349 return log_device_debug_errno(dev, r, "Failed to get the value of property 'ACTION': %m");
350
351 if (streq(val, "remove"))
0bed242c
YW
352 return 0;
353
b97897e3
YW
354 r = sd_device_get_subsystem(dev, &val);
355 if (r < 0)
356 return log_device_debug_errno(dev, r, "Failed to get subsystem: %m");
357
358 if (!streq(val, "block"))
0bed242c 359 return 0;
fee854ee 360
b97897e3
YW
361 r = sd_device_get_sysname(dev, &val);
362 if (r < 0)
363 return log_device_debug_errno(dev, r, "Failed to get sysname: %m");
364
49fe5c09 365 if (STARTSWITH_SET(val, "dm-", "md", "drbd"))
0bed242c
YW
366 return 0;
367
b97897e3
YW
368 r = sd_device_get_devtype(dev, &val);
369 if (r < 0 && r != -ENOENT)
370 return log_device_debug_errno(dev, r, "Failed to get devtype: %m");
371 if (r >= 0 && streq(val, "partition")) {
372 r = sd_device_get_parent(dev, &dev);
373 if (r < 0)
374 return log_device_debug_errno(dev, r, "Failed to get parent device: %m");
375 }
0bed242c 376
b97897e3
YW
377 r = sd_device_get_devname(dev, &val);
378 if (r == -ENOENT)
0bed242c 379 return 0;
b97897e3
YW
380 if (r < 0)
381 return log_device_debug_errno(dev, r, "Failed to get devname: %m");
0bed242c 382
b97897e3
YW
383 fd = open(val, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
384 if (fd < 0) {
385 log_device_debug_errno(dev, errno, "Failed to open '%s', ignoring: %m", val);
0bed242c 386 return 0;
b97897e3 387 }
0bed242c
YW
388
389 if (flock(fd, LOCK_SH|LOCK_NB) < 0)
b97897e3 390 return log_device_debug_errno(dev, errno, "Failed to flock(%s): %m", val);
0bed242c
YW
391
392 *ret_fd = TAKE_FD(fd);
393 return 1;
fee854ee
RK
394}
395
abde5ea8 396static int worker_process_device(Manager *manager, sd_device *dev) {
2e088715 397 _cleanup_(udev_event_freep) UdevEvent *udev_event = NULL;
0bed242c 398 _cleanup_close_ int fd_lock = -1;
abde5ea8 399 const char *seqnum;
0bed242c 400 int r;
912541b0 401
0bed242c
YW
402 assert(manager);
403 assert(dev);
404
abde5ea8
YW
405 r = sd_device_get_property_value(dev, "SEQNUM", &seqnum);
406 if (r < 0)
407 log_device_debug_errno(dev, r, "Failed to get SEQNUM: %m");
408
409 log_device_debug(dev, "Processing device (SEQNUM=%s)", seqnum);
410
411 udev_event = udev_event_new(dev, arg_exec_delay_usec, manager->rtnl);
0bed242c
YW
412 if (!udev_event)
413 return -ENOMEM;
414
abde5ea8 415 r = worker_lock_block_device(dev, &fd_lock);
b6aab8ef 416 if (r < 0)
0bed242c 417 return r;
912541b0 418
0bed242c
YW
419 /* apply rules, create node, symlinks */
420 udev_event_execute_rules(udev_event, arg_event_timeout_usec, manager->properties, manager->rules);
421 udev_event_execute_run(udev_event, arg_event_timeout_usec);
2dd9f98d 422
0bed242c
YW
423 if (!manager->rtnl)
424 /* in case rtnl was initialized */
425 manager->rtnl = sd_netlink_ref(udev_event->rtnl);
912541b0 426
0bed242c
YW
427 /* apply/restore inotify watch */
428 if (udev_event->inotify_watch) {
abde5ea8
YW
429 (void) udev_watch_begin(dev);
430 r = device_update_db(dev);
431 if (r < 0)
432 return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
0bed242c 433 }
912541b0 434
abde5ea8 435 log_device_debug(dev, "Device (SEQNUM=%s) processed", seqnum);
912541b0 436
0bed242c
YW
437 return 0;
438}
912541b0 439
e2130348
YW
440static int worker_device_monitor_handler(sd_device_monitor *monitor, sd_device *dev, void *userdata) {
441 Manager *manager = userdata;
442 int r;
443
444 assert(dev);
445 assert(manager);
446
447 r = worker_process_device(manager, dev);
448 if (r < 0)
449 log_device_warning_errno(dev, r, "Failed to process device, ignoring: %m");
450
451 /* send processed event back to libudev listeners */
452 r = device_monitor_send_device(monitor, NULL, dev);
453 if (r < 0)
454 log_device_warning_errno(dev, r, "Failed to send device, ignoring: %m");
455
456 /* send udevd the result of the event execution */
457 r = worker_send_message(manager->worker_watch[WRITE_END]);
458 if (r < 0)
459 log_device_warning_errno(dev, r, "Failed to send signal to main daemon, ignoring: %m");
460
461 return 1;
462}
463
7f2e3a14
YW
464static int worker_main(Manager *_manager, sd_device_monitor *monitor, sd_device *first_device) {
465 _cleanup_(sd_device_unrefp) sd_device *dev = first_device;
0bed242c 466 _cleanup_(manager_freep) Manager *manager = _manager;
e2130348 467 int r, ret;
145dae7e 468
0bed242c
YW
469 assert(manager);
470 assert(monitor);
471 assert(dev);
912541b0 472
0bed242c 473 unsetenv("NOTIFY_SOCKET");
3b64e4d4 474
e2130348
YW
475 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, -1) >= 0);
476
477 /* Reset OOM score, we only protect the main daemon. */
478 r = set_oom_score_adjust(0);
479 if (r < 0)
480 log_debug_errno(r, "Failed to reset OOM score, ignoring: %m");
912541b0 481
e2130348
YW
482 /* Clear unnecessary data in Manager object.*/
483 manager_clear_for_worker(manager);
3ebdb81e 484
e2130348
YW
485 r = sd_event_new(&manager->event);
486 if (r < 0)
487 return log_error_errno(r, "Failed to allocate event loop: %m");
912541b0 488
e2130348
YW
489 r = sd_event_add_signal(manager->event, NULL, SIGTERM, NULL, NULL);
490 if (r < 0)
491 return log_error_errno(r, "Failed to set SIGTERM event: %m");
4c83d994 492
e2130348
YW
493 r = sd_device_monitor_attach_event(monitor, manager->event);
494 if (r < 0)
495 return log_error_errno(r, "Failed to attach event loop to device monitor: %m");
912541b0 496
e2130348 497 r = sd_device_monitor_start(monitor, worker_device_monitor_handler, manager);
0bed242c 498 if (r < 0)
e2130348 499 return log_error_errno(r, "Failed to start device monitor: %m");
912541b0 500
e2130348 501 (void) sd_event_source_set_description(sd_device_monitor_get_event_source(monitor), "worker-device-monitor");
b66f29a1 502
e2130348
YW
503 /* Process first device */
504 (void) worker_device_monitor_handler(monitor, dev, manager);
912541b0 505
e2130348
YW
506 r = sd_event_loop(manager->event);
507 if (r < 0)
508 return log_error_errno(r, "Event loop failed: %m");
509
510 r = sd_event_get_exit_code(manager->event, &ret);
511 if (r < 0)
512 return log_error_errno(r, "Failed to get exit code: %m");
513
514 return ret;
0bed242c
YW
515}
516
7443654e 517static int worker_spawn(Manager *manager, struct event *event) {
7f2e3a14 518 _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *worker_monitor = NULL;
7443654e 519 struct worker *worker;
0bed242c 520 pid_t pid;
7443654e 521 int r;
0bed242c
YW
522
523 /* listen for new events */
7f2e3a14
YW
524 r = device_monitor_new_full(&worker_monitor, MONITOR_GROUP_NONE, -1);
525 if (r < 0)
526 return r;
7443654e 527
0bed242c 528 /* allow the main daemon netlink address to send devices to the worker */
7f2e3a14
YW
529 r = device_monitor_allow_unicast_sender(worker_monitor, manager->monitor);
530 if (r < 0)
531 return log_error_errno(r, "Worker: Failed to set unicast sender: %m");
532
533 r = device_monitor_enable_receiving(worker_monitor);
0bed242c 534 if (r < 0)
7f2e3a14 535 return log_error_errno(r, "Worker: Failed to enable receiving of device: %m");
0bed242c 536
49f3ee7e 537 r = safe_fork("(worker)", FORK_DEATHSIG, &pid);
7443654e
YW
538 if (r < 0) {
539 event->state = EVENT_QUEUED;
540 return log_error_errno(r, "Failed to fork() worker: %m");
541 }
542 if (r == 0) {
543 /* Worker process */
eb546b35 544 r = worker_main(manager, worker_monitor, sd_device_ref(event->dev));
baa30fbc 545 log_close();
8b46c3fc 546 _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
912541b0 547 }
e03c7cc2 548
7443654e
YW
549 r = worker_new(&worker, manager, worker_monitor, pid);
550 if (r < 0)
551 return log_error_errno(r, "Failed to create worker object: %m");
e03c7cc2 552
7443654e 553 worker_attach_event(worker, event);
39c19cf1 554
eb546b35 555 log_device_debug(event->dev, "Worker ["PID_FMT"] is forked for processing SEQNUM=%"PRIu64".", pid, event->seqnum);
7443654e 556 return 0;
7fafc032
KS
557}
558
c0c6806b 559static void event_run(Manager *manager, struct event *event) {
a505965d
TG
560 struct worker *worker;
561 Iterator i;
7f2e3a14 562 int r;
912541b0 563
c0c6806b
TG
564 assert(manager);
565 assert(event);
566
567 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
568 if (worker->state != WORKER_IDLE)
569 continue;
570
eb546b35 571 r = device_monitor_send_device(manager->monitor, worker->monitor, event->dev);
7f2e3a14 572 if (r < 0) {
eb546b35 573 log_device_error_errno(event->dev, r, "Worker ["PID_FMT"] did not accept message, killing the worker: %m",
7f2e3a14 574 worker->pid);
cb542e84 575 (void) kill(worker->pid, SIGKILL);
912541b0
KS
576 worker->state = WORKER_KILLED;
577 continue;
578 }
39c19cf1 579 worker_attach_event(worker, event);
912541b0
KS
580 return;
581 }
582
c0c6806b 583 if (hashmap_size(manager->workers) >= arg_children_max) {
bba7a484 584 if (arg_children_max > 1)
044497e2 585 log_debug("Maximum number (%u) of children reached.", hashmap_size(manager->workers));
912541b0
KS
586 return;
587 }
588
589 /* start new worker and pass initial device */
c0c6806b 590 worker_spawn(manager, event);
1e03b754
KS
591}
592
eb546b35
YW
593static int event_queue_insert(Manager *manager, sd_device *dev) {
594 _cleanup_(sd_device_unrefp) sd_device *clone = NULL;
912541b0 595 struct event *event;
eb546b35
YW
596 const char *val;
597 uint64_t seqnum;
cb49a4f2 598 int r;
912541b0 599
ecb17862
TG
600 assert(manager);
601 assert(dev);
602
040e6896
TG
603 /* only one process can add events to the queue */
604 if (manager->pid == 0)
df0ff127 605 manager->pid = getpid_cached();
040e6896 606
df0ff127 607 assert(manager->pid == getpid_cached());
cb49a4f2 608
eb546b35
YW
609 /* We only accepts devices received by device monitor. */
610 r = sd_device_get_property_value(dev, "SEQNUM", &val);
611 if (r < 0)
612 return r;
613
614 r = safe_atou64(val, &seqnum);
615 if (r < 0)
616 return r;
617
618 if (seqnum == 0)
619 return -EINVAL;
912541b0 620
eb546b35
YW
621 /* Save original device to restore the state on failures. */
622 r = device_shallow_clone(dev, &clone);
623 if (r < 0)
624 return r;
625
626 r = device_copy_properties(clone, dev);
627 if (r < 0)
628 return r;
912541b0 629
eb546b35
YW
630 event = new(struct event, 1);
631 if (!event)
632 return -ENOMEM;
912541b0 633
eb546b35
YW
634 *event = (struct event) {
635 .manager = manager,
636 .dev = sd_device_ref(dev),
637 .dev_kernel = TAKE_PTR(clone),
638 .seqnum = seqnum,
639 .state = EVENT_QUEUED,
640 };
cb49a4f2 641
40a57716 642 if (LIST_IS_EMPTY(manager->events)) {
cb49a4f2
TG
643 r = touch("/run/udev/queue");
644 if (r < 0)
044497e2 645 log_warning_errno(r, "Failed to touch /run/udev/queue: %m");
cb49a4f2
TG
646 }
647
40a57716 648 LIST_APPEND(event, manager->events, event);
cb49a4f2 649
eb546b35
YW
650 if (DEBUG_LOGGING) {
651 if (sd_device_get_property_value(dev, "ACTION", &val) < 0)
652 val = NULL;
653
654 log_device_debug(dev, "Device (SEQNUM=%"PRIu64", ACTION=%s) is queued", seqnum, strnull(val));
655 }
656
912541b0 657 return 0;
fc465079
KS
658}
659
c0c6806b 660static void manager_kill_workers(Manager *manager) {
a505965d
TG
661 struct worker *worker;
662 Iterator i;
1e03b754 663
c0c6806b
TG
664 assert(manager);
665
666 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
667 if (worker->state == WORKER_KILLED)
668 continue;
1e03b754 669
912541b0 670 worker->state = WORKER_KILLED;
cb542e84 671 (void) kill(worker->pid, SIGTERM);
912541b0 672 }
1e03b754
KS
673}
674
e3196993 675/* lookup event for identical, parent, child device */
eb546b35
YW
676static int is_device_busy(Manager *manager, struct event *event) {
677 const char *subsystem, *devpath, *devpath_old = NULL;
678 dev_t devnum = makedev(0, 0);
40a57716 679 struct event *loop_event;
eb546b35
YW
680 size_t devpath_len;
681 int r, ifindex = 0;
682 bool is_block;
683
684 r = sd_device_get_subsystem(event->dev, &subsystem);
685 if (r < 0)
686 return r;
687
688 is_block = streq(subsystem, "block");
689
690 r = sd_device_get_devpath(event->dev, &devpath);
691 if (r < 0)
692 return r;
693
694 devpath_len = strlen(devpath);
695
696 r = sd_device_get_property_value(event->dev, "DEVPATH_OLD", &devpath_old);
697 if (r < 0 && r != -ENOENT)
698 return r;
699
700 r = sd_device_get_devnum(event->dev, &devnum);
701 if (r < 0 && r != -ENOENT)
702 return r;
703
704 r = sd_device_get_ifindex(event->dev, &ifindex);
705 if (r < 0 && r != -ENOENT)
706 return r;
912541b0
KS
707
708 /* check if queue contains events we depend on */
40a57716 709 LIST_FOREACH(event, loop_event, manager->events) {
eb546b35
YW
710 size_t loop_devpath_len, common;
711 const char *loop_devpath;
712
87ac8d99 713 /* we already found a later event, earlier cannot block us, no need to check again */
912541b0
KS
714 if (loop_event->seqnum < event->delaying_seqnum)
715 continue;
716
717 /* event we checked earlier still exists, no need to check again */
718 if (loop_event->seqnum == event->delaying_seqnum)
719 return true;
720
721 /* found ourself, no later event can block us */
722 if (loop_event->seqnum >= event->seqnum)
723 break;
724
725 /* check major/minor */
eb546b35
YW
726 if (major(devnum) != 0) {
727 const char *s;
728 dev_t d;
729
730 if (sd_device_get_subsystem(loop_event->dev, &s) < 0)
731 continue;
732
733 if (sd_device_get_devnum(loop_event->dev, &d) >= 0 &&
734 devnum == d && is_block == streq(s, "block"))
735 return true;
736 }
912541b0
KS
737
738 /* check network device ifindex */
eb546b35
YW
739 if (ifindex > 0) {
740 int i;
741
742 if (sd_device_get_ifindex(loop_event->dev, &i) >= 0 &&
743 ifindex == i)
744 return true;
745 }
746
747 if (sd_device_get_devpath(loop_event->dev, &loop_devpath) < 0)
748 continue;
912541b0
KS
749
750 /* check our old name */
eb546b35 751 if (devpath_old && streq(devpath_old, loop_devpath)) {
912541b0
KS
752 event->delaying_seqnum = loop_event->seqnum;
753 return true;
754 }
755
eb546b35
YW
756 loop_devpath_len = strlen(loop_devpath);
757
912541b0 758 /* compare devpath */
eb546b35 759 common = MIN(devpath_len, loop_devpath_len);
912541b0
KS
760
761 /* one devpath is contained in the other? */
eb546b35 762 if (!strneq(devpath, loop_devpath, common))
912541b0
KS
763 continue;
764
765 /* identical device event found */
eb546b35 766 if (devpath_len == loop_devpath_len) {
912541b0 767 /* devices names might have changed/swapped in the meantime */
eb546b35 768 if (major(devnum) != 0 || ifindex > 0)
912541b0
KS
769 continue;
770 event->delaying_seqnum = loop_event->seqnum;
771 return true;
772 }
773
774 /* parent device event found */
eb546b35 775 if (devpath[common] == '/') {
912541b0
KS
776 event->delaying_seqnum = loop_event->seqnum;
777 return true;
778 }
779
780 /* child device event found */
eb546b35 781 if (loop_devpath[common] == '/') {
912541b0
KS
782 event->delaying_seqnum = loop_event->seqnum;
783 return true;
784 }
912541b0
KS
785 }
786
787 return false;
7fafc032
KS
788}
789
693d371d
TG
790static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
791 Manager *manager = userdata;
792
793 assert(manager);
794
d4e98880 795 log_error("Giving up waiting for workers to finish.");
693d371d
TG
796 sd_event_exit(manager->event, -ETIMEDOUT);
797
798 return 1;
799}
800
62d43dac 801static void manager_exit(Manager *manager) {
693d371d
TG
802 uint64_t usec;
803 int r;
62d43dac
TG
804
805 assert(manager);
806
807 manager->exit = true;
808
b79aacbf
TG
809 sd_notify(false,
810 "STOPPING=1\n"
811 "STATUS=Starting shutdown...");
812
62d43dac 813 /* close sources of new events and discard buffered events */
693d371d 814 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
ab7854df 815 manager->ctrl = udev_ctrl_unref(manager->ctrl);
62d43dac 816
693d371d 817 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
ab7854df 818 manager->fd_inotify = safe_close(manager->fd_inotify);
62d43dac 819
693d371d 820 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
7f2e3a14 821 manager->monitor = sd_device_monitor_unref(manager->monitor);
62d43dac
TG
822
823 /* discard queued events and kill workers */
824 event_queue_cleanup(manager, EVENT_QUEUED);
825 manager_kill_workers(manager);
693d371d 826
3285baa8 827 assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
693d371d 828
3285baa8 829 r = sd_event_add_time(manager->event, NULL, CLOCK_MONOTONIC,
693d371d
TG
830 usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
831 if (r < 0)
832 return;
62d43dac
TG
833}
834
835/* reload requested, HUP signal received, rules changed, builtin changed */
836static void manager_reload(Manager *manager) {
837
838 assert(manager);
839
b79aacbf
TG
840 sd_notify(false,
841 "RELOADING=1\n"
842 "STATUS=Flushing configuration...");
843
62d43dac 844 manager_kill_workers(manager);
981fae90 845 manager->rules = udev_rules_free(manager->rules);
2024ed61 846 udev_builtin_exit();
b79aacbf 847
1ef72b55
MS
848 sd_notifyf(false,
849 "READY=1\n"
850 "STATUS=Processing with %u children at max", arg_children_max);
62d43dac
TG
851}
852
eca195ec
YW
853static int on_kill_workers_event(sd_event_source *s, uint64_t usec, void *userdata) {
854 Manager *manager = userdata;
855
856 assert(manager);
857
858 log_debug("Cleanup idle workers");
859 manager_kill_workers(manager);
860
861 return 1;
862}
863
c0c6806b 864static void event_queue_start(Manager *manager) {
40a57716 865 struct event *event;
693d371d 866 usec_t usec;
0725c4b9 867 int r;
8ab44e3f 868
c0c6806b
TG
869 assert(manager);
870
40a57716 871 if (LIST_IS_EMPTY(manager->events) ||
7c4c7e89
TG
872 manager->exit || manager->stop_exec_queue)
873 return;
874
3285baa8 875 assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
38a03f06
LP
876 /* check for changed config, every 3 seconds at most */
877 if (manager->last_usec == 0 ||
878 (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
879 if (udev_rules_check_timestamp(manager->rules) ||
2024ed61 880 udev_builtin_validate())
38a03f06 881 manager_reload(manager);
693d371d 882
38a03f06 883 manager->last_usec = usec;
7c4c7e89
TG
884 }
885
0725c4b9
YW
886 r = event_source_disable(manager->kill_workers_event);
887 if (r < 0)
888 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
eca195ec 889
2024ed61 890 udev_builtin_init();
7c4c7e89
TG
891
892 if (!manager->rules) {
1d791281
ZJS
893 r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
894 if (r < 0) {
895 log_warning_errno(r, "Failed to read udev rules: %m");
7c4c7e89 896 return;
1d791281 897 }
7c4c7e89
TG
898 }
899
eb546b35 900 LIST_FOREACH(event, event, manager->events) {
912541b0
KS
901 if (event->state != EVENT_QUEUED)
902 continue;
0bc74ea7 903
912541b0 904 /* do not start event if parent or child event is still running */
eb546b35 905 if (is_device_busy(manager, event) != 0)
912541b0 906 continue;
fc465079 907
c0c6806b 908 event_run(manager, event);
912541b0 909 }
1e03b754
KS
910}
911
ecb17862 912static void event_queue_cleanup(Manager *manager, enum event_state match_type) {
40a57716 913 struct event *event, *tmp;
ff2c503d 914
40a57716 915 LIST_FOREACH_SAFE(event, event, tmp, manager->events) {
912541b0
KS
916 if (match_type != EVENT_UNDEF && match_type != event->state)
917 continue;
ff2c503d 918
c6aa11f2 919 event_free(event);
912541b0 920 }
ff2c503d
KS
921}
922
e82e8fa5 923static int on_worker(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b
TG
924 Manager *manager = userdata;
925
926 assert(manager);
927
912541b0
KS
928 for (;;) {
929 struct worker_message msg;
979558f3
TG
930 struct iovec iovec = {
931 .iov_base = &msg,
932 .iov_len = sizeof(msg),
933 };
934 union {
935 struct cmsghdr cmsghdr;
936 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
937 } control = {};
938 struct msghdr msghdr = {
939 .msg_iov = &iovec,
940 .msg_iovlen = 1,
941 .msg_control = &control,
942 .msg_controllen = sizeof(control),
943 };
944 struct cmsghdr *cmsg;
912541b0 945 ssize_t size;
979558f3 946 struct ucred *ucred = NULL;
a505965d 947 struct worker *worker;
912541b0 948
e82e8fa5 949 size = recvmsg(fd, &msghdr, MSG_DONTWAIT);
979558f3 950 if (size < 0) {
738a7907
TG
951 if (errno == EINTR)
952 continue;
953 else if (errno == EAGAIN)
954 /* nothing more to read */
955 break;
979558f3 956
044497e2 957 return log_error_errno(errno, "Failed to receive message: %m");
979558f3 958 } else if (size != sizeof(struct worker_message)) {
d4e98880 959 log_warning("Ignoring worker message with invalid size %zi bytes", size);
e82e8fa5 960 continue;
979558f3
TG
961 }
962
2a1288ff 963 CMSG_FOREACH(cmsg, &msghdr) {
979558f3
TG
964 if (cmsg->cmsg_level == SOL_SOCKET &&
965 cmsg->cmsg_type == SCM_CREDENTIALS &&
966 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
967 ucred = (struct ucred*) CMSG_DATA(cmsg);
968 }
969
970 if (!ucred || ucred->pid <= 0) {
d4e98880 971 log_warning("Ignoring worker message without valid PID");
979558f3
TG
972 continue;
973 }
912541b0
KS
974
975 /* lookup worker who sent the signal */
4a0b58c4 976 worker = hashmap_get(manager->workers, PID_TO_PTR(ucred->pid));
a505965d 977 if (!worker) {
044497e2 978 log_debug("Worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
a505965d 979 continue;
912541b0 980 }
c0bbfd72 981
a505965d
TG
982 if (worker->state != WORKER_KILLED)
983 worker->state = WORKER_IDLE;
984
985 /* worker returned */
986 event_free(worker->event);
912541b0 987 }
e82e8fa5 988
8302fe5a
TG
989 /* we have free workers, try to schedule events */
990 event_queue_start(manager);
991
e82e8fa5
TG
992 return 1;
993}
994
f00d2b6d 995static int on_uevent(sd_device_monitor *monitor, sd_device *dev, void *userdata) {
c0c6806b 996 Manager *manager = userdata;
e82e8fa5
TG
997 int r;
998
c0c6806b 999 assert(manager);
e82e8fa5 1000
7f2e3a14
YW
1001 device_ensure_usec_initialized(dev, NULL);
1002
eb546b35
YW
1003 r = event_queue_insert(manager, dev);
1004 if (r < 0) {
1005 log_device_error_errno(dev, r, "Failed to insert device into event queue: %m");
7f2e3a14 1006 return 1;
eb546b35 1007 }
7f2e3a14
YW
1008
1009 /* we have fresh events, try to schedule them */
1010 event_queue_start(manager);
e82e8fa5
TG
1011
1012 return 1;
88f4b648
KS
1013}
1014
3b47c739 1015/* receive the udevd message from userspace */
e82e8fa5 1016static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1017 Manager *manager = userdata;
8e766630
LP
1018 _cleanup_(udev_ctrl_connection_unrefp) struct udev_ctrl_connection *ctrl_conn = NULL;
1019 _cleanup_(udev_ctrl_msg_unrefp) struct udev_ctrl_msg *ctrl_msg = NULL;
912541b0 1020 const char *str;
9b5150b6 1021 int i, r;
912541b0 1022
c0c6806b 1023 assert(manager);
e4f66b77 1024
c0c6806b 1025 ctrl_conn = udev_ctrl_get_connection(manager->ctrl);
e4f66b77 1026 if (!ctrl_conn)
e82e8fa5 1027 return 1;
912541b0
KS
1028
1029 ctrl_msg = udev_ctrl_receive_msg(ctrl_conn);
e4f66b77 1030 if (!ctrl_msg)
e82e8fa5 1031 return 1;
912541b0
KS
1032
1033 i = udev_ctrl_get_set_log_level(ctrl_msg);
1034 if (i >= 0) {
044497e2 1035 log_debug("Received udev control message (SET_LOG_LEVEL), setting log_priority=%i", i);
baa30fbc 1036 log_set_max_level(i);
c0c6806b 1037 manager_kill_workers(manager);
912541b0
KS
1038 }
1039
1040 if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
044497e2 1041 log_debug("Received udev control message (STOP_EXEC_QUEUE)");
c0c6806b 1042 manager->stop_exec_queue = true;
912541b0
KS
1043 }
1044
1045 if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
044497e2 1046 log_debug("Received udev control message (START_EXEC_QUEUE)");
c0c6806b 1047 manager->stop_exec_queue = false;
8302fe5a 1048 event_queue_start(manager);
912541b0
KS
1049 }
1050
1051 if (udev_ctrl_get_reload(ctrl_msg) > 0) {
044497e2 1052 log_debug("Received udev control message (RELOAD)");
62d43dac 1053 manager_reload(manager);
912541b0
KS
1054 }
1055
1056 str = udev_ctrl_get_set_env(ctrl_msg);
9b5150b6
YW
1057 if (str) {
1058 _cleanup_free_ char *key = NULL, *val = NULL, *old_key = NULL, *old_val = NULL;
1059 char *eq;
1060
1061 eq = strchr(str, '=');
1062 if (!eq) {
1063 log_error("Invalid key format '%s'", str);
1064 return 1;
1065 }
1066
1067 key = strndup(str, eq - str);
1068 if (!key) {
1069 log_oom();
1070 return 1;
1071 }
1072
1073 old_val = hashmap_remove2(manager->properties, key, (void **) &old_key);
1074
1075 r = hashmap_ensure_allocated(&manager->properties, &string_hash_ops);
1076 if (r < 0) {
1077 log_oom();
1078 return 1;
912541b0 1079 }
9b5150b6
YW
1080
1081 eq++;
1082 if (!isempty(eq)) {
044497e2 1083 log_debug("Received udev control message (ENV), unsetting '%s'", key);
9b5150b6
YW
1084
1085 r = hashmap_put(manager->properties, key, NULL);
1086 if (r < 0) {
1087 log_oom();
1088 return 1;
1089 }
1090 } else {
1091 val = strdup(eq);
1092 if (!val) {
1093 log_oom();
1094 return 1;
1095 }
1096
044497e2 1097 log_debug("Received udev control message (ENV), setting '%s=%s'", key, val);
9b5150b6
YW
1098
1099 r = hashmap_put(manager->properties, key, val);
1100 if (r < 0) {
1101 log_oom();
1102 return 1;
1103 }
1104 }
1105
1106 key = val = NULL;
c0c6806b 1107 manager_kill_workers(manager);
912541b0
KS
1108 }
1109
1110 i = udev_ctrl_get_set_children_max(ctrl_msg);
1111 if (i >= 0) {
044497e2 1112 log_debug("Receivd udev control message (SET_MAX_CHILDREN), setting children_max=%i", i);
bba7a484 1113 arg_children_max = i;
1ef72b55
MS
1114
1115 (void) sd_notifyf(false,
1116 "READY=1\n"
1117 "STATUS=Processing with %u children at max", arg_children_max);
912541b0
KS
1118 }
1119
cb49a4f2 1120 if (udev_ctrl_get_ping(ctrl_msg) > 0)
044497e2 1121 log_debug("Received udev control message (SYNC)");
912541b0
KS
1122
1123 if (udev_ctrl_get_exit(ctrl_msg) > 0) {
044497e2 1124 log_debug("Received udev control message (EXIT)");
62d43dac 1125 manager_exit(manager);
c0c6806b
TG
1126 /* keep reference to block the client until we exit
1127 TODO: deal with several blocking exit requests */
1128 manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
912541b0 1129 }
e4f66b77 1130
e82e8fa5 1131 return 1;
88f4b648 1132}
4a231017 1133
70068602
YW
1134static int synthesize_change(sd_device *dev) {
1135 const char *subsystem, *sysname, *devname, *syspath, *devtype;
1136 char filename[PATH_MAX];
f3a740a5 1137 int r;
edd32000 1138
70068602
YW
1139 r = sd_device_get_subsystem(dev, &subsystem);
1140 if (r < 0)
1141 return r;
1142
1143 r = sd_device_get_sysname(dev, &sysname);
1144 if (r < 0)
1145 return r;
1146
1147 r = sd_device_get_devname(dev, &devname);
1148 if (r < 0)
1149 return r;
1150
1151 r = sd_device_get_syspath(dev, &syspath);
1152 if (r < 0)
1153 return r;
1154
1155 r = sd_device_get_devtype(dev, &devtype);
1156 if (r < 0)
1157 return r;
1158
1159 if (streq_ptr("block", subsystem) &&
1160 streq_ptr("disk", devtype) &&
1161 !startswith(sysname, "dm-")) {
1162 _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
1163 bool part_table_read = false, has_partitions = false;
1164 sd_device *d;
ede34445 1165 int fd;
f3a740a5 1166
ede34445 1167 /*
e9fc29f4
KS
1168 * Try to re-read the partition table. This only succeeds if
1169 * none of the devices is busy. The kernel returns 0 if no
1170 * partition table is found, and we will not get an event for
1171 * the disk.
ede34445 1172 */
70068602 1173 fd = open(devname, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
ede34445 1174 if (fd >= 0) {
02ba8fb3
KS
1175 r = flock(fd, LOCK_EX|LOCK_NB);
1176 if (r >= 0)
1177 r = ioctl(fd, BLKRRPART, 0);
1178
ede34445
KS
1179 close(fd);
1180 if (r >= 0)
e9fc29f4 1181 part_table_read = true;
ede34445
KS
1182 }
1183
e9fc29f4 1184 /* search for partitions */
70068602 1185 r = sd_device_enumerator_new(&e);
f3a740a5
KS
1186 if (r < 0)
1187 return r;
1188
70068602 1189 r = sd_device_enumerator_allow_uninitialized(e);
f3a740a5
KS
1190 if (r < 0)
1191 return r;
1192
70068602 1193 r = sd_device_enumerator_add_match_parent(e, dev);
47a3fa0f
TA
1194 if (r < 0)
1195 return r;
e9fc29f4 1196
70068602
YW
1197 r = sd_device_enumerator_add_match_subsystem(e, "block", true);
1198 if (r < 0)
1199 return r;
e9fc29f4 1200
70068602
YW
1201 FOREACH_DEVICE(e, d) {
1202 const char *t;
e9fc29f4 1203
70068602
YW
1204 if (sd_device_get_devtype(d, &t) < 0 ||
1205 !streq("partition", t))
e9fc29f4
KS
1206 continue;
1207
1208 has_partitions = true;
1209 break;
1210 }
1211
1212 /*
1213 * We have partitions and re-read the table, the kernel already sent
1214 * out a "change" event for the disk, and "remove/add" for all
1215 * partitions.
1216 */
1217 if (part_table_read && has_partitions)
1218 return 0;
1219
1220 /*
1221 * We have partitions but re-reading the partition table did not
1222 * work, synthesize "change" for the disk and all partitions.
1223 */
70068602
YW
1224 log_debug("Device '%s' is closed, synthesising 'change'", devname);
1225 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1226 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
e9fc29f4 1227
70068602
YW
1228 FOREACH_DEVICE(e, d) {
1229 const char *t, *n, *s;
f3a740a5 1230
70068602
YW
1231 if (sd_device_get_devtype(d, &t) < 0 ||
1232 !streq("partition", t))
f3a740a5
KS
1233 continue;
1234
70068602
YW
1235 if (sd_device_get_devname(d, &n) < 0 ||
1236 sd_device_get_syspath(d, &s) < 0)
f3a740a5
KS
1237 continue;
1238
70068602
YW
1239 log_debug("Device '%s' is closed, synthesising partition '%s' 'change'", devname, n);
1240 strscpyl(filename, sizeof(filename), s, "/uevent", NULL);
57512c89 1241 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
f3a740a5 1242 }
ede34445
KS
1243
1244 return 0;
f3a740a5
KS
1245 }
1246
70068602
YW
1247 log_debug("Device %s is closed, synthesising 'change'", devname);
1248 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1249 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
ede34445 1250
f3a740a5 1251 return 0;
edd32000
KS
1252}
1253
e82e8fa5 1254static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1255 Manager *manager = userdata;
0254e944 1256 union inotify_event_buffer buffer;
f7c1ad4f
LP
1257 struct inotify_event *e;
1258 ssize_t l;
0725c4b9 1259 int r;
912541b0 1260
c0c6806b 1261 assert(manager);
e82e8fa5 1262
0725c4b9
YW
1263 r = event_source_disable(manager->kill_workers_event);
1264 if (r < 0)
1265 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
eca195ec 1266
e82e8fa5 1267 l = read(fd, &buffer, sizeof(buffer));
f7c1ad4f 1268 if (l < 0) {
3742095b 1269 if (IN_SET(errno, EAGAIN, EINTR))
e82e8fa5 1270 return 1;
912541b0 1271
f7c1ad4f 1272 return log_error_errno(errno, "Failed to read inotify fd: %m");
912541b0
KS
1273 }
1274
f7c1ad4f 1275 FOREACH_INOTIFY_EVENT(e, buffer, l) {
70068602
YW
1276 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
1277 const char *devnode;
1278
7fe3324c 1279 if (udev_watch_lookup(e->wd, &dev) <= 0)
70068602 1280 continue;
912541b0 1281
70068602 1282 if (sd_device_get_devname(dev, &devnode) < 0)
edd32000 1283 continue;
912541b0 1284
7fe3324c 1285 log_device_debug(dev, "Inotify event: %x for %s", e->mask, devnode);
da143134 1286 if (e->mask & IN_CLOSE_WRITE)
edd32000 1287 synthesize_change(dev);
da143134 1288 else if (e->mask & IN_IGNORED)
2024ed61 1289 udev_watch_end(dev);
912541b0
KS
1290 }
1291
e82e8fa5 1292 return 1;
bd284db1
SJR
1293}
1294
0561329d 1295static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1296 Manager *manager = userdata;
1297
1298 assert(manager);
1299
62d43dac 1300 manager_exit(manager);
912541b0 1301
e82e8fa5
TG
1302 return 1;
1303}
912541b0 1304
0561329d 1305static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1306 Manager *manager = userdata;
1307
1308 assert(manager);
1309
62d43dac 1310 manager_reload(manager);
912541b0 1311
e82e8fa5
TG
1312 return 1;
1313}
912541b0 1314
e82e8fa5 1315static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b 1316 Manager *manager = userdata;
0725c4b9 1317 int r;
c0c6806b
TG
1318
1319 assert(manager);
1320
e82e8fa5
TG
1321 for (;;) {
1322 pid_t pid;
1323 int status;
1324 struct worker *worker;
d1317d02 1325
e82e8fa5
TG
1326 pid = waitpid(-1, &status, WNOHANG);
1327 if (pid <= 0)
f29328d6 1328 break;
e82e8fa5 1329
4a0b58c4 1330 worker = hashmap_get(manager->workers, PID_TO_PTR(pid));
e82e8fa5 1331 if (!worker) {
dc7faf2a 1332 log_warning("Worker ["PID_FMT"] is unknown, ignoring", pid);
f29328d6 1333 continue;
912541b0 1334 }
e82e8fa5
TG
1335
1336 if (WIFEXITED(status)) {
1337 if (WEXITSTATUS(status) == 0)
dc7faf2a 1338 log_debug("Worker ["PID_FMT"] exited", pid);
e82e8fa5 1339 else
dc7faf2a 1340 log_warning("Worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
e82e8fa5 1341 } else if (WIFSIGNALED(status)) {
dc7faf2a 1342 log_warning("Worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), signal_to_string(WTERMSIG(status)));
e82e8fa5 1343 } else if (WIFSTOPPED(status)) {
dc7faf2a 1344 log_info("Worker ["PID_FMT"] stopped", pid);
f29328d6 1345 continue;
e82e8fa5 1346 } else if (WIFCONTINUED(status)) {
dc7faf2a 1347 log_info("Worker ["PID_FMT"] continued", pid);
f29328d6 1348 continue;
e82e8fa5 1349 } else
dc7faf2a 1350 log_warning("Worker ["PID_FMT"] exit with status 0x%04x", pid, status);
e82e8fa5 1351
05e6d9c6 1352 if ((!WIFEXITED(status) || WEXITSTATUS(status) != 0) && worker->event) {
eb546b35 1353 log_device_error(worker->event->dev, "Worker ["PID_FMT"] failed", pid);
dc7faf2a 1354
05e6d9c6 1355 /* delete state from disk */
eb546b35
YW
1356 device_delete_db(worker->event->dev);
1357 device_tag_index(worker->event->dev, NULL, false);
dc7faf2a 1358
05e6d9c6 1359 /* forward kernel event without amending it */
eb546b35 1360 r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
dc7faf2a 1361 if (r < 0)
eb546b35 1362 log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
e82e8fa5
TG
1363 }
1364
1365 worker_free(worker);
912541b0 1366 }
e82e8fa5 1367
8302fe5a
TG
1368 /* we can start new workers, try to schedule events */
1369 event_queue_start(manager);
1370
eca195ec 1371 /* Disable unnecessary cleanup event */
0725c4b9
YW
1372 if (hashmap_isempty(manager->workers)) {
1373 r = event_source_disable(manager->kill_workers_event);
1374 if (r < 0)
1375 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
1376 }
eca195ec 1377
e82e8fa5 1378 return 1;
f27125f9 1379}
1380
693d371d
TG
1381static int on_post(sd_event_source *s, void *userdata) {
1382 Manager *manager = userdata;
693d371d
TG
1383
1384 assert(manager);
1385
b6107f01
YW
1386 if (!LIST_IS_EMPTY(manager->events))
1387 return 1;
1388
1389 /* There are no pending events. Let's cleanup idle process. */
1390
1391 if (!hashmap_isempty(manager->workers)) {
1392 /* There are idle workers */
6d63048a
YW
1393 (void) event_reset_time(manager->event, &manager->kill_workers_event, CLOCK_MONOTONIC,
1394 now(CLOCK_MONOTONIC) + 3 * USEC_PER_SEC, USEC_PER_SEC,
1395 on_kill_workers_event, manager, 0, "kill-workers-event", false);
b6107f01 1396 return 1;
693d371d
TG
1397 }
1398
b6107f01
YW
1399 /* There are no idle workers. */
1400
1401 if (manager->exit)
1402 return sd_event_exit(manager->event, 0);
1403
1404 if (manager->cgroup)
1405 /* cleanup possible left-over processes in our cgroup */
1406 (void) cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, CGROUP_IGNORE_SELF, NULL, NULL, NULL);
1407
693d371d
TG
1408 return 1;
1409}
1410
c4b69e99 1411static int listen_fds(int *ret_ctrl, int *ret_netlink) {
fcff1e72 1412 int ctrl_fd = -1, netlink_fd = -1;
c4b69e99 1413 int fd, n;
912541b0 1414
c4b69e99
YW
1415 assert(ret_ctrl);
1416 assert(ret_netlink);
fcff1e72 1417
912541b0 1418 n = sd_listen_fds(true);
fcff1e72
TG
1419 if (n < 0)
1420 return n;
912541b0
KS
1421
1422 for (fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) {
c52cff07 1423 if (sd_is_socket(fd, AF_LOCAL, SOCK_SEQPACKET, -1) > 0) {
fcff1e72
TG
1424 if (ctrl_fd >= 0)
1425 return -EINVAL;
1426 ctrl_fd = fd;
912541b0
KS
1427 continue;
1428 }
1429
c52cff07 1430 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
fcff1e72
TG
1431 if (netlink_fd >= 0)
1432 return -EINVAL;
1433 netlink_fd = fd;
912541b0
KS
1434 continue;
1435 }
1436
fcff1e72 1437 return -EINVAL;
912541b0
KS
1438 }
1439
c4b69e99
YW
1440 *ret_ctrl = ctrl_fd;
1441 *ret_netlink = netlink_fd;
912541b0 1442
912541b0 1443 return 0;
7459bcdc
KS
1444}
1445
e6f86cac 1446/*
3f85ef0f 1447 * read the kernel command line, in case we need to get into debug mode
1d84ad94
LP
1448 * udev.log_priority=<level> syslog priority
1449 * udev.children_max=<number of workers> events are fully serialized if set to 1
1450 * udev.exec_delay=<number of seconds> delay execution of every executed program
1451 * udev.event_timeout=<number of seconds> seconds to wait before terminating an event
e6f86cac 1452 */
96287a49 1453static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
92e72467 1454 int r = 0;
e6f86cac 1455
614a823c 1456 assert(key);
e6f86cac 1457
614a823c
TG
1458 if (!value)
1459 return 0;
e6f86cac 1460
1d84ad94
LP
1461 if (proc_cmdline_key_streq(key, "udev.log_priority")) {
1462
1463 if (proc_cmdline_value_missing(key, value))
1464 return 0;
1465
46f0fbd8 1466 r = log_level_from_string(value);
92e72467
ZJS
1467 if (r >= 0)
1468 log_set_max_level(r);
1d84ad94
LP
1469
1470 } else if (proc_cmdline_key_streq(key, "udev.event_timeout")) {
1471
1472 if (proc_cmdline_value_missing(key, value))
1473 return 0;
1474
9d9264ba 1475 r = parse_sec(value, &arg_event_timeout_usec);
1d84ad94
LP
1476
1477 } else if (proc_cmdline_key_streq(key, "udev.children_max")) {
1478
1479 if (proc_cmdline_value_missing(key, value))
1480 return 0;
1481
020328e1 1482 r = safe_atou(value, &arg_children_max);
1d84ad94
LP
1483
1484 } else if (proc_cmdline_key_streq(key, "udev.exec_delay")) {
1485
1486 if (proc_cmdline_value_missing(key, value))
1487 return 0;
1488
6b92f429 1489 r = parse_sec(value, &arg_exec_delay_usec);
1d84ad94
LP
1490
1491 } else if (startswith(key, "udev."))
044497e2 1492 log_warning("Unknown udev kernel command line option \"%s\", ignoring", key);
614a823c 1493
92e72467
ZJS
1494 if (r < 0)
1495 log_warning_errno(r, "Failed to parse \"%s=%s\", ignoring: %m", key, value);
1d84ad94 1496
614a823c 1497 return 0;
e6f86cac
KS
1498}
1499
37ec0fdd
LP
1500static int help(void) {
1501 _cleanup_free_ char *link = NULL;
1502 int r;
1503
1504 r = terminal_urlify_man("systemd-udevd.service", "8", &link);
1505 if (r < 0)
1506 return log_oom();
1507
ed216e1f
TG
1508 printf("%s [OPTIONS...]\n\n"
1509 "Manages devices.\n\n"
5ac0162c 1510 " -h --help Print this message\n"
2d19c17e
MF
1511 " -V --version Print version of the program\n"
1512 " -d --daemon Detach and run in the background\n"
1513 " -D --debug Enable debug output\n"
1514 " -c --children-max=INT Set maximum number of workers\n"
1515 " -e --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1516 " -t --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1517 " -N --resolve-names=early|late|never\n"
5ac0162c 1518 " When to resolve users and groups\n"
37ec0fdd
LP
1519 "\nSee the %s for details.\n"
1520 , program_invocation_short_name
1521 , link
1522 );
1523
1524 return 0;
ed216e1f
TG
1525}
1526
bba7a484 1527static int parse_argv(int argc, char *argv[]) {
912541b0 1528 static const struct option options[] = {
bba7a484
TG
1529 { "daemon", no_argument, NULL, 'd' },
1530 { "debug", no_argument, NULL, 'D' },
1531 { "children-max", required_argument, NULL, 'c' },
1532 { "exec-delay", required_argument, NULL, 'e' },
1533 { "event-timeout", required_argument, NULL, 't' },
1534 { "resolve-names", required_argument, NULL, 'N' },
1535 { "help", no_argument, NULL, 'h' },
1536 { "version", no_argument, NULL, 'V' },
912541b0
KS
1537 {}
1538 };
689a97f5 1539
044497e2 1540 int c, r;
689a97f5 1541
bba7a484
TG
1542 assert(argc >= 0);
1543 assert(argv);
912541b0 1544
e14b6f21 1545 while ((c = getopt_long(argc, argv, "c:de:Dt:N:hV", options, NULL)) >= 0) {
bba7a484 1546 switch (c) {
912541b0 1547
912541b0 1548 case 'd':
bba7a484 1549 arg_daemonize = true;
912541b0
KS
1550 break;
1551 case 'c':
020328e1 1552 r = safe_atou(optarg, &arg_children_max);
6f5cf8a8 1553 if (r < 0)
389f9bf2 1554 log_warning_errno(r, "Failed to parse --children-max= value '%s', ignoring: %m", optarg);
912541b0
KS
1555 break;
1556 case 'e':
6b92f429 1557 r = parse_sec(optarg, &arg_exec_delay_usec);
6f5cf8a8 1558 if (r < 0)
6b92f429 1559 log_warning_errno(r, "Failed to parse --exec-delay= value '%s', ignoring: %m", optarg);
912541b0 1560 break;
9719859c 1561 case 't':
9d9264ba 1562 r = parse_sec(optarg, &arg_event_timeout_usec);
f1e8664e 1563 if (r < 0)
9d9264ba 1564 log_warning_errno(r, "Failed to parse --event-timeout= value '%s', ignoring: %m", optarg);
9719859c 1565 break;
912541b0 1566 case 'D':
bba7a484 1567 arg_debug = true;
912541b0 1568 break;
c4d44cba
YW
1569 case 'N': {
1570 ResolveNameTiming t;
1571
1572 t = resolve_name_timing_from_string(optarg);
1573 if (t < 0)
1574 log_warning("Invalid --resolve-names= value '%s', ignoring.", optarg);
1575 else
1576 arg_resolve_name_timing = t;
912541b0 1577 break;
c4d44cba 1578 }
912541b0 1579 case 'h':
37ec0fdd 1580 return help();
912541b0 1581 case 'V':
948aaa7c 1582 printf("%s\n", PACKAGE_VERSION);
bba7a484
TG
1583 return 0;
1584 case '?':
1585 return -EINVAL;
912541b0 1586 default:
bba7a484
TG
1587 assert_not_reached("Unhandled option");
1588
912541b0
KS
1589 }
1590 }
1591
bba7a484
TG
1592 return 1;
1593}
1594
b7f74dd4 1595static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1596 _cleanup_(manager_freep) Manager *manager = NULL;
6d5e65f6 1597 int r, fd_worker;
c0c6806b
TG
1598
1599 assert(ret);
1600
6f19b42f 1601 manager = new(Manager, 1);
c0c6806b
TG
1602 if (!manager)
1603 return log_oom();
1604
6f19b42f
YW
1605 *manager = (Manager) {
1606 .fd_inotify = -1,
1607 .worker_watch = { -1, -1 },
1608 .cgroup = cgroup,
1609 };
e237d8cb 1610
2024ed61 1611 udev_builtin_init();
b2d21d93 1612
1d791281 1613 r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
ecb17862 1614 if (!manager->rules)
1d791281 1615 return log_error_errno(r, "Failed to read udev rules: %m");
ecb17862 1616
2024ed61 1617 manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
f59118ec 1618 if (!manager->ctrl)
886cf317 1619 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize udev control socket");
e237d8cb 1620
6acf1ccb
YW
1621 if (fd_ctrl < 0) {
1622 r = udev_ctrl_enable_receiving(manager->ctrl);
1623 if (r < 0)
1624 return log_error_errno(r, "Failed to bind udev control socket: %m");
1625 }
c4b69e99
YW
1626
1627 fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
1628 if (fd_ctrl < 0)
044497e2 1629 return log_error_errno(fd_ctrl, "Failed to get udev control socket fd: %m");
c4b69e99 1630
7f2e3a14
YW
1631 r = device_monitor_new_full(&manager->monitor, MONITOR_GROUP_KERNEL, fd_uevent);
1632 if (r < 0)
1633 return log_error_errno(r, "Failed to initialize device monitor: %m");
e237d8cb 1634
90389323 1635 (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
c4b69e99 1636
e237d8cb
TG
1637 /* unnamed socket from workers to the main daemon */
1638 r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
1639 if (r < 0)
044497e2 1640 return log_error_errno(errno, "Failed to create socketpair for communicating with workers: %m");
e237d8cb 1641
693d371d 1642 fd_worker = manager->worker_watch[READ_END];
e237d8cb 1643
2ff48e98 1644 r = setsockopt_int(fd_worker, SOL_SOCKET, SO_PASSCRED, true);
e237d8cb 1645 if (r < 0)
044497e2 1646 return log_error_errno(r, "Failed to enable SO_PASSCRED: %m");
e237d8cb 1647
b7759e04
YW
1648 r = udev_watch_init();
1649 if (r < 0)
1650 return log_error_errno(r, "Failed to create inotify descriptor: %m");
1651 manager->fd_inotify = r;
e237d8cb 1652
2024ed61 1653 udev_watch_restore();
e237d8cb
TG
1654
1655 /* block and listen to all signals on signalfd */
72c0a2c2 1656 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) >= 0);
693d371d 1657
49f997f3
TG
1658 r = sd_event_default(&manager->event);
1659 if (r < 0)
044497e2 1660 return log_error_errno(r, "Failed to allocate event loop: %m");
49f997f3 1661
693d371d
TG
1662 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1663 if (r < 0)
044497e2 1664 return log_error_errno(r, "Failed to create SIGINT event source: %m");
693d371d
TG
1665
1666 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1667 if (r < 0)
044497e2 1668 return log_error_errno(r, "Failed to create SIGTERM event source: %m");
693d371d
TG
1669
1670 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1671 if (r < 0)
044497e2 1672 return log_error_errno(r, "Failed to create SIGHUP event source: %m");
693d371d
TG
1673
1674 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1675 if (r < 0)
044497e2 1676 return log_error_errno(r, "Failed to create SIGCHLD event source: %m");
693d371d
TG
1677
1678 r = sd_event_set_watchdog(manager->event, true);
1679 if (r < 0)
044497e2 1680 return log_error_errno(r, "Failed to create watchdog event source: %m");
693d371d 1681
11b1dd8c 1682 r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager);
693d371d 1683 if (r < 0)
044497e2 1684 return log_error_errno(r, "Failed to create udev control event source: %m");
693d371d
TG
1685
1686 /* This needs to be after the inotify and uevent handling, to make sure
1687 * that the ping is send back after fully processing the pending uevents
1688 * (including the synthetic ones we may create due to inotify events).
1689 */
1690 r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
1691 if (r < 0)
044497e2 1692 return log_error_errno(r, "Failed to set IDLE event priority for udev control event source: %m");
693d371d
TG
1693
1694 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1695 if (r < 0)
044497e2 1696 return log_error_errno(r, "Failed to create inotify event source: %m");
693d371d 1697
f00d2b6d
YW
1698 r = sd_device_monitor_attach_event(manager->monitor, manager->event);
1699 if (r < 0)
1700 return log_error_errno(r, "Failed to attach event to device monitor: %m");
1701
1702 r = sd_device_monitor_start(manager->monitor, on_uevent, manager);
693d371d 1703 if (r < 0)
f00d2b6d
YW
1704 return log_error_errno(r, "Failed to start device monitor: %m");
1705
1706 (void) sd_event_source_set_description(sd_device_monitor_get_event_source(manager->monitor), "device-monitor");
693d371d
TG
1707
1708 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1709 if (r < 0)
044497e2 1710 return log_error_errno(r, "Failed to create worker event source: %m");
693d371d
TG
1711
1712 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1713 if (r < 0)
044497e2 1714 return log_error_errno(r, "Failed to create post event source: %m");
e237d8cb 1715
1cc6c93a 1716 *ret = TAKE_PTR(manager);
11b1dd8c 1717
86c3bece 1718 return 0;
c0c6806b
TG
1719}
1720
0c5a109a 1721static int main_loop(int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1722 _cleanup_(manager_freep) Manager *manager = NULL;
077fc5e2
DH
1723 int r;
1724
1725 r = manager_new(&manager, fd_ctrl, fd_uevent, cgroup);
1726 if (r < 0) {
044497e2 1727 r = log_error_errno(r, "Failed to allocate manager object: %m");
077fc5e2
DH
1728 goto exit;
1729 }
1730
1731 r = udev_rules_apply_static_dev_perms(manager->rules);
1732 if (r < 0)
044497e2 1733 log_error_errno(r, "Failed to apply permissions on static device nodes: %m");
077fc5e2 1734
1ef72b55
MS
1735 (void) sd_notifyf(false,
1736 "READY=1\n"
1737 "STATUS=Processing with %u children at max", arg_children_max);
077fc5e2
DH
1738
1739 r = sd_event_loop(manager->event);
1740 if (r < 0) {
044497e2 1741 log_error_errno(r, "Event loop failed: %m");
077fc5e2
DH
1742 goto exit;
1743 }
1744
1745 sd_event_get_exit_code(manager->event, &r);
1746
1747exit:
1748 sd_notify(false,
1749 "STOPPING=1\n"
1750 "STATUS=Shutting down...");
1751 if (manager)
1752 udev_ctrl_cleanup(manager->ctrl);
1753 return r;
1754}
1755
0c5a109a 1756static int run(int argc, char *argv[]) {
c26d1879 1757 _cleanup_free_ char *cgroup = NULL;
efa1606e 1758 int fd_ctrl = -1, fd_uevent = -1;
e5d7bce1 1759 int r;
bba7a484 1760
bba7a484 1761 log_set_target(LOG_TARGET_AUTO);
a14e7af1 1762 udev_parse_config_full(&arg_children_max, &arg_exec_delay_usec, &arg_event_timeout_usec, &arg_resolve_name_timing);
bba7a484
TG
1763 log_parse_environment();
1764 log_open();
1765
bba7a484
TG
1766 r = parse_argv(argc, argv);
1767 if (r <= 0)
0c5a109a 1768 return r;
bba7a484 1769
1d84ad94 1770 r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
614a823c 1771 if (r < 0)
044497e2 1772 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
912541b0 1773
78d3e041
KS
1774 if (arg_debug) {
1775 log_set_target(LOG_TARGET_CONSOLE);
bba7a484 1776 log_set_max_level(LOG_DEBUG);
78d3e041 1777 }
bba7a484 1778
6174a243
YW
1779 log_set_max_level_realm(LOG_REALM_SYSTEMD, log_get_max_level());
1780
fba868fa
LP
1781 r = must_be_root();
1782 if (r < 0)
0c5a109a 1783 return r;
912541b0 1784
712cebf1
TG
1785 if (arg_children_max == 0) {
1786 cpu_set_t cpu_set;
e438c57a 1787 unsigned long mem_limit;
ebc164ef 1788
712cebf1 1789 arg_children_max = 8;
d457ff83 1790
ece174c5 1791 if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) == 0)
faae64fa 1792 arg_children_max += CPU_COUNT(&cpu_set) * 8;
912541b0 1793
e438c57a
MW
1794 mem_limit = physical_memory() / (128LU*1024*1024);
1795 arg_children_max = MAX(10U, MIN(arg_children_max, mem_limit));
1796
044497e2 1797 log_debug("Set children_max to %u", arg_children_max);
d457ff83 1798 }
912541b0 1799
712cebf1
TG
1800 /* set umask before creating any file/directory */
1801 r = chdir("/");
0c5a109a
ZJS
1802 if (r < 0)
1803 return log_error_errno(errno, "Failed to change dir to '/': %m");
194bbe33 1804
712cebf1 1805 umask(022);
912541b0 1806
c3dacc8b 1807 r = mac_selinux_init();
0c5a109a
ZJS
1808 if (r < 0)
1809 return log_error_errno(r, "Could not initialize labelling: %m");
912541b0 1810
dae8b82e 1811 r = mkdir_errno_wrapper("/run/udev", 0755);
0c5a109a
ZJS
1812 if (r < 0 && r != -EEXIST)
1813 return log_error_errno(r, "Failed to create /run/udev: %m");
712cebf1 1814
03cfe0d5 1815 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1816
c26d1879
TG
1817 if (getppid() == 1) {
1818 /* get our own cgroup, we regularly kill everything udev has left behind
1819 we only do this on systemd systems, and only if we are directly spawned
1820 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1821 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
11b9fb15 1822 if (r < 0) {
a2d61f07 1823 if (IN_SET(r, -ENOENT, -ENOMEDIUM))
044497e2 1824 log_debug_errno(r, "Dedicated cgroup not found: %m");
11b9fb15 1825 else
044497e2 1826 log_warning_errno(r, "Failed to get cgroup: %m");
11b9fb15 1827 }
c26d1879
TG
1828 }
1829
b7f74dd4 1830 r = listen_fds(&fd_ctrl, &fd_uevent);
0c5a109a
ZJS
1831 if (r < 0)
1832 return log_error_errno(r, "Failed to listen on fds: %m");
b7f74dd4 1833
bba7a484 1834 if (arg_daemonize) {
912541b0 1835 pid_t pid;
912541b0 1836
948aaa7c 1837 log_info("starting version " PACKAGE_VERSION);
3cbb2057 1838
40e749b5 1839 /* connect /dev/null to stdin, stdout, stderr */
c76cf844
AK
1840 if (log_get_max_level() < LOG_DEBUG) {
1841 r = make_null_stdio();
1842 if (r < 0)
1843 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
1844 }
1845
912541b0 1846 pid = fork();
0c5a109a
ZJS
1847 if (pid < 0)
1848 return log_error_errno(errno, "Failed to fork daemon: %m");
1849 if (pid > 0)
1850 /* parent */
1851 return 0;
912541b0 1852
0c5a109a 1853 /* child */
ece0fe12 1854 (void) setsid();
912541b0 1855
76cdddfb
YW
1856 r = set_oom_score_adjust(-1000);
1857 if (r < 0)
1858 log_debug_errno(r, "Failed to adjust OOM score, ignoring: %m");
7500cd5e 1859 }
912541b0 1860
0c5a109a 1861 return main_loop(fd_ctrl, fd_uevent, cgroup);
7fafc032 1862}
0c5a109a
ZJS
1863
1864DEFINE_MAIN_FUNCTION(run);