]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
udevadm: define main through macro
[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"
5ea78a39 49#include "mkdir.h"
618234a5 50#include "netlink-util.h"
6bedfcbb 51#include "parse-util.h"
294bf0c3 52#include "pretty-print.h"
4e731273 53#include "proc-cmdline.h"
618234a5
LP
54#include "process-util.h"
55#include "selinux-util.h"
56#include "signal-util.h"
8f328d36 57#include "socket-util.h"
07630cea 58#include "string-util.h"
5ea78a39 59#include "strxcpyx.h"
46f0fbd8 60#include "syslog-util.h"
07a26e42 61#include "udev-builtin.h"
7d68eb1b 62#include "udev-ctrl.h"
618234a5 63#include "udev-util.h"
70068602 64#include "udev-watch.h"
618234a5 65#include "udev.h"
ee104e11 66#include "user-util.h"
7fafc032 67
bba7a484
TG
68static bool arg_debug = false;
69static int arg_daemonize = false;
c4d44cba 70static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
216e8bbe 71static unsigned arg_children_max = 0;
6b92f429 72static usec_t arg_exec_delay_usec = 0;
bba7a484 73static usec_t arg_event_timeout_usec = 180 * USEC_PER_SEC;
c0c6806b
TG
74
75typedef struct Manager {
693d371d 76 sd_event *event;
c0c6806b 77 Hashmap *workers;
40a57716 78 LIST_HEAD(struct event, events);
c26d1879 79 const char *cgroup;
cb49a4f2 80 pid_t pid; /* the process that originally allocated the manager object */
c0c6806b 81
ecb17862 82 struct udev_rules *rules;
9b5150b6 83 Hashmap *properties;
c0c6806b 84
0bed242c
YW
85 sd_netlink *rtnl;
86
7f2e3a14 87 sd_device_monitor *monitor;
c0c6806b
TG
88 struct udev_ctrl *ctrl;
89 struct udev_ctrl_connection *ctrl_conn_blocking;
e237d8cb 90 int fd_inotify;
e237d8cb
TG
91 int worker_watch[2];
92
693d371d
TG
93 sd_event_source *ctrl_event;
94 sd_event_source *uevent_event;
95 sd_event_source *inotify_event;
eca195ec 96 sd_event_source *kill_workers_event;
693d371d 97
7c4c7e89
TG
98 usec_t last_usec;
99
c0c6806b 100 bool stop_exec_queue:1;
c0c6806b
TG
101 bool exit:1;
102} Manager;
1e03b754 103
1e03b754 104enum event_state {
912541b0
KS
105 EVENT_UNDEF,
106 EVENT_QUEUED,
107 EVENT_RUNNING,
1e03b754
KS
108};
109
110struct event {
cb49a4f2 111 Manager *manager;
c6aa11f2 112 struct worker *worker;
912541b0 113 enum event_state state;
eb546b35
YW
114
115 sd_device *dev;
116 sd_device *dev_kernel; /* clone of originally received device */
117
118 uint64_t seqnum;
119 uint64_t delaying_seqnum;
d8f462b4
YW
120
121 sd_event_source *timeout_warning_event;
122 sd_event_source *timeout_event;
eb546b35
YW
123
124 LIST_FIELDS(struct event, event);
1e03b754
KS
125};
126
ecb17862 127static void event_queue_cleanup(Manager *manager, enum event_state type);
ff2c503d 128
1e03b754 129enum worker_state {
912541b0
KS
130 WORKER_UNDEF,
131 WORKER_RUNNING,
132 WORKER_IDLE,
133 WORKER_KILLED,
1e03b754
KS
134};
135
136struct worker {
c0c6806b 137 Manager *manager;
912541b0 138 pid_t pid;
7f2e3a14 139 sd_device_monitor *monitor;
912541b0
KS
140 enum worker_state state;
141 struct event *event;
1e03b754
KS
142};
143
144/* passed from worker to main process */
145struct worker_message {
1e03b754
KS
146};
147
c6aa11f2
TG
148static void event_free(struct event *event) {
149 if (!event)
150 return;
ba47b71c 151
40a57716 152 assert(event->manager);
c6aa11f2 153
40a57716 154 LIST_REMOVE(event, event->manager->events, event);
eb546b35
YW
155 sd_device_unref(event->dev);
156 sd_device_unref(event->dev_kernel);
c6aa11f2 157
d8f462b4
YW
158 sd_event_source_unref(event->timeout_warning_event);
159 sd_event_source_unref(event->timeout_event);
693d371d 160
c6aa11f2
TG
161 if (event->worker)
162 event->worker->event = NULL;
163
ba47b71c
YW
164 /* only clean up the queue from the process that created it */
165 if (LIST_IS_EMPTY(event->manager->events) &&
166 event->manager->pid == getpid_cached())
167 if (unlink("/run/udev/queue") < 0)
168 log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m");
cb49a4f2 169
912541b0 170 free(event);
aa8734ff 171}
7a770250 172
c6aa11f2
TG
173static void worker_free(struct worker *worker) {
174 if (!worker)
175 return;
bc113de9 176
c0c6806b
TG
177 assert(worker->manager);
178
4a0b58c4 179 hashmap_remove(worker->manager->workers, PID_TO_PTR(worker->pid));
7f2e3a14 180 sd_device_monitor_unref(worker->monitor);
c6aa11f2
TG
181 event_free(worker->event);
182
c6aa11f2 183 free(worker);
ff2c503d
KS
184}
185
c0c6806b 186static void manager_workers_free(Manager *manager) {
a505965d
TG
187 struct worker *worker;
188 Iterator i;
ff2c503d 189
c0c6806b
TG
190 assert(manager);
191
192 HASHMAP_FOREACH(worker, manager->workers, i)
c6aa11f2 193 worker_free(worker);
a505965d 194
c0c6806b 195 manager->workers = hashmap_free(manager->workers);
fc465079
KS
196}
197
7f2e3a14 198static int worker_new(struct worker **ret, Manager *manager, sd_device_monitor *worker_monitor, pid_t pid) {
a505965d
TG
199 _cleanup_free_ struct worker *worker = NULL;
200 int r;
3a19b32a
TG
201
202 assert(ret);
c0c6806b 203 assert(manager);
3a19b32a
TG
204 assert(worker_monitor);
205 assert(pid > 1);
206
207 worker = new0(struct worker, 1);
208 if (!worker)
209 return -ENOMEM;
210
c0c6806b 211 worker->manager = manager;
3a19b32a 212 /* close monitor, but keep address around */
7f2e3a14
YW
213 device_monitor_disconnect(worker_monitor);
214 worker->monitor = sd_device_monitor_ref(worker_monitor);
3a19b32a 215 worker->pid = pid;
a505965d 216
c0c6806b 217 r = hashmap_ensure_allocated(&manager->workers, NULL);
a505965d
TG
218 if (r < 0)
219 return r;
220
4a0b58c4 221 r = hashmap_put(manager->workers, PID_TO_PTR(pid), worker);
a505965d
TG
222 if (r < 0)
223 return r;
224
ae2a15bc 225 *ret = TAKE_PTR(worker);
3a19b32a
TG
226
227 return 0;
228}
229
4fa4d885
TG
230static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
231 struct event *event = userdata;
232
233 assert(event);
234 assert(event->worker);
235
236 kill_and_sigcont(event->worker->pid, SIGKILL);
237 event->worker->state = WORKER_KILLED;
238
eb546b35 239 log_device_error(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" killed", event->worker->pid, event->seqnum);
4fa4d885
TG
240
241 return 1;
242}
243
244static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
245 struct event *event = userdata;
246
247 assert(event);
044497e2 248 assert(event->worker);
4fa4d885 249
eb546b35 250 log_device_warning(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" is taking a long time", event->worker->pid, event->seqnum);
4fa4d885
TG
251
252 return 1;
253}
254
39c19cf1 255static void worker_attach_event(struct worker *worker, struct event *event) {
693d371d
TG
256 sd_event *e;
257 uint64_t usec;
693d371d 258
c6aa11f2 259 assert(worker);
693d371d 260 assert(worker->manager);
c6aa11f2
TG
261 assert(event);
262 assert(!event->worker);
263 assert(!worker->event);
264
39c19cf1 265 worker->state = WORKER_RUNNING;
39c19cf1
TG
266 worker->event = event;
267 event->state = EVENT_RUNNING;
c6aa11f2 268 event->worker = worker;
693d371d
TG
269
270 e = worker->manager->event;
271
3285baa8 272 assert_se(sd_event_now(e, CLOCK_MONOTONIC, &usec) >= 0);
693d371d 273
d8f462b4 274 (void) sd_event_add_time(e, &event->timeout_warning_event, CLOCK_MONOTONIC,
66f737b4 275 usec + udev_warn_timeout(arg_event_timeout_usec), USEC_PER_SEC, on_event_timeout_warning, event);
693d371d 276
d8f462b4 277 (void) sd_event_add_time(e, &event->timeout_event, CLOCK_MONOTONIC,
693d371d 278 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
39c19cf1
TG
279}
280
0bed242c
YW
281static void manager_clear_for_worker(Manager *manager) {
282 assert(manager);
283
284 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
285 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
286 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
287 manager->kill_workers_event = sd_event_source_unref(manager->kill_workers_event);
288
289 manager->event = sd_event_unref(manager->event);
290
291 manager_workers_free(manager);
292 event_queue_cleanup(manager, EVENT_UNDEF);
293
7f2e3a14 294 manager->monitor = sd_device_monitor_unref(manager->monitor);
0bed242c
YW
295 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
296 manager->ctrl = udev_ctrl_unref(manager->ctrl);
297
298 manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
299}
300
e237d8cb
TG
301static void manager_free(Manager *manager) {
302 if (!manager)
303 return;
304
2024ed61 305 udev_builtin_exit();
b2d21d93 306
0bed242c 307 manager_clear_for_worker(manager);
693d371d 308
0bed242c 309 sd_netlink_unref(manager->rtnl);
e237d8cb 310
9b5150b6 311 hashmap_free_free_free(manager->properties);
e237d8cb 312 udev_rules_unref(manager->rules);
e237d8cb 313
e237d8cb
TG
314 safe_close(manager->fd_inotify);
315 safe_close_pair(manager->worker_watch);
316
317 free(manager);
318}
319
320DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
321
9a73bd7c
TG
322static int worker_send_message(int fd) {
323 struct worker_message message = {};
324
325 return loop_write(fd, &message, sizeof(message), false);
326}
327
b97897e3 328static int worker_lock_block_device(sd_device *dev, int *ret_fd) {
0bed242c 329 _cleanup_close_ int fd = -1;
b97897e3
YW
330 const char *val;
331 int r;
fee854ee 332
0bed242c
YW
333 assert(dev);
334 assert(ret_fd);
335
336 /*
337 * Take a shared lock on the device node; this establishes
338 * a concept of device "ownership" to serialize device
339 * access. External processes holding an exclusive lock will
340 * cause udev to skip the event handling; in the case udev
341 * acquired the lock, the external process can block until
342 * udev has finished its event handling.
343 */
344
b97897e3
YW
345 r = sd_device_get_property_value(dev, "ACTION", &val);
346 if (r < 0)
347 return log_device_debug_errno(dev, r, "Failed to get the value of property 'ACTION': %m");
348
349 if (streq(val, "remove"))
0bed242c
YW
350 return 0;
351
b97897e3
YW
352 r = sd_device_get_subsystem(dev, &val);
353 if (r < 0)
354 return log_device_debug_errno(dev, r, "Failed to get subsystem: %m");
355
356 if (!streq(val, "block"))
0bed242c 357 return 0;
fee854ee 358
b97897e3
YW
359 r = sd_device_get_sysname(dev, &val);
360 if (r < 0)
361 return log_device_debug_errno(dev, r, "Failed to get sysname: %m");
362
363 if (startswith(val, "dm-") ||
364 startswith(val, "md") ||
365 startswith(val, "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) {
0bed242c
YW
397 _cleanup_(udev_event_freep) struct udev_event *udev_event = NULL;
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
7443654e
YW
537 r = safe_fork(NULL, FORK_DEATHSIG, &pid);
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
044497e2 795 log_error_errno(ETIMEDOUT, "Giving up waiting for workers to finish.");
693d371d
TG
796
797 sd_event_exit(manager->event, -ETIMEDOUT);
798
799 return 1;
800}
801
62d43dac 802static void manager_exit(Manager *manager) {
693d371d
TG
803 uint64_t usec;
804 int r;
62d43dac
TG
805
806 assert(manager);
807
808 manager->exit = true;
809
b79aacbf
TG
810 sd_notify(false,
811 "STOPPING=1\n"
812 "STATUS=Starting shutdown...");
813
62d43dac 814 /* close sources of new events and discard buffered events */
693d371d 815 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
ab7854df 816 manager->ctrl = udev_ctrl_unref(manager->ctrl);
62d43dac 817
693d371d 818 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
ab7854df 819 manager->fd_inotify = safe_close(manager->fd_inotify);
62d43dac 820
693d371d 821 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
7f2e3a14 822 manager->monitor = sd_device_monitor_unref(manager->monitor);
62d43dac
TG
823
824 /* discard queued events and kill workers */
825 event_queue_cleanup(manager, EVENT_QUEUED);
826 manager_kill_workers(manager);
693d371d 827
3285baa8 828 assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
693d371d 829
3285baa8 830 r = sd_event_add_time(manager->event, NULL, CLOCK_MONOTONIC,
693d371d
TG
831 usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
832 if (r < 0)
833 return;
62d43dac
TG
834}
835
836/* reload requested, HUP signal received, rules changed, builtin changed */
837static void manager_reload(Manager *manager) {
838
839 assert(manager);
840
b79aacbf
TG
841 sd_notify(false,
842 "RELOADING=1\n"
843 "STATUS=Flushing configuration...");
844
62d43dac
TG
845 manager_kill_workers(manager);
846 manager->rules = udev_rules_unref(manager->rules);
2024ed61 847 udev_builtin_exit();
b79aacbf 848
1ef72b55
MS
849 sd_notifyf(false,
850 "READY=1\n"
851 "STATUS=Processing with %u children at max", arg_children_max);
62d43dac
TG
852}
853
eca195ec
YW
854static int on_kill_workers_event(sd_event_source *s, uint64_t usec, void *userdata) {
855 Manager *manager = userdata;
856
857 assert(manager);
858
859 log_debug("Cleanup idle workers");
860 manager_kill_workers(manager);
861
862 return 1;
863}
864
c0c6806b 865static void event_queue_start(Manager *manager) {
40a57716 866 struct event *event;
693d371d 867 usec_t usec;
0725c4b9 868 int r;
8ab44e3f 869
c0c6806b
TG
870 assert(manager);
871
40a57716 872 if (LIST_IS_EMPTY(manager->events) ||
7c4c7e89
TG
873 manager->exit || manager->stop_exec_queue)
874 return;
875
3285baa8 876 assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
38a03f06
LP
877 /* check for changed config, every 3 seconds at most */
878 if (manager->last_usec == 0 ||
879 (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
880 if (udev_rules_check_timestamp(manager->rules) ||
2024ed61 881 udev_builtin_validate())
38a03f06 882 manager_reload(manager);
693d371d 883
38a03f06 884 manager->last_usec = usec;
7c4c7e89
TG
885 }
886
0725c4b9
YW
887 r = event_source_disable(manager->kill_workers_event);
888 if (r < 0)
889 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
eca195ec 890
2024ed61 891 udev_builtin_init();
7c4c7e89
TG
892
893 if (!manager->rules) {
c4d44cba 894 manager->rules = udev_rules_new(arg_resolve_name_timing);
7c4c7e89
TG
895 if (!manager->rules)
896 return;
897 }
898
eb546b35 899 LIST_FOREACH(event, event, manager->events) {
912541b0
KS
900 if (event->state != EVENT_QUEUED)
901 continue;
0bc74ea7 902
912541b0 903 /* do not start event if parent or child event is still running */
eb546b35 904 if (is_device_busy(manager, event) != 0)
912541b0 905 continue;
fc465079 906
c0c6806b 907 event_run(manager, event);
912541b0 908 }
1e03b754
KS
909}
910
ecb17862 911static void event_queue_cleanup(Manager *manager, enum event_state match_type) {
40a57716 912 struct event *event, *tmp;
ff2c503d 913
40a57716 914 LIST_FOREACH_SAFE(event, event, tmp, manager->events) {
912541b0
KS
915 if (match_type != EVENT_UNDEF && match_type != event->state)
916 continue;
ff2c503d 917
c6aa11f2 918 event_free(event);
912541b0 919 }
ff2c503d
KS
920}
921
e82e8fa5 922static int on_worker(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b
TG
923 Manager *manager = userdata;
924
925 assert(manager);
926
912541b0
KS
927 for (;;) {
928 struct worker_message msg;
979558f3
TG
929 struct iovec iovec = {
930 .iov_base = &msg,
931 .iov_len = sizeof(msg),
932 };
933 union {
934 struct cmsghdr cmsghdr;
935 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
936 } control = {};
937 struct msghdr msghdr = {
938 .msg_iov = &iovec,
939 .msg_iovlen = 1,
940 .msg_control = &control,
941 .msg_controllen = sizeof(control),
942 };
943 struct cmsghdr *cmsg;
912541b0 944 ssize_t size;
979558f3 945 struct ucred *ucred = NULL;
a505965d 946 struct worker *worker;
912541b0 947
e82e8fa5 948 size = recvmsg(fd, &msghdr, MSG_DONTWAIT);
979558f3 949 if (size < 0) {
738a7907
TG
950 if (errno == EINTR)
951 continue;
952 else if (errno == EAGAIN)
953 /* nothing more to read */
954 break;
979558f3 955
044497e2 956 return log_error_errno(errno, "Failed to receive message: %m");
979558f3 957 } else if (size != sizeof(struct worker_message)) {
044497e2 958 log_warning_errno(EIO, "Ignoring worker message with invalid size %zi bytes", size);
e82e8fa5 959 continue;
979558f3
TG
960 }
961
2a1288ff 962 CMSG_FOREACH(cmsg, &msghdr) {
979558f3
TG
963 if (cmsg->cmsg_level == SOL_SOCKET &&
964 cmsg->cmsg_type == SCM_CREDENTIALS &&
965 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
966 ucred = (struct ucred*) CMSG_DATA(cmsg);
967 }
968
969 if (!ucred || ucred->pid <= 0) {
044497e2 970 log_warning_errno(EIO, "Ignoring worker message without valid PID");
979558f3
TG
971 continue;
972 }
912541b0
KS
973
974 /* lookup worker who sent the signal */
4a0b58c4 975 worker = hashmap_get(manager->workers, PID_TO_PTR(ucred->pid));
a505965d 976 if (!worker) {
044497e2 977 log_debug("Worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
a505965d 978 continue;
912541b0 979 }
c0bbfd72 980
a505965d
TG
981 if (worker->state != WORKER_KILLED)
982 worker->state = WORKER_IDLE;
983
984 /* worker returned */
985 event_free(worker->event);
912541b0 986 }
e82e8fa5 987
8302fe5a
TG
988 /* we have free workers, try to schedule events */
989 event_queue_start(manager);
990
e82e8fa5
TG
991 return 1;
992}
993
f00d2b6d 994static int on_uevent(sd_device_monitor *monitor, sd_device *dev, void *userdata) {
c0c6806b 995 Manager *manager = userdata;
e82e8fa5
TG
996 int r;
997
c0c6806b 998 assert(manager);
e82e8fa5 999
7f2e3a14
YW
1000 device_ensure_usec_initialized(dev, NULL);
1001
eb546b35
YW
1002 r = event_queue_insert(manager, dev);
1003 if (r < 0) {
1004 log_device_error_errno(dev, r, "Failed to insert device into event queue: %m");
7f2e3a14 1005 return 1;
eb546b35 1006 }
7f2e3a14
YW
1007
1008 /* we have fresh events, try to schedule them */
1009 event_queue_start(manager);
e82e8fa5
TG
1010
1011 return 1;
88f4b648
KS
1012}
1013
3b47c739 1014/* receive the udevd message from userspace */
e82e8fa5 1015static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1016 Manager *manager = userdata;
8e766630
LP
1017 _cleanup_(udev_ctrl_connection_unrefp) struct udev_ctrl_connection *ctrl_conn = NULL;
1018 _cleanup_(udev_ctrl_msg_unrefp) struct udev_ctrl_msg *ctrl_msg = NULL;
912541b0 1019 const char *str;
9b5150b6 1020 int i, r;
912541b0 1021
c0c6806b 1022 assert(manager);
e4f66b77 1023
c0c6806b 1024 ctrl_conn = udev_ctrl_get_connection(manager->ctrl);
e4f66b77 1025 if (!ctrl_conn)
e82e8fa5 1026 return 1;
912541b0
KS
1027
1028 ctrl_msg = udev_ctrl_receive_msg(ctrl_conn);
e4f66b77 1029 if (!ctrl_msg)
e82e8fa5 1030 return 1;
912541b0
KS
1031
1032 i = udev_ctrl_get_set_log_level(ctrl_msg);
1033 if (i >= 0) {
044497e2 1034 log_debug("Received udev control message (SET_LOG_LEVEL), setting log_priority=%i", i);
baa30fbc 1035 log_set_max_level(i);
c0c6806b 1036 manager_kill_workers(manager);
912541b0
KS
1037 }
1038
1039 if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
044497e2 1040 log_debug("Received udev control message (STOP_EXEC_QUEUE)");
c0c6806b 1041 manager->stop_exec_queue = true;
912541b0
KS
1042 }
1043
1044 if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
044497e2 1045 log_debug("Received udev control message (START_EXEC_QUEUE)");
c0c6806b 1046 manager->stop_exec_queue = false;
8302fe5a 1047 event_queue_start(manager);
912541b0
KS
1048 }
1049
1050 if (udev_ctrl_get_reload(ctrl_msg) > 0) {
044497e2 1051 log_debug("Received udev control message (RELOAD)");
62d43dac 1052 manager_reload(manager);
912541b0
KS
1053 }
1054
1055 str = udev_ctrl_get_set_env(ctrl_msg);
9b5150b6
YW
1056 if (str) {
1057 _cleanup_free_ char *key = NULL, *val = NULL, *old_key = NULL, *old_val = NULL;
1058 char *eq;
1059
1060 eq = strchr(str, '=');
1061 if (!eq) {
1062 log_error("Invalid key format '%s'", str);
1063 return 1;
1064 }
1065
1066 key = strndup(str, eq - str);
1067 if (!key) {
1068 log_oom();
1069 return 1;
1070 }
1071
1072 old_val = hashmap_remove2(manager->properties, key, (void **) &old_key);
1073
1074 r = hashmap_ensure_allocated(&manager->properties, &string_hash_ops);
1075 if (r < 0) {
1076 log_oom();
1077 return 1;
912541b0 1078 }
9b5150b6
YW
1079
1080 eq++;
1081 if (!isempty(eq)) {
044497e2 1082 log_debug("Received udev control message (ENV), unsetting '%s'", key);
9b5150b6
YW
1083
1084 r = hashmap_put(manager->properties, key, NULL);
1085 if (r < 0) {
1086 log_oom();
1087 return 1;
1088 }
1089 } else {
1090 val = strdup(eq);
1091 if (!val) {
1092 log_oom();
1093 return 1;
1094 }
1095
044497e2 1096 log_debug("Received udev control message (ENV), setting '%s=%s'", key, val);
9b5150b6
YW
1097
1098 r = hashmap_put(manager->properties, key, val);
1099 if (r < 0) {
1100 log_oom();
1101 return 1;
1102 }
1103 }
1104
1105 key = val = NULL;
c0c6806b 1106 manager_kill_workers(manager);
912541b0
KS
1107 }
1108
1109 i = udev_ctrl_get_set_children_max(ctrl_msg);
1110 if (i >= 0) {
044497e2 1111 log_debug("Receivd udev control message (SET_MAX_CHILDREN), setting children_max=%i", i);
bba7a484 1112 arg_children_max = i;
1ef72b55
MS
1113
1114 (void) sd_notifyf(false,
1115 "READY=1\n"
1116 "STATUS=Processing with %u children at max", arg_children_max);
912541b0
KS
1117 }
1118
cb49a4f2 1119 if (udev_ctrl_get_ping(ctrl_msg) > 0)
044497e2 1120 log_debug("Received udev control message (SYNC)");
912541b0
KS
1121
1122 if (udev_ctrl_get_exit(ctrl_msg) > 0) {
044497e2 1123 log_debug("Received udev control message (EXIT)");
62d43dac 1124 manager_exit(manager);
c0c6806b
TG
1125 /* keep reference to block the client until we exit
1126 TODO: deal with several blocking exit requests */
1127 manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
912541b0 1128 }
e4f66b77 1129
e82e8fa5 1130 return 1;
88f4b648 1131}
4a231017 1132
70068602
YW
1133static int synthesize_change(sd_device *dev) {
1134 const char *subsystem, *sysname, *devname, *syspath, *devtype;
1135 char filename[PATH_MAX];
f3a740a5 1136 int r;
edd32000 1137
70068602
YW
1138 r = sd_device_get_subsystem(dev, &subsystem);
1139 if (r < 0)
1140 return r;
1141
1142 r = sd_device_get_sysname(dev, &sysname);
1143 if (r < 0)
1144 return r;
1145
1146 r = sd_device_get_devname(dev, &devname);
1147 if (r < 0)
1148 return r;
1149
1150 r = sd_device_get_syspath(dev, &syspath);
1151 if (r < 0)
1152 return r;
1153
1154 r = sd_device_get_devtype(dev, &devtype);
1155 if (r < 0)
1156 return r;
1157
1158 if (streq_ptr("block", subsystem) &&
1159 streq_ptr("disk", devtype) &&
1160 !startswith(sysname, "dm-")) {
1161 _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
1162 bool part_table_read = false, has_partitions = false;
1163 sd_device *d;
ede34445 1164 int fd;
f3a740a5 1165
ede34445 1166 /*
e9fc29f4
KS
1167 * Try to re-read the partition table. This only succeeds if
1168 * none of the devices is busy. The kernel returns 0 if no
1169 * partition table is found, and we will not get an event for
1170 * the disk.
ede34445 1171 */
70068602 1172 fd = open(devname, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
ede34445 1173 if (fd >= 0) {
02ba8fb3
KS
1174 r = flock(fd, LOCK_EX|LOCK_NB);
1175 if (r >= 0)
1176 r = ioctl(fd, BLKRRPART, 0);
1177
ede34445
KS
1178 close(fd);
1179 if (r >= 0)
e9fc29f4 1180 part_table_read = true;
ede34445
KS
1181 }
1182
e9fc29f4 1183 /* search for partitions */
70068602 1184 r = sd_device_enumerator_new(&e);
f3a740a5
KS
1185 if (r < 0)
1186 return r;
1187
70068602 1188 r = sd_device_enumerator_allow_uninitialized(e);
f3a740a5
KS
1189 if (r < 0)
1190 return r;
1191
70068602 1192 r = sd_device_enumerator_add_match_parent(e, dev);
47a3fa0f
TA
1193 if (r < 0)
1194 return r;
e9fc29f4 1195
70068602
YW
1196 r = sd_device_enumerator_add_match_subsystem(e, "block", true);
1197 if (r < 0)
1198 return r;
e9fc29f4 1199
70068602
YW
1200 FOREACH_DEVICE(e, d) {
1201 const char *t;
e9fc29f4 1202
70068602
YW
1203 if (sd_device_get_devtype(d, &t) < 0 ||
1204 !streq("partition", t))
e9fc29f4
KS
1205 continue;
1206
1207 has_partitions = true;
1208 break;
1209 }
1210
1211 /*
1212 * We have partitions and re-read the table, the kernel already sent
1213 * out a "change" event for the disk, and "remove/add" for all
1214 * partitions.
1215 */
1216 if (part_table_read && has_partitions)
1217 return 0;
1218
1219 /*
1220 * We have partitions but re-reading the partition table did not
1221 * work, synthesize "change" for the disk and all partitions.
1222 */
70068602
YW
1223 log_debug("Device '%s' is closed, synthesising 'change'", devname);
1224 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1225 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
e9fc29f4 1226
70068602
YW
1227 FOREACH_DEVICE(e, d) {
1228 const char *t, *n, *s;
f3a740a5 1229
70068602
YW
1230 if (sd_device_get_devtype(d, &t) < 0 ||
1231 !streq("partition", t))
f3a740a5
KS
1232 continue;
1233
70068602
YW
1234 if (sd_device_get_devname(d, &n) < 0 ||
1235 sd_device_get_syspath(d, &s) < 0)
f3a740a5
KS
1236 continue;
1237
70068602
YW
1238 log_debug("Device '%s' is closed, synthesising partition '%s' 'change'", devname, n);
1239 strscpyl(filename, sizeof(filename), s, "/uevent", NULL);
57512c89 1240 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
f3a740a5 1241 }
ede34445
KS
1242
1243 return 0;
f3a740a5
KS
1244 }
1245
70068602
YW
1246 log_debug("Device %s is closed, synthesising 'change'", devname);
1247 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1248 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
ede34445 1249
f3a740a5 1250 return 0;
edd32000
KS
1251}
1252
e82e8fa5 1253static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1254 Manager *manager = userdata;
0254e944 1255 union inotify_event_buffer buffer;
f7c1ad4f
LP
1256 struct inotify_event *e;
1257 ssize_t l;
0725c4b9 1258 int r;
912541b0 1259
c0c6806b 1260 assert(manager);
e82e8fa5 1261
0725c4b9
YW
1262 r = event_source_disable(manager->kill_workers_event);
1263 if (r < 0)
1264 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
eca195ec 1265
e82e8fa5 1266 l = read(fd, &buffer, sizeof(buffer));
f7c1ad4f 1267 if (l < 0) {
3742095b 1268 if (IN_SET(errno, EAGAIN, EINTR))
e82e8fa5 1269 return 1;
912541b0 1270
f7c1ad4f 1271 return log_error_errno(errno, "Failed to read inotify fd: %m");
912541b0
KS
1272 }
1273
f7c1ad4f 1274 FOREACH_INOTIFY_EVENT(e, buffer, l) {
70068602
YW
1275 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
1276 const char *devnode;
1277
7fe3324c 1278 if (udev_watch_lookup(e->wd, &dev) <= 0)
70068602 1279 continue;
912541b0 1280
70068602 1281 if (sd_device_get_devname(dev, &devnode) < 0)
edd32000 1282 continue;
912541b0 1283
7fe3324c 1284 log_device_debug(dev, "Inotify event: %x for %s", e->mask, devnode);
da143134 1285 if (e->mask & IN_CLOSE_WRITE)
edd32000 1286 synthesize_change(dev);
da143134 1287 else if (e->mask & IN_IGNORED)
2024ed61 1288 udev_watch_end(dev);
912541b0
KS
1289 }
1290
e82e8fa5 1291 return 1;
bd284db1
SJR
1292}
1293
0561329d 1294static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1295 Manager *manager = userdata;
1296
1297 assert(manager);
1298
62d43dac 1299 manager_exit(manager);
912541b0 1300
e82e8fa5
TG
1301 return 1;
1302}
912541b0 1303
0561329d 1304static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1305 Manager *manager = userdata;
1306
1307 assert(manager);
1308
62d43dac 1309 manager_reload(manager);
912541b0 1310
e82e8fa5
TG
1311 return 1;
1312}
912541b0 1313
e82e8fa5 1314static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b 1315 Manager *manager = userdata;
0725c4b9 1316 int r;
c0c6806b
TG
1317
1318 assert(manager);
1319
e82e8fa5
TG
1320 for (;;) {
1321 pid_t pid;
1322 int status;
1323 struct worker *worker;
d1317d02 1324
e82e8fa5
TG
1325 pid = waitpid(-1, &status, WNOHANG);
1326 if (pid <= 0)
f29328d6 1327 break;
e82e8fa5 1328
4a0b58c4 1329 worker = hashmap_get(manager->workers, PID_TO_PTR(pid));
e82e8fa5 1330 if (!worker) {
dc7faf2a 1331 log_warning("Worker ["PID_FMT"] is unknown, ignoring", pid);
f29328d6 1332 continue;
912541b0 1333 }
e82e8fa5
TG
1334
1335 if (WIFEXITED(status)) {
1336 if (WEXITSTATUS(status) == 0)
dc7faf2a 1337 log_debug("Worker ["PID_FMT"] exited", pid);
e82e8fa5 1338 else
dc7faf2a 1339 log_warning("Worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
e82e8fa5 1340 } else if (WIFSIGNALED(status)) {
dc7faf2a 1341 log_warning("Worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), signal_to_string(WTERMSIG(status)));
e82e8fa5 1342 } else if (WIFSTOPPED(status)) {
dc7faf2a 1343 log_info("Worker ["PID_FMT"] stopped", pid);
f29328d6 1344 continue;
e82e8fa5 1345 } else if (WIFCONTINUED(status)) {
dc7faf2a 1346 log_info("Worker ["PID_FMT"] continued", pid);
f29328d6 1347 continue;
e82e8fa5 1348 } else
dc7faf2a 1349 log_warning("Worker ["PID_FMT"] exit with status 0x%04x", pid, status);
e82e8fa5 1350
05e6d9c6 1351 if ((!WIFEXITED(status) || WEXITSTATUS(status) != 0) && worker->event) {
eb546b35 1352 log_device_error(worker->event->dev, "Worker ["PID_FMT"] failed", pid);
dc7faf2a 1353
05e6d9c6 1354 /* delete state from disk */
eb546b35
YW
1355 device_delete_db(worker->event->dev);
1356 device_tag_index(worker->event->dev, NULL, false);
dc7faf2a 1357
05e6d9c6 1358 /* forward kernel event without amending it */
eb546b35 1359 r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
dc7faf2a 1360 if (r < 0)
eb546b35 1361 log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
e82e8fa5
TG
1362 }
1363
1364 worker_free(worker);
912541b0 1365 }
e82e8fa5 1366
8302fe5a
TG
1367 /* we can start new workers, try to schedule events */
1368 event_queue_start(manager);
1369
eca195ec 1370 /* Disable unnecessary cleanup event */
0725c4b9
YW
1371 if (hashmap_isempty(manager->workers)) {
1372 r = event_source_disable(manager->kill_workers_event);
1373 if (r < 0)
1374 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
1375 }
eca195ec 1376
e82e8fa5 1377 return 1;
f27125f9 1378}
1379
693d371d
TG
1380static int on_post(sd_event_source *s, void *userdata) {
1381 Manager *manager = userdata;
693d371d
TG
1382
1383 assert(manager);
1384
b6107f01
YW
1385 if (!LIST_IS_EMPTY(manager->events))
1386 return 1;
1387
1388 /* There are no pending events. Let's cleanup idle process. */
1389
1390 if (!hashmap_isempty(manager->workers)) {
1391 /* There are idle workers */
6d63048a
YW
1392 (void) event_reset_time(manager->event, &manager->kill_workers_event, CLOCK_MONOTONIC,
1393 now(CLOCK_MONOTONIC) + 3 * USEC_PER_SEC, USEC_PER_SEC,
1394 on_kill_workers_event, manager, 0, "kill-workers-event", false);
b6107f01 1395 return 1;
693d371d
TG
1396 }
1397
b6107f01
YW
1398 /* There are no idle workers. */
1399
1400 if (manager->exit)
1401 return sd_event_exit(manager->event, 0);
1402
1403 if (manager->cgroup)
1404 /* cleanup possible left-over processes in our cgroup */
1405 (void) cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, CGROUP_IGNORE_SELF, NULL, NULL, NULL);
1406
693d371d
TG
1407 return 1;
1408}
1409
c4b69e99 1410static int listen_fds(int *ret_ctrl, int *ret_netlink) {
fcff1e72 1411 int ctrl_fd = -1, netlink_fd = -1;
c4b69e99 1412 int fd, n;
912541b0 1413
c4b69e99
YW
1414 assert(ret_ctrl);
1415 assert(ret_netlink);
fcff1e72 1416
912541b0 1417 n = sd_listen_fds(true);
fcff1e72
TG
1418 if (n < 0)
1419 return n;
912541b0
KS
1420
1421 for (fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) {
c52cff07 1422 if (sd_is_socket(fd, AF_LOCAL, SOCK_SEQPACKET, -1) > 0) {
fcff1e72
TG
1423 if (ctrl_fd >= 0)
1424 return -EINVAL;
1425 ctrl_fd = fd;
912541b0
KS
1426 continue;
1427 }
1428
c52cff07 1429 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
fcff1e72
TG
1430 if (netlink_fd >= 0)
1431 return -EINVAL;
1432 netlink_fd = fd;
912541b0
KS
1433 continue;
1434 }
1435
fcff1e72 1436 return -EINVAL;
912541b0
KS
1437 }
1438
c4b69e99
YW
1439 *ret_ctrl = ctrl_fd;
1440 *ret_netlink = netlink_fd;
912541b0 1441
912541b0 1442 return 0;
7459bcdc
KS
1443}
1444
e6f86cac 1445/*
3f85ef0f 1446 * read the kernel command line, in case we need to get into debug mode
1d84ad94
LP
1447 * udev.log_priority=<level> syslog priority
1448 * udev.children_max=<number of workers> events are fully serialized if set to 1
1449 * udev.exec_delay=<number of seconds> delay execution of every executed program
1450 * udev.event_timeout=<number of seconds> seconds to wait before terminating an event
e6f86cac 1451 */
96287a49 1452static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
92e72467 1453 int r = 0;
e6f86cac 1454
614a823c 1455 assert(key);
e6f86cac 1456
614a823c
TG
1457 if (!value)
1458 return 0;
e6f86cac 1459
1d84ad94
LP
1460 if (proc_cmdline_key_streq(key, "udev.log_priority")) {
1461
1462 if (proc_cmdline_value_missing(key, value))
1463 return 0;
1464
46f0fbd8 1465 r = log_level_from_string(value);
92e72467
ZJS
1466 if (r >= 0)
1467 log_set_max_level(r);
1d84ad94
LP
1468
1469 } else if (proc_cmdline_key_streq(key, "udev.event_timeout")) {
1470
1471 if (proc_cmdline_value_missing(key, value))
1472 return 0;
1473
9d9264ba 1474 r = parse_sec(value, &arg_event_timeout_usec);
1d84ad94
LP
1475
1476 } else if (proc_cmdline_key_streq(key, "udev.children_max")) {
1477
1478 if (proc_cmdline_value_missing(key, value))
1479 return 0;
1480
020328e1 1481 r = safe_atou(value, &arg_children_max);
1d84ad94
LP
1482
1483 } else if (proc_cmdline_key_streq(key, "udev.exec_delay")) {
1484
1485 if (proc_cmdline_value_missing(key, value))
1486 return 0;
1487
6b92f429 1488 r = parse_sec(value, &arg_exec_delay_usec);
1d84ad94
LP
1489
1490 } else if (startswith(key, "udev."))
044497e2 1491 log_warning("Unknown udev kernel command line option \"%s\", ignoring", key);
614a823c 1492
92e72467
ZJS
1493 if (r < 0)
1494 log_warning_errno(r, "Failed to parse \"%s=%s\", ignoring: %m", key, value);
1d84ad94 1495
614a823c 1496 return 0;
e6f86cac
KS
1497}
1498
37ec0fdd
LP
1499static int help(void) {
1500 _cleanup_free_ char *link = NULL;
1501 int r;
1502
1503 r = terminal_urlify_man("systemd-udevd.service", "8", &link);
1504 if (r < 0)
1505 return log_oom();
1506
ed216e1f
TG
1507 printf("%s [OPTIONS...]\n\n"
1508 "Manages devices.\n\n"
5ac0162c 1509 " -h --help Print this message\n"
2d19c17e
MF
1510 " -V --version Print version of the program\n"
1511 " -d --daemon Detach and run in the background\n"
1512 " -D --debug Enable debug output\n"
1513 " -c --children-max=INT Set maximum number of workers\n"
1514 " -e --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1515 " -t --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1516 " -N --resolve-names=early|late|never\n"
5ac0162c 1517 " When to resolve users and groups\n"
37ec0fdd
LP
1518 "\nSee the %s for details.\n"
1519 , program_invocation_short_name
1520 , link
1521 );
1522
1523 return 0;
ed216e1f
TG
1524}
1525
bba7a484 1526static int parse_argv(int argc, char *argv[]) {
912541b0 1527 static const struct option options[] = {
bba7a484
TG
1528 { "daemon", no_argument, NULL, 'd' },
1529 { "debug", no_argument, NULL, 'D' },
1530 { "children-max", required_argument, NULL, 'c' },
1531 { "exec-delay", required_argument, NULL, 'e' },
1532 { "event-timeout", required_argument, NULL, 't' },
1533 { "resolve-names", required_argument, NULL, 'N' },
1534 { "help", no_argument, NULL, 'h' },
1535 { "version", no_argument, NULL, 'V' },
912541b0
KS
1536 {}
1537 };
689a97f5 1538
044497e2 1539 int c, r;
689a97f5 1540
bba7a484
TG
1541 assert(argc >= 0);
1542 assert(argv);
912541b0 1543
e14b6f21 1544 while ((c = getopt_long(argc, argv, "c:de:Dt:N:hV", options, NULL)) >= 0) {
bba7a484 1545 switch (c) {
912541b0 1546
912541b0 1547 case 'd':
bba7a484 1548 arg_daemonize = true;
912541b0
KS
1549 break;
1550 case 'c':
020328e1 1551 r = safe_atou(optarg, &arg_children_max);
6f5cf8a8 1552 if (r < 0)
389f9bf2 1553 log_warning_errno(r, "Failed to parse --children-max= value '%s', ignoring: %m", optarg);
912541b0
KS
1554 break;
1555 case 'e':
6b92f429 1556 r = parse_sec(optarg, &arg_exec_delay_usec);
6f5cf8a8 1557 if (r < 0)
6b92f429 1558 log_warning_errno(r, "Failed to parse --exec-delay= value '%s', ignoring: %m", optarg);
912541b0 1559 break;
9719859c 1560 case 't':
9d9264ba 1561 r = parse_sec(optarg, &arg_event_timeout_usec);
f1e8664e 1562 if (r < 0)
9d9264ba 1563 log_warning_errno(r, "Failed to parse --event-timeout= value '%s', ignoring: %m", optarg);
9719859c 1564 break;
912541b0 1565 case 'D':
bba7a484 1566 arg_debug = true;
912541b0 1567 break;
c4d44cba
YW
1568 case 'N': {
1569 ResolveNameTiming t;
1570
1571 t = resolve_name_timing_from_string(optarg);
1572 if (t < 0)
1573 log_warning("Invalid --resolve-names= value '%s', ignoring.", optarg);
1574 else
1575 arg_resolve_name_timing = t;
912541b0 1576 break;
c4d44cba 1577 }
912541b0 1578 case 'h':
37ec0fdd 1579 return help();
912541b0 1580 case 'V':
948aaa7c 1581 printf("%s\n", PACKAGE_VERSION);
bba7a484
TG
1582 return 0;
1583 case '?':
1584 return -EINVAL;
912541b0 1585 default:
bba7a484
TG
1586 assert_not_reached("Unhandled option");
1587
912541b0
KS
1588 }
1589 }
1590
bba7a484
TG
1591 return 1;
1592}
1593
b7f74dd4 1594static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1595 _cleanup_(manager_freep) Manager *manager = NULL;
6d5e65f6 1596 int r, fd_worker;
c0c6806b
TG
1597
1598 assert(ret);
1599
6f19b42f 1600 manager = new(Manager, 1);
c0c6806b
TG
1601 if (!manager)
1602 return log_oom();
1603
6f19b42f
YW
1604 *manager = (Manager) {
1605 .fd_inotify = -1,
1606 .worker_watch = { -1, -1 },
1607 .cgroup = cgroup,
1608 };
e237d8cb 1609
2024ed61 1610 udev_builtin_init();
b2d21d93 1611
c4d44cba 1612 manager->rules = udev_rules_new(arg_resolve_name_timing);
ecb17862 1613 if (!manager->rules)
044497e2 1614 return log_error_errno(ENOMEM, "Failed to read udev rules");
ecb17862 1615
2024ed61 1616 manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
f59118ec 1617 if (!manager->ctrl)
044497e2 1618 return log_error_errno(EINVAL, "Failed to initialize udev control socket");
e237d8cb 1619
c4b69e99
YW
1620 r = udev_ctrl_enable_receiving(manager->ctrl);
1621 if (r < 0)
1622 return log_error_errno(r, "Failed to bind udev control socket: %m");
1623
1624 fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
1625 if (fd_ctrl < 0)
044497e2 1626 return log_error_errno(fd_ctrl, "Failed to get udev control socket fd: %m");
c4b69e99 1627
7f2e3a14
YW
1628 r = device_monitor_new_full(&manager->monitor, MONITOR_GROUP_KERNEL, fd_uevent);
1629 if (r < 0)
1630 return log_error_errno(r, "Failed to initialize device monitor: %m");
e237d8cb 1631
7f2e3a14 1632 (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
c4b69e99 1633
e237d8cb
TG
1634 /* unnamed socket from workers to the main daemon */
1635 r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
1636 if (r < 0)
044497e2 1637 return log_error_errno(errno, "Failed to create socketpair for communicating with workers: %m");
e237d8cb 1638
693d371d 1639 fd_worker = manager->worker_watch[READ_END];
e237d8cb 1640
2ff48e98 1641 r = setsockopt_int(fd_worker, SOL_SOCKET, SO_PASSCRED, true);
e237d8cb 1642 if (r < 0)
044497e2 1643 return log_error_errno(r, "Failed to enable SO_PASSCRED: %m");
e237d8cb 1644
b7759e04
YW
1645 r = udev_watch_init();
1646 if (r < 0)
1647 return log_error_errno(r, "Failed to create inotify descriptor: %m");
1648 manager->fd_inotify = r;
e237d8cb 1649
2024ed61 1650 udev_watch_restore();
e237d8cb
TG
1651
1652 /* block and listen to all signals on signalfd */
72c0a2c2 1653 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) >= 0);
693d371d 1654
49f997f3
TG
1655 r = sd_event_default(&manager->event);
1656 if (r < 0)
044497e2 1657 return log_error_errno(r, "Failed to allocate event loop: %m");
49f997f3 1658
693d371d
TG
1659 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1660 if (r < 0)
044497e2 1661 return log_error_errno(r, "Failed to create SIGINT event source: %m");
693d371d
TG
1662
1663 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1664 if (r < 0)
044497e2 1665 return log_error_errno(r, "Failed to create SIGTERM event source: %m");
693d371d
TG
1666
1667 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1668 if (r < 0)
044497e2 1669 return log_error_errno(r, "Failed to create SIGHUP event source: %m");
693d371d
TG
1670
1671 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1672 if (r < 0)
044497e2 1673 return log_error_errno(r, "Failed to create SIGCHLD event source: %m");
693d371d
TG
1674
1675 r = sd_event_set_watchdog(manager->event, true);
1676 if (r < 0)
044497e2 1677 return log_error_errno(r, "Failed to create watchdog event source: %m");
693d371d 1678
11b1dd8c 1679 r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager);
693d371d 1680 if (r < 0)
044497e2 1681 return log_error_errno(r, "Failed to create udev control event source: %m");
693d371d
TG
1682
1683 /* This needs to be after the inotify and uevent handling, to make sure
1684 * that the ping is send back after fully processing the pending uevents
1685 * (including the synthetic ones we may create due to inotify events).
1686 */
1687 r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
1688 if (r < 0)
044497e2 1689 return log_error_errno(r, "Failed to set IDLE event priority for udev control event source: %m");
693d371d
TG
1690
1691 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1692 if (r < 0)
044497e2 1693 return log_error_errno(r, "Failed to create inotify event source: %m");
693d371d 1694
f00d2b6d
YW
1695 r = sd_device_monitor_attach_event(manager->monitor, manager->event);
1696 if (r < 0)
1697 return log_error_errno(r, "Failed to attach event to device monitor: %m");
1698
1699 r = sd_device_monitor_start(manager->monitor, on_uevent, manager);
693d371d 1700 if (r < 0)
f00d2b6d
YW
1701 return log_error_errno(r, "Failed to start device monitor: %m");
1702
1703 (void) sd_event_source_set_description(sd_device_monitor_get_event_source(manager->monitor), "device-monitor");
693d371d
TG
1704
1705 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1706 if (r < 0)
044497e2 1707 return log_error_errno(r, "Failed to create worker event source: %m");
693d371d
TG
1708
1709 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1710 if (r < 0)
044497e2 1711 return log_error_errno(r, "Failed to create post event source: %m");
e237d8cb 1712
1cc6c93a 1713 *ret = TAKE_PTR(manager);
11b1dd8c 1714
86c3bece 1715 return 0;
c0c6806b
TG
1716}
1717
077fc5e2 1718static int run(int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1719 _cleanup_(manager_freep) Manager *manager = NULL;
077fc5e2
DH
1720 int r;
1721
1722 r = manager_new(&manager, fd_ctrl, fd_uevent, cgroup);
1723 if (r < 0) {
044497e2 1724 r = log_error_errno(r, "Failed to allocate manager object: %m");
077fc5e2
DH
1725 goto exit;
1726 }
1727
1728 r = udev_rules_apply_static_dev_perms(manager->rules);
1729 if (r < 0)
044497e2 1730 log_error_errno(r, "Failed to apply permissions on static device nodes: %m");
077fc5e2 1731
1ef72b55
MS
1732 (void) sd_notifyf(false,
1733 "READY=1\n"
1734 "STATUS=Processing with %u children at max", arg_children_max);
077fc5e2
DH
1735
1736 r = sd_event_loop(manager->event);
1737 if (r < 0) {
044497e2 1738 log_error_errno(r, "Event loop failed: %m");
077fc5e2
DH
1739 goto exit;
1740 }
1741
1742 sd_event_get_exit_code(manager->event, &r);
1743
1744exit:
1745 sd_notify(false,
1746 "STOPPING=1\n"
1747 "STATUS=Shutting down...");
1748 if (manager)
1749 udev_ctrl_cleanup(manager->ctrl);
1750 return r;
1751}
1752
1753int main(int argc, char *argv[]) {
c26d1879 1754 _cleanup_free_ char *cgroup = NULL;
efa1606e 1755 int fd_ctrl = -1, fd_uevent = -1;
e5d7bce1 1756 int r;
bba7a484 1757
bba7a484 1758 log_set_target(LOG_TARGET_AUTO);
a14e7af1 1759 udev_parse_config_full(&arg_children_max, &arg_exec_delay_usec, &arg_event_timeout_usec, &arg_resolve_name_timing);
bba7a484
TG
1760 log_parse_environment();
1761 log_open();
1762
bba7a484
TG
1763 r = parse_argv(argc, argv);
1764 if (r <= 0)
1765 goto exit;
1766
1d84ad94 1767 r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
614a823c 1768 if (r < 0)
044497e2 1769 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
912541b0 1770
78d3e041
KS
1771 if (arg_debug) {
1772 log_set_target(LOG_TARGET_CONSOLE);
bba7a484 1773 log_set_max_level(LOG_DEBUG);
78d3e041 1774 }
bba7a484 1775
6174a243
YW
1776 log_set_max_level_realm(LOG_REALM_SYSTEMD, log_get_max_level());
1777
fba868fa
LP
1778 r = must_be_root();
1779 if (r < 0)
912541b0 1780 goto exit;
912541b0 1781
712cebf1
TG
1782 if (arg_children_max == 0) {
1783 cpu_set_t cpu_set;
e438c57a 1784 unsigned long mem_limit;
ebc164ef 1785
712cebf1 1786 arg_children_max = 8;
d457ff83 1787
ece174c5 1788 if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) == 0)
faae64fa 1789 arg_children_max += CPU_COUNT(&cpu_set) * 8;
912541b0 1790
e438c57a
MW
1791 mem_limit = physical_memory() / (128LU*1024*1024);
1792 arg_children_max = MAX(10U, MIN(arg_children_max, mem_limit));
1793
044497e2 1794 log_debug("Set children_max to %u", arg_children_max);
d457ff83 1795 }
912541b0 1796
712cebf1
TG
1797 /* set umask before creating any file/directory */
1798 r = chdir("/");
1799 if (r < 0) {
044497e2 1800 r = log_error_errno(errno, "Failed to change dir to '/': %m");
712cebf1
TG
1801 goto exit;
1802 }
194bbe33 1803
712cebf1 1804 umask(022);
912541b0 1805
c3dacc8b 1806 r = mac_selinux_init();
712cebf1
TG
1807 if (r < 0) {
1808 log_error_errno(r, "could not initialize labelling: %m");
1809 goto exit;
912541b0
KS
1810 }
1811
dae8b82e
ZJS
1812 r = mkdir_errno_wrapper("/run/udev", 0755);
1813 if (r < 0 && r != -EEXIST) {
044497e2 1814 log_error_errno(r, "Failed to create /run/udev: %m");
712cebf1
TG
1815 goto exit;
1816 }
1817
03cfe0d5 1818 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1819
c26d1879
TG
1820 if (getppid() == 1) {
1821 /* get our own cgroup, we regularly kill everything udev has left behind
1822 we only do this on systemd systems, and only if we are directly spawned
1823 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1824 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
11b9fb15 1825 if (r < 0) {
a2d61f07 1826 if (IN_SET(r, -ENOENT, -ENOMEDIUM))
044497e2 1827 log_debug_errno(r, "Dedicated cgroup not found: %m");
11b9fb15 1828 else
044497e2 1829 log_warning_errno(r, "Failed to get cgroup: %m");
11b9fb15 1830 }
c26d1879
TG
1831 }
1832
b7f74dd4
TG
1833 r = listen_fds(&fd_ctrl, &fd_uevent);
1834 if (r < 0) {
044497e2 1835 r = log_error_errno(r, "Failed to listen on fds: %m");
b7f74dd4
TG
1836 goto exit;
1837 }
1838
bba7a484 1839 if (arg_daemonize) {
912541b0 1840 pid_t pid;
912541b0 1841
948aaa7c 1842 log_info("starting version " PACKAGE_VERSION);
3cbb2057 1843
40e749b5 1844 /* connect /dev/null to stdin, stdout, stderr */
c76cf844
AK
1845 if (log_get_max_level() < LOG_DEBUG) {
1846 r = make_null_stdio();
1847 if (r < 0)
1848 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
1849 }
1850
912541b0
KS
1851 pid = fork();
1852 switch (pid) {
1853 case 0:
1854 break;
1855 case -1:
044497e2 1856 r = log_error_errno(errno, "Failed to fork daemon: %m");
912541b0
KS
1857 goto exit;
1858 default:
f53d1fcd
TG
1859 mac_selinux_finish();
1860 log_close();
1861 _exit(EXIT_SUCCESS);
912541b0
KS
1862 }
1863
1864 setsid();
1865
76cdddfb
YW
1866 r = set_oom_score_adjust(-1000);
1867 if (r < 0)
1868 log_debug_errno(r, "Failed to adjust OOM score, ignoring: %m");
7500cd5e 1869 }
912541b0 1870
077fc5e2 1871 r = run(fd_ctrl, fd_uevent, cgroup);
693d371d 1872
53921bfa 1873exit:
cc56fafe 1874 mac_selinux_finish();
baa30fbc 1875 log_close();
6af5e6a4 1876 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
7fafc032 1877}