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