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