]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
Merge pull request #10871 from keszybz/more-cleanup-2
[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"
5ea78a39 60#include "strxcpyx.h"
46f0fbd8 61#include "syslog-util.h"
07a26e42 62#include "udev-builtin.h"
7d68eb1b 63#include "udev-ctrl.h"
618234a5 64#include "udev-util.h"
70068602 65#include "udev-watch.h"
618234a5 66#include "udev.h"
ee104e11 67#include "user-util.h"
7fafc032 68
bba7a484
TG
69static bool arg_debug = false;
70static int arg_daemonize = false;
c4d44cba 71static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
216e8bbe 72static unsigned arg_children_max = 0;
6b92f429 73static usec_t arg_exec_delay_usec = 0;
bba7a484 74static usec_t arg_event_timeout_usec = 180 * USEC_PER_SEC;
c0c6806b
TG
75
76typedef struct Manager {
693d371d 77 sd_event *event;
c0c6806b 78 Hashmap *workers;
40a57716 79 LIST_HEAD(struct event, events);
c26d1879 80 const char *cgroup;
cb49a4f2 81 pid_t pid; /* the process that originally allocated the manager object */
c0c6806b 82
ecb17862 83 struct udev_rules *rules;
9b5150b6 84 Hashmap *properties;
c0c6806b 85
0bed242c
YW
86 sd_netlink *rtnl;
87
7f2e3a14 88 sd_device_monitor *monitor;
c0c6806b
TG
89 struct udev_ctrl *ctrl;
90 struct udev_ctrl_connection *ctrl_conn_blocking;
e237d8cb 91 int fd_inotify;
e237d8cb
TG
92 int worker_watch[2];
93
693d371d
TG
94 sd_event_source *ctrl_event;
95 sd_event_source *uevent_event;
96 sd_event_source *inotify_event;
eca195ec 97 sd_event_source *kill_workers_event;
693d371d 98
7c4c7e89
TG
99 usec_t last_usec;
100
c0c6806b 101 bool stop_exec_queue:1;
c0c6806b
TG
102 bool exit:1;
103} Manager;
1e03b754 104
1e03b754 105enum event_state {
912541b0
KS
106 EVENT_UNDEF,
107 EVENT_QUEUED,
108 EVENT_RUNNING,
1e03b754
KS
109};
110
111struct event {
cb49a4f2 112 Manager *manager;
c6aa11f2 113 struct worker *worker;
912541b0 114 enum event_state state;
eb546b35
YW
115
116 sd_device *dev;
117 sd_device *dev_kernel; /* clone of originally received device */
118
119 uint64_t seqnum;
120 uint64_t delaying_seqnum;
d8f462b4
YW
121
122 sd_event_source *timeout_warning_event;
123 sd_event_source *timeout_event;
eb546b35
YW
124
125 LIST_FIELDS(struct event, event);
1e03b754
KS
126};
127
ecb17862 128static void event_queue_cleanup(Manager *manager, enum event_state type);
ff2c503d 129
1e03b754 130enum worker_state {
912541b0
KS
131 WORKER_UNDEF,
132 WORKER_RUNNING,
133 WORKER_IDLE,
134 WORKER_KILLED,
1e03b754
KS
135};
136
137struct worker {
c0c6806b 138 Manager *manager;
912541b0 139 pid_t pid;
7f2e3a14 140 sd_device_monitor *monitor;
912541b0
KS
141 enum worker_state state;
142 struct event *event;
1e03b754
KS
143};
144
145/* passed from worker to main process */
146struct worker_message {
1e03b754
KS
147};
148
c6aa11f2
TG
149static void event_free(struct event *event) {
150 if (!event)
151 return;
ba47b71c 152
40a57716 153 assert(event->manager);
c6aa11f2 154
40a57716 155 LIST_REMOVE(event, event->manager->events, event);
eb546b35
YW
156 sd_device_unref(event->dev);
157 sd_device_unref(event->dev_kernel);
c6aa11f2 158
d8f462b4
YW
159 sd_event_source_unref(event->timeout_warning_event);
160 sd_event_source_unref(event->timeout_event);
693d371d 161
c6aa11f2
TG
162 if (event->worker)
163 event->worker->event = NULL;
164
ba47b71c
YW
165 /* only clean up the queue from the process that created it */
166 if (LIST_IS_EMPTY(event->manager->events) &&
167 event->manager->pid == getpid_cached())
168 if (unlink("/run/udev/queue") < 0)
169 log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m");
cb49a4f2 170
912541b0 171 free(event);
aa8734ff 172}
7a770250 173
c6aa11f2
TG
174static void worker_free(struct worker *worker) {
175 if (!worker)
176 return;
bc113de9 177
c0c6806b
TG
178 assert(worker->manager);
179
4a0b58c4 180 hashmap_remove(worker->manager->workers, PID_TO_PTR(worker->pid));
7f2e3a14 181 sd_device_monitor_unref(worker->monitor);
c6aa11f2
TG
182 event_free(worker->event);
183
c6aa11f2 184 free(worker);
ff2c503d
KS
185}
186
c0c6806b 187static void manager_workers_free(Manager *manager) {
a505965d
TG
188 struct worker *worker;
189 Iterator i;
ff2c503d 190
c0c6806b
TG
191 assert(manager);
192
193 HASHMAP_FOREACH(worker, manager->workers, i)
c6aa11f2 194 worker_free(worker);
a505965d 195
c0c6806b 196 manager->workers = hashmap_free(manager->workers);
fc465079
KS
197}
198
7f2e3a14 199static int worker_new(struct worker **ret, Manager *manager, sd_device_monitor *worker_monitor, pid_t pid) {
a505965d
TG
200 _cleanup_free_ struct worker *worker = NULL;
201 int r;
3a19b32a
TG
202
203 assert(ret);
c0c6806b 204 assert(manager);
3a19b32a
TG
205 assert(worker_monitor);
206 assert(pid > 1);
207
208 worker = new0(struct worker, 1);
209 if (!worker)
210 return -ENOMEM;
211
c0c6806b 212 worker->manager = manager;
3a19b32a 213 /* close monitor, but keep address around */
7f2e3a14
YW
214 device_monitor_disconnect(worker_monitor);
215 worker->monitor = sd_device_monitor_ref(worker_monitor);
3a19b32a 216 worker->pid = pid;
a505965d 217
c0c6806b 218 r = hashmap_ensure_allocated(&manager->workers, NULL);
a505965d
TG
219 if (r < 0)
220 return r;
221
4a0b58c4 222 r = hashmap_put(manager->workers, PID_TO_PTR(pid), worker);
a505965d
TG
223 if (r < 0)
224 return r;
225
ae2a15bc 226 *ret = TAKE_PTR(worker);
3a19b32a
TG
227
228 return 0;
229}
230
4fa4d885
TG
231static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
232 struct event *event = userdata;
233
234 assert(event);
235 assert(event->worker);
236
237 kill_and_sigcont(event->worker->pid, SIGKILL);
238 event->worker->state = WORKER_KILLED;
239
eb546b35 240 log_device_error(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" killed", event->worker->pid, event->seqnum);
4fa4d885
TG
241
242 return 1;
243}
244
245static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
246 struct event *event = userdata;
247
248 assert(event);
044497e2 249 assert(event->worker);
4fa4d885 250
eb546b35 251 log_device_warning(event->dev, "Worker ["PID_FMT"] processing SEQNUM=%"PRIu64" is taking a long time", event->worker->pid, event->seqnum);
4fa4d885
TG
252
253 return 1;
254}
255
39c19cf1 256static void worker_attach_event(struct worker *worker, struct event *event) {
693d371d
TG
257 sd_event *e;
258 uint64_t usec;
693d371d 259
c6aa11f2 260 assert(worker);
693d371d 261 assert(worker->manager);
c6aa11f2
TG
262 assert(event);
263 assert(!event->worker);
264 assert(!worker->event);
265
39c19cf1 266 worker->state = WORKER_RUNNING;
39c19cf1
TG
267 worker->event = event;
268 event->state = EVENT_RUNNING;
c6aa11f2 269 event->worker = worker;
693d371d
TG
270
271 e = worker->manager->event;
272
3285baa8 273 assert_se(sd_event_now(e, CLOCK_MONOTONIC, &usec) >= 0);
693d371d 274
d8f462b4 275 (void) sd_event_add_time(e, &event->timeout_warning_event, CLOCK_MONOTONIC,
66f737b4 276 usec + udev_warn_timeout(arg_event_timeout_usec), USEC_PER_SEC, on_event_timeout_warning, event);
693d371d 277
d8f462b4 278 (void) sd_event_add_time(e, &event->timeout_event, CLOCK_MONOTONIC,
693d371d 279 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
39c19cf1
TG
280}
281
0bed242c
YW
282static void manager_clear_for_worker(Manager *manager) {
283 assert(manager);
284
285 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
286 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
287 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
288 manager->kill_workers_event = sd_event_source_unref(manager->kill_workers_event);
289
290 manager->event = sd_event_unref(manager->event);
291
292 manager_workers_free(manager);
293 event_queue_cleanup(manager, EVENT_UNDEF);
294
7f2e3a14 295 manager->monitor = sd_device_monitor_unref(manager->monitor);
0bed242c
YW
296 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
297 manager->ctrl = udev_ctrl_unref(manager->ctrl);
298
299 manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
300}
301
e237d8cb
TG
302static void manager_free(Manager *manager) {
303 if (!manager)
304 return;
305
2024ed61 306 udev_builtin_exit();
b2d21d93 307
0bed242c 308 manager_clear_for_worker(manager);
693d371d 309
0bed242c 310 sd_netlink_unref(manager->rtnl);
e237d8cb 311
9b5150b6 312 hashmap_free_free_free(manager->properties);
e237d8cb 313 udev_rules_unref(manager->rules);
e237d8cb 314
e237d8cb
TG
315 safe_close(manager->fd_inotify);
316 safe_close_pair(manager->worker_watch);
317
318 free(manager);
319}
320
321DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
322
9a73bd7c
TG
323static int worker_send_message(int fd) {
324 struct worker_message message = {};
325
326 return loop_write(fd, &message, sizeof(message), false);
327}
328
b97897e3 329static int worker_lock_block_device(sd_device *dev, int *ret_fd) {
0bed242c 330 _cleanup_close_ int fd = -1;
b97897e3
YW
331 const char *val;
332 int r;
fee854ee 333
0bed242c
YW
334 assert(dev);
335 assert(ret_fd);
336
337 /*
338 * Take a shared lock on the device node; this establishes
339 * a concept of device "ownership" to serialize device
340 * access. External processes holding an exclusive lock will
341 * cause udev to skip the event handling; in the case udev
342 * acquired the lock, the external process can block until
343 * udev has finished its event handling.
344 */
345
b97897e3
YW
346 r = sd_device_get_property_value(dev, "ACTION", &val);
347 if (r < 0)
348 return log_device_debug_errno(dev, r, "Failed to get the value of property 'ACTION': %m");
349
350 if (streq(val, "remove"))
0bed242c
YW
351 return 0;
352
b97897e3
YW
353 r = sd_device_get_subsystem(dev, &val);
354 if (r < 0)
355 return log_device_debug_errno(dev, r, "Failed to get subsystem: %m");
356
357 if (!streq(val, "block"))
0bed242c 358 return 0;
fee854ee 359
b97897e3
YW
360 r = sd_device_get_sysname(dev, &val);
361 if (r < 0)
362 return log_device_debug_errno(dev, r, "Failed to get sysname: %m");
363
364 if (startswith(val, "dm-") ||
365 startswith(val, "md") ||
366 startswith(val, "drbd"))
0bed242c
YW
367 return 0;
368
b97897e3
YW
369 r = sd_device_get_devtype(dev, &val);
370 if (r < 0 && r != -ENOENT)
371 return log_device_debug_errno(dev, r, "Failed to get devtype: %m");
372 if (r >= 0 && streq(val, "partition")) {
373 r = sd_device_get_parent(dev, &dev);
374 if (r < 0)
375 return log_device_debug_errno(dev, r, "Failed to get parent device: %m");
376 }
0bed242c 377
b97897e3
YW
378 r = sd_device_get_devname(dev, &val);
379 if (r == -ENOENT)
0bed242c 380 return 0;
b97897e3
YW
381 if (r < 0)
382 return log_device_debug_errno(dev, r, "Failed to get devname: %m");
0bed242c 383
b97897e3
YW
384 fd = open(val, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
385 if (fd < 0) {
386 log_device_debug_errno(dev, errno, "Failed to open '%s', ignoring: %m", val);
0bed242c 387 return 0;
b97897e3 388 }
0bed242c
YW
389
390 if (flock(fd, LOCK_SH|LOCK_NB) < 0)
b97897e3 391 return log_device_debug_errno(dev, errno, "Failed to flock(%s): %m", val);
0bed242c
YW
392
393 *ret_fd = TAKE_FD(fd);
394 return 1;
fee854ee
RK
395}
396
abde5ea8 397static int worker_process_device(Manager *manager, sd_device *dev) {
0bed242c
YW
398 _cleanup_(udev_event_freep) struct udev_event *udev_event = NULL;
399 _cleanup_close_ int fd_lock = -1;
abde5ea8 400 const char *seqnum;
0bed242c 401 int r;
912541b0 402
0bed242c
YW
403 assert(manager);
404 assert(dev);
405
abde5ea8
YW
406 r = sd_device_get_property_value(dev, "SEQNUM", &seqnum);
407 if (r < 0)
408 log_device_debug_errno(dev, r, "Failed to get SEQNUM: %m");
409
410 log_device_debug(dev, "Processing device (SEQNUM=%s)", seqnum);
411
412 udev_event = udev_event_new(dev, arg_exec_delay_usec, manager->rtnl);
0bed242c
YW
413 if (!udev_event)
414 return -ENOMEM;
415
abde5ea8 416 r = worker_lock_block_device(dev, &fd_lock);
b6aab8ef 417 if (r < 0)
0bed242c 418 return r;
912541b0 419
0bed242c
YW
420 /* apply rules, create node, symlinks */
421 udev_event_execute_rules(udev_event, arg_event_timeout_usec, manager->properties, manager->rules);
422 udev_event_execute_run(udev_event, arg_event_timeout_usec);
2dd9f98d 423
0bed242c
YW
424 if (!manager->rtnl)
425 /* in case rtnl was initialized */
426 manager->rtnl = sd_netlink_ref(udev_event->rtnl);
912541b0 427
0bed242c
YW
428 /* apply/restore inotify watch */
429 if (udev_event->inotify_watch) {
abde5ea8
YW
430 (void) udev_watch_begin(dev);
431 r = device_update_db(dev);
432 if (r < 0)
433 return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
0bed242c 434 }
912541b0 435
abde5ea8 436 log_device_debug(dev, "Device (SEQNUM=%s) processed", seqnum);
912541b0 437
0bed242c
YW
438 return 0;
439}
912541b0 440
e2130348
YW
441static int worker_device_monitor_handler(sd_device_monitor *monitor, sd_device *dev, void *userdata) {
442 Manager *manager = userdata;
443 int r;
444
445 assert(dev);
446 assert(manager);
447
448 r = worker_process_device(manager, dev);
449 if (r < 0)
450 log_device_warning_errno(dev, r, "Failed to process device, ignoring: %m");
451
452 /* send processed event back to libudev listeners */
453 r = device_monitor_send_device(monitor, NULL, dev);
454 if (r < 0)
455 log_device_warning_errno(dev, r, "Failed to send device, ignoring: %m");
456
457 /* send udevd the result of the event execution */
458 r = worker_send_message(manager->worker_watch[WRITE_END]);
459 if (r < 0)
460 log_device_warning_errno(dev, r, "Failed to send signal to main daemon, ignoring: %m");
461
462 return 1;
463}
464
7f2e3a14
YW
465static int worker_main(Manager *_manager, sd_device_monitor *monitor, sd_device *first_device) {
466 _cleanup_(sd_device_unrefp) sd_device *dev = first_device;
0bed242c 467 _cleanup_(manager_freep) Manager *manager = _manager;
e2130348 468 int r, ret;
145dae7e 469
0bed242c
YW
470 assert(manager);
471 assert(monitor);
472 assert(dev);
912541b0 473
0bed242c 474 unsetenv("NOTIFY_SOCKET");
3b64e4d4 475
e2130348
YW
476 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, -1) >= 0);
477
478 /* Reset OOM score, we only protect the main daemon. */
479 r = set_oom_score_adjust(0);
480 if (r < 0)
481 log_debug_errno(r, "Failed to reset OOM score, ignoring: %m");
912541b0 482
e2130348
YW
483 /* Clear unnecessary data in Manager object.*/
484 manager_clear_for_worker(manager);
3ebdb81e 485
e2130348
YW
486 r = sd_event_new(&manager->event);
487 if (r < 0)
488 return log_error_errno(r, "Failed to allocate event loop: %m");
912541b0 489
e2130348
YW
490 r = sd_event_add_signal(manager->event, NULL, SIGTERM, NULL, NULL);
491 if (r < 0)
492 return log_error_errno(r, "Failed to set SIGTERM event: %m");
4c83d994 493
e2130348
YW
494 r = sd_device_monitor_attach_event(monitor, manager->event);
495 if (r < 0)
496 return log_error_errno(r, "Failed to attach event loop to device monitor: %m");
912541b0 497
e2130348 498 r = sd_device_monitor_start(monitor, worker_device_monitor_handler, manager);
0bed242c 499 if (r < 0)
e2130348 500 return log_error_errno(r, "Failed to start device monitor: %m");
912541b0 501
e2130348 502 (void) sd_event_source_set_description(sd_device_monitor_get_event_source(monitor), "worker-device-monitor");
b66f29a1 503
e2130348
YW
504 /* Process first device */
505 (void) worker_device_monitor_handler(monitor, dev, manager);
912541b0 506
e2130348
YW
507 r = sd_event_loop(manager->event);
508 if (r < 0)
509 return log_error_errno(r, "Event loop failed: %m");
510
511 r = sd_event_get_exit_code(manager->event, &ret);
512 if (r < 0)
513 return log_error_errno(r, "Failed to get exit code: %m");
514
515 return ret;
0bed242c
YW
516}
517
7443654e 518static int worker_spawn(Manager *manager, struct event *event) {
7f2e3a14 519 _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *worker_monitor = NULL;
7443654e 520 struct worker *worker;
0bed242c 521 pid_t pid;
7443654e 522 int r;
0bed242c
YW
523
524 /* listen for new events */
7f2e3a14
YW
525 r = device_monitor_new_full(&worker_monitor, MONITOR_GROUP_NONE, -1);
526 if (r < 0)
527 return r;
7443654e 528
0bed242c 529 /* allow the main daemon netlink address to send devices to the worker */
7f2e3a14
YW
530 r = device_monitor_allow_unicast_sender(worker_monitor, manager->monitor);
531 if (r < 0)
532 return log_error_errno(r, "Worker: Failed to set unicast sender: %m");
533
534 r = device_monitor_enable_receiving(worker_monitor);
0bed242c 535 if (r < 0)
7f2e3a14 536 return log_error_errno(r, "Worker: Failed to enable receiving of device: %m");
0bed242c 537
7443654e
YW
538 r = safe_fork(NULL, FORK_DEATHSIG, &pid);
539 if (r < 0) {
540 event->state = EVENT_QUEUED;
541 return log_error_errno(r, "Failed to fork() worker: %m");
542 }
543 if (r == 0) {
544 /* Worker process */
eb546b35 545 r = worker_main(manager, worker_monitor, sd_device_ref(event->dev));
baa30fbc 546 log_close();
8b46c3fc 547 _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
912541b0 548 }
e03c7cc2 549
7443654e
YW
550 r = worker_new(&worker, manager, worker_monitor, pid);
551 if (r < 0)
552 return log_error_errno(r, "Failed to create worker object: %m");
e03c7cc2 553
7443654e 554 worker_attach_event(worker, event);
39c19cf1 555
eb546b35 556 log_device_debug(event->dev, "Worker ["PID_FMT"] is forked for processing SEQNUM=%"PRIu64".", pid, event->seqnum);
7443654e 557 return 0;
7fafc032
KS
558}
559
c0c6806b 560static void event_run(Manager *manager, struct event *event) {
a505965d
TG
561 struct worker *worker;
562 Iterator i;
7f2e3a14 563 int r;
912541b0 564
c0c6806b
TG
565 assert(manager);
566 assert(event);
567
568 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
569 if (worker->state != WORKER_IDLE)
570 continue;
571
eb546b35 572 r = device_monitor_send_device(manager->monitor, worker->monitor, event->dev);
7f2e3a14 573 if (r < 0) {
eb546b35 574 log_device_error_errno(event->dev, r, "Worker ["PID_FMT"] did not accept message, killing the worker: %m",
7f2e3a14 575 worker->pid);
cb542e84 576 (void) kill(worker->pid, SIGKILL);
912541b0
KS
577 worker->state = WORKER_KILLED;
578 continue;
579 }
39c19cf1 580 worker_attach_event(worker, event);
912541b0
KS
581 return;
582 }
583
c0c6806b 584 if (hashmap_size(manager->workers) >= arg_children_max) {
bba7a484 585 if (arg_children_max > 1)
044497e2 586 log_debug("Maximum number (%u) of children reached.", hashmap_size(manager->workers));
912541b0
KS
587 return;
588 }
589
590 /* start new worker and pass initial device */
c0c6806b 591 worker_spawn(manager, event);
1e03b754
KS
592}
593
eb546b35
YW
594static int event_queue_insert(Manager *manager, sd_device *dev) {
595 _cleanup_(sd_device_unrefp) sd_device *clone = NULL;
912541b0 596 struct event *event;
eb546b35
YW
597 const char *val;
598 uint64_t seqnum;
cb49a4f2 599 int r;
912541b0 600
ecb17862
TG
601 assert(manager);
602 assert(dev);
603
040e6896
TG
604 /* only one process can add events to the queue */
605 if (manager->pid == 0)
df0ff127 606 manager->pid = getpid_cached();
040e6896 607
df0ff127 608 assert(manager->pid == getpid_cached());
cb49a4f2 609
eb546b35
YW
610 /* We only accepts devices received by device monitor. */
611 r = sd_device_get_property_value(dev, "SEQNUM", &val);
612 if (r < 0)
613 return r;
614
615 r = safe_atou64(val, &seqnum);
616 if (r < 0)
617 return r;
618
619 if (seqnum == 0)
620 return -EINVAL;
912541b0 621
eb546b35
YW
622 /* Save original device to restore the state on failures. */
623 r = device_shallow_clone(dev, &clone);
624 if (r < 0)
625 return r;
626
627 r = device_copy_properties(clone, dev);
628 if (r < 0)
629 return r;
912541b0 630
eb546b35
YW
631 event = new(struct event, 1);
632 if (!event)
633 return -ENOMEM;
912541b0 634
eb546b35
YW
635 *event = (struct event) {
636 .manager = manager,
637 .dev = sd_device_ref(dev),
638 .dev_kernel = TAKE_PTR(clone),
639 .seqnum = seqnum,
640 .state = EVENT_QUEUED,
641 };
cb49a4f2 642
40a57716 643 if (LIST_IS_EMPTY(manager->events)) {
cb49a4f2
TG
644 r = touch("/run/udev/queue");
645 if (r < 0)
044497e2 646 log_warning_errno(r, "Failed to touch /run/udev/queue: %m");
cb49a4f2
TG
647 }
648
40a57716 649 LIST_APPEND(event, manager->events, event);
cb49a4f2 650
eb546b35
YW
651 if (DEBUG_LOGGING) {
652 if (sd_device_get_property_value(dev, "ACTION", &val) < 0)
653 val = NULL;
654
655 log_device_debug(dev, "Device (SEQNUM=%"PRIu64", ACTION=%s) is queued", seqnum, strnull(val));
656 }
657
912541b0 658 return 0;
fc465079
KS
659}
660
c0c6806b 661static void manager_kill_workers(Manager *manager) {
a505965d
TG
662 struct worker *worker;
663 Iterator i;
1e03b754 664
c0c6806b
TG
665 assert(manager);
666
667 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
668 if (worker->state == WORKER_KILLED)
669 continue;
1e03b754 670
912541b0 671 worker->state = WORKER_KILLED;
cb542e84 672 (void) kill(worker->pid, SIGTERM);
912541b0 673 }
1e03b754
KS
674}
675
e3196993 676/* lookup event for identical, parent, child device */
eb546b35
YW
677static int is_device_busy(Manager *manager, struct event *event) {
678 const char *subsystem, *devpath, *devpath_old = NULL;
679 dev_t devnum = makedev(0, 0);
40a57716 680 struct event *loop_event;
eb546b35
YW
681 size_t devpath_len;
682 int r, ifindex = 0;
683 bool is_block;
684
685 r = sd_device_get_subsystem(event->dev, &subsystem);
686 if (r < 0)
687 return r;
688
689 is_block = streq(subsystem, "block");
690
691 r = sd_device_get_devpath(event->dev, &devpath);
692 if (r < 0)
693 return r;
694
695 devpath_len = strlen(devpath);
696
697 r = sd_device_get_property_value(event->dev, "DEVPATH_OLD", &devpath_old);
698 if (r < 0 && r != -ENOENT)
699 return r;
700
701 r = sd_device_get_devnum(event->dev, &devnum);
702 if (r < 0 && r != -ENOENT)
703 return r;
704
705 r = sd_device_get_ifindex(event->dev, &ifindex);
706 if (r < 0 && r != -ENOENT)
707 return r;
912541b0
KS
708
709 /* check if queue contains events we depend on */
40a57716 710 LIST_FOREACH(event, loop_event, manager->events) {
eb546b35
YW
711 size_t loop_devpath_len, common;
712 const char *loop_devpath;
713
87ac8d99 714 /* we already found a later event, earlier cannot block us, no need to check again */
912541b0
KS
715 if (loop_event->seqnum < event->delaying_seqnum)
716 continue;
717
718 /* event we checked earlier still exists, no need to check again */
719 if (loop_event->seqnum == event->delaying_seqnum)
720 return true;
721
722 /* found ourself, no later event can block us */
723 if (loop_event->seqnum >= event->seqnum)
724 break;
725
726 /* check major/minor */
eb546b35
YW
727 if (major(devnum) != 0) {
728 const char *s;
729 dev_t d;
730
731 if (sd_device_get_subsystem(loop_event->dev, &s) < 0)
732 continue;
733
734 if (sd_device_get_devnum(loop_event->dev, &d) >= 0 &&
735 devnum == d && is_block == streq(s, "block"))
736 return true;
737 }
912541b0
KS
738
739 /* check network device ifindex */
eb546b35
YW
740 if (ifindex > 0) {
741 int i;
742
743 if (sd_device_get_ifindex(loop_event->dev, &i) >= 0 &&
744 ifindex == i)
745 return true;
746 }
747
748 if (sd_device_get_devpath(loop_event->dev, &loop_devpath) < 0)
749 continue;
912541b0
KS
750
751 /* check our old name */
eb546b35 752 if (devpath_old && streq(devpath_old, loop_devpath)) {
912541b0
KS
753 event->delaying_seqnum = loop_event->seqnum;
754 return true;
755 }
756
eb546b35
YW
757 loop_devpath_len = strlen(loop_devpath);
758
912541b0 759 /* compare devpath */
eb546b35 760 common = MIN(devpath_len, loop_devpath_len);
912541b0
KS
761
762 /* one devpath is contained in the other? */
eb546b35 763 if (!strneq(devpath, loop_devpath, common))
912541b0
KS
764 continue;
765
766 /* identical device event found */
eb546b35 767 if (devpath_len == loop_devpath_len) {
912541b0 768 /* devices names might have changed/swapped in the meantime */
eb546b35 769 if (major(devnum) != 0 || ifindex > 0)
912541b0
KS
770 continue;
771 event->delaying_seqnum = loop_event->seqnum;
772 return true;
773 }
774
775 /* parent device event found */
eb546b35 776 if (devpath[common] == '/') {
912541b0
KS
777 event->delaying_seqnum = loop_event->seqnum;
778 return true;
779 }
780
781 /* child device event found */
eb546b35 782 if (loop_devpath[common] == '/') {
912541b0
KS
783 event->delaying_seqnum = loop_event->seqnum;
784 return true;
785 }
912541b0
KS
786 }
787
788 return false;
7fafc032
KS
789}
790
693d371d
TG
791static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
792 Manager *manager = userdata;
793
794 assert(manager);
795
d4e98880 796 log_error("Giving up waiting for workers to finish.");
693d371d
TG
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)) {
d4e98880 958 log_warning("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) {
d4e98880 970 log_warning("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)
886cf317 1614 return log_error_errno(SYNTHETIC_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)
886cf317 1618 return log_error_errno(SYNTHETIC_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
0c5a109a 1718static int main_loop(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
0c5a109a 1753static int run(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)
0c5a109a 1765 return r;
bba7a484 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)
0c5a109a 1780 return r;
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("/");
0c5a109a
ZJS
1799 if (r < 0)
1800 return log_error_errno(errno, "Failed to change dir to '/': %m");
194bbe33 1801
712cebf1 1802 umask(022);
912541b0 1803
c3dacc8b 1804 r = mac_selinux_init();
0c5a109a
ZJS
1805 if (r < 0)
1806 return log_error_errno(r, "Could not initialize labelling: %m");
912541b0 1807
dae8b82e 1808 r = mkdir_errno_wrapper("/run/udev", 0755);
0c5a109a
ZJS
1809 if (r < 0 && r != -EEXIST)
1810 return log_error_errno(r, "Failed to create /run/udev: %m");
712cebf1 1811
03cfe0d5 1812 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1813
c26d1879
TG
1814 if (getppid() == 1) {
1815 /* get our own cgroup, we regularly kill everything udev has left behind
1816 we only do this on systemd systems, and only if we are directly spawned
1817 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1818 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
11b9fb15 1819 if (r < 0) {
a2d61f07 1820 if (IN_SET(r, -ENOENT, -ENOMEDIUM))
044497e2 1821 log_debug_errno(r, "Dedicated cgroup not found: %m");
11b9fb15 1822 else
044497e2 1823 log_warning_errno(r, "Failed to get cgroup: %m");
11b9fb15 1824 }
c26d1879
TG
1825 }
1826
b7f74dd4 1827 r = listen_fds(&fd_ctrl, &fd_uevent);
0c5a109a
ZJS
1828 if (r < 0)
1829 return log_error_errno(r, "Failed to listen on fds: %m");
b7f74dd4 1830
bba7a484 1831 if (arg_daemonize) {
912541b0 1832 pid_t pid;
912541b0 1833
948aaa7c 1834 log_info("starting version " PACKAGE_VERSION);
3cbb2057 1835
40e749b5 1836 /* connect /dev/null to stdin, stdout, stderr */
c76cf844
AK
1837 if (log_get_max_level() < LOG_DEBUG) {
1838 r = make_null_stdio();
1839 if (r < 0)
1840 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
1841 }
1842
912541b0 1843 pid = fork();
0c5a109a
ZJS
1844 if (pid < 0)
1845 return log_error_errno(errno, "Failed to fork daemon: %m");
1846 if (pid > 0)
1847 /* parent */
1848 return 0;
912541b0 1849
0c5a109a 1850 /* child */
912541b0
KS
1851 setsid();
1852
76cdddfb
YW
1853 r = set_oom_score_adjust(-1000);
1854 if (r < 0)
1855 log_debug_errno(r, "Failed to adjust OOM score, ignoring: %m");
7500cd5e 1856 }
912541b0 1857
0c5a109a 1858 return main_loop(fd_ctrl, fd_uevent, cgroup);
7fafc032 1859}
0c5a109a
ZJS
1860
1861DEFINE_MAIN_FUNCTION(run);