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