]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
udevd: drop unnecessary brackets
[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;
912541b0 590 struct event *event;
eb546b35
YW
591 const char *val;
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
eb546b35
YW
616 /* Save original device to restore the state on failures. */
617 r = device_shallow_clone(dev, &clone);
618 if (r < 0)
619 return r;
620
621 r = device_copy_properties(clone, dev);
622 if (r < 0)
623 return r;
912541b0 624
eb546b35
YW
625 event = new(struct event, 1);
626 if (!event)
627 return -ENOMEM;
912541b0 628
eb546b35
YW
629 *event = (struct event) {
630 .manager = manager,
631 .dev = sd_device_ref(dev),
632 .dev_kernel = TAKE_PTR(clone),
633 .seqnum = seqnum,
634 .state = EVENT_QUEUED,
635 };
cb49a4f2 636
40a57716 637 if (LIST_IS_EMPTY(manager->events)) {
cb49a4f2
TG
638 r = touch("/run/udev/queue");
639 if (r < 0)
044497e2 640 log_warning_errno(r, "Failed to touch /run/udev/queue: %m");
cb49a4f2
TG
641 }
642
40a57716 643 LIST_APPEND(event, manager->events, event);
cb49a4f2 644
eb546b35
YW
645 if (DEBUG_LOGGING) {
646 if (sd_device_get_property_value(dev, "ACTION", &val) < 0)
647 val = NULL;
648
649 log_device_debug(dev, "Device (SEQNUM=%"PRIu64", ACTION=%s) is queued", seqnum, strnull(val));
650 }
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);
baa30fbc 1030 log_set_max_level(i);
c0c6806b 1031 manager_kill_workers(manager);
912541b0
KS
1032 }
1033
1034 if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
044497e2 1035 log_debug("Received udev control message (STOP_EXEC_QUEUE)");
c0c6806b 1036 manager->stop_exec_queue = true;
912541b0
KS
1037 }
1038
1039 if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
044497e2 1040 log_debug("Received udev control message (START_EXEC_QUEUE)");
c0c6806b 1041 manager->stop_exec_queue = false;
8302fe5a 1042 event_queue_start(manager);
912541b0
KS
1043 }
1044
1045 if (udev_ctrl_get_reload(ctrl_msg) > 0) {
044497e2 1046 log_debug("Received udev control message (RELOAD)");
62d43dac 1047 manager_reload(manager);
912541b0
KS
1048 }
1049
1050 str = udev_ctrl_get_set_env(ctrl_msg);
9b5150b6
YW
1051 if (str) {
1052 _cleanup_free_ char *key = NULL, *val = NULL, *old_key = NULL, *old_val = NULL;
1053 char *eq;
1054
1055 eq = strchr(str, '=');
1056 if (!eq) {
1057 log_error("Invalid key format '%s'", str);
1058 return 1;
1059 }
1060
1061 key = strndup(str, eq - str);
1062 if (!key) {
1063 log_oom();
1064 return 1;
1065 }
1066
1067 old_val = hashmap_remove2(manager->properties, key, (void **) &old_key);
1068
1069 r = hashmap_ensure_allocated(&manager->properties, &string_hash_ops);
1070 if (r < 0) {
1071 log_oom();
1072 return 1;
912541b0 1073 }
9b5150b6
YW
1074
1075 eq++;
1076 if (!isempty(eq)) {
044497e2 1077 log_debug("Received udev control message (ENV), unsetting '%s'", key);
9b5150b6
YW
1078
1079 r = hashmap_put(manager->properties, key, NULL);
1080 if (r < 0) {
1081 log_oom();
1082 return 1;
1083 }
1084 } else {
1085 val = strdup(eq);
1086 if (!val) {
1087 log_oom();
1088 return 1;
1089 }
1090
044497e2 1091 log_debug("Received udev control message (ENV), setting '%s=%s'", key, val);
9b5150b6
YW
1092
1093 r = hashmap_put(manager->properties, key, val);
1094 if (r < 0) {
1095 log_oom();
1096 return 1;
1097 }
1098 }
1099
1100 key = val = NULL;
c0c6806b 1101 manager_kill_workers(manager);
912541b0
KS
1102 }
1103
1104 i = udev_ctrl_get_set_children_max(ctrl_msg);
1105 if (i >= 0) {
044497e2 1106 log_debug("Receivd udev control message (SET_MAX_CHILDREN), setting children_max=%i", i);
bba7a484 1107 arg_children_max = i;
1ef72b55
MS
1108
1109 (void) sd_notifyf(false,
1110 "READY=1\n"
1111 "STATUS=Processing with %u children at max", arg_children_max);
912541b0
KS
1112 }
1113
cb49a4f2 1114 if (udev_ctrl_get_ping(ctrl_msg) > 0)
044497e2 1115 log_debug("Received udev control message (SYNC)");
912541b0
KS
1116
1117 if (udev_ctrl_get_exit(ctrl_msg) > 0) {
044497e2 1118 log_debug("Received udev control message (EXIT)");
62d43dac 1119 manager_exit(manager);
c0c6806b
TG
1120 /* keep reference to block the client until we exit
1121 TODO: deal with several blocking exit requests */
1122 manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
912541b0 1123 }
e4f66b77 1124
e82e8fa5 1125 return 1;
88f4b648 1126}
4a231017 1127
70068602
YW
1128static int synthesize_change(sd_device *dev) {
1129 const char *subsystem, *sysname, *devname, *syspath, *devtype;
1130 char filename[PATH_MAX];
f3a740a5 1131 int r;
edd32000 1132
70068602
YW
1133 r = sd_device_get_subsystem(dev, &subsystem);
1134 if (r < 0)
1135 return r;
1136
1137 r = sd_device_get_sysname(dev, &sysname);
1138 if (r < 0)
1139 return r;
1140
1141 r = sd_device_get_devname(dev, &devname);
1142 if (r < 0)
1143 return r;
1144
1145 r = sd_device_get_syspath(dev, &syspath);
1146 if (r < 0)
1147 return r;
1148
1149 r = sd_device_get_devtype(dev, &devtype);
1150 if (r < 0)
1151 return r;
1152
1153 if (streq_ptr("block", subsystem) &&
1154 streq_ptr("disk", devtype) &&
1155 !startswith(sysname, "dm-")) {
1156 _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
1157 bool part_table_read = false, has_partitions = false;
1158 sd_device *d;
ede34445 1159 int fd;
f3a740a5 1160
ede34445 1161 /*
e9fc29f4
KS
1162 * Try to re-read the partition table. This only succeeds if
1163 * none of the devices is busy. The kernel returns 0 if no
1164 * partition table is found, and we will not get an event for
1165 * the disk.
ede34445 1166 */
70068602 1167 fd = open(devname, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
ede34445 1168 if (fd >= 0) {
02ba8fb3
KS
1169 r = flock(fd, LOCK_EX|LOCK_NB);
1170 if (r >= 0)
1171 r = ioctl(fd, BLKRRPART, 0);
1172
ede34445
KS
1173 close(fd);
1174 if (r >= 0)
e9fc29f4 1175 part_table_read = true;
ede34445
KS
1176 }
1177
e9fc29f4 1178 /* search for partitions */
70068602 1179 r = sd_device_enumerator_new(&e);
f3a740a5
KS
1180 if (r < 0)
1181 return r;
1182
70068602 1183 r = sd_device_enumerator_allow_uninitialized(e);
f3a740a5
KS
1184 if (r < 0)
1185 return r;
1186
70068602 1187 r = sd_device_enumerator_add_match_parent(e, dev);
47a3fa0f
TA
1188 if (r < 0)
1189 return r;
e9fc29f4 1190
70068602
YW
1191 r = sd_device_enumerator_add_match_subsystem(e, "block", true);
1192 if (r < 0)
1193 return r;
e9fc29f4 1194
70068602
YW
1195 FOREACH_DEVICE(e, d) {
1196 const char *t;
e9fc29f4 1197
70068602
YW
1198 if (sd_device_get_devtype(d, &t) < 0 ||
1199 !streq("partition", t))
e9fc29f4
KS
1200 continue;
1201
1202 has_partitions = true;
1203 break;
1204 }
1205
1206 /*
1207 * We have partitions and re-read the table, the kernel already sent
1208 * out a "change" event for the disk, and "remove/add" for all
1209 * partitions.
1210 */
1211 if (part_table_read && has_partitions)
1212 return 0;
1213
1214 /*
1215 * We have partitions but re-reading the partition table did not
1216 * work, synthesize "change" for the disk and all partitions.
1217 */
70068602
YW
1218 log_debug("Device '%s' is closed, synthesising 'change'", devname);
1219 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1220 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
e9fc29f4 1221
70068602
YW
1222 FOREACH_DEVICE(e, d) {
1223 const char *t, *n, *s;
f3a740a5 1224
70068602
YW
1225 if (sd_device_get_devtype(d, &t) < 0 ||
1226 !streq("partition", t))
f3a740a5
KS
1227 continue;
1228
70068602
YW
1229 if (sd_device_get_devname(d, &n) < 0 ||
1230 sd_device_get_syspath(d, &s) < 0)
f3a740a5
KS
1231 continue;
1232
70068602
YW
1233 log_debug("Device '%s' is closed, synthesising partition '%s' 'change'", devname, n);
1234 strscpyl(filename, sizeof(filename), s, "/uevent", NULL);
57512c89 1235 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
f3a740a5 1236 }
ede34445
KS
1237
1238 return 0;
f3a740a5
KS
1239 }
1240
70068602
YW
1241 log_debug("Device %s is closed, synthesising 'change'", devname);
1242 strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL);
57512c89 1243 write_string_file(filename, "change", WRITE_STRING_FILE_DISABLE_BUFFER);
ede34445 1244
f3a740a5 1245 return 0;
edd32000
KS
1246}
1247
e82e8fa5 1248static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1249 Manager *manager = userdata;
0254e944 1250 union inotify_event_buffer buffer;
f7c1ad4f
LP
1251 struct inotify_event *e;
1252 ssize_t l;
0725c4b9 1253 int r;
912541b0 1254
c0c6806b 1255 assert(manager);
e82e8fa5 1256
0725c4b9
YW
1257 r = event_source_disable(manager->kill_workers_event);
1258 if (r < 0)
1259 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
eca195ec 1260
e82e8fa5 1261 l = read(fd, &buffer, sizeof(buffer));
f7c1ad4f 1262 if (l < 0) {
3742095b 1263 if (IN_SET(errno, EAGAIN, EINTR))
e82e8fa5 1264 return 1;
912541b0 1265
f7c1ad4f 1266 return log_error_errno(errno, "Failed to read inotify fd: %m");
912541b0
KS
1267 }
1268
f7c1ad4f 1269 FOREACH_INOTIFY_EVENT(e, buffer, l) {
70068602
YW
1270 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
1271 const char *devnode;
1272
7fe3324c 1273 if (udev_watch_lookup(e->wd, &dev) <= 0)
70068602 1274 continue;
912541b0 1275
70068602 1276 if (sd_device_get_devname(dev, &devnode) < 0)
edd32000 1277 continue;
912541b0 1278
7fe3324c 1279 log_device_debug(dev, "Inotify event: %x for %s", e->mask, devnode);
da143134 1280 if (e->mask & IN_CLOSE_WRITE)
edd32000 1281 synthesize_change(dev);
da143134 1282 else if (e->mask & IN_IGNORED)
2024ed61 1283 udev_watch_end(dev);
912541b0
KS
1284 }
1285
e82e8fa5 1286 return 1;
bd284db1
SJR
1287}
1288
0561329d 1289static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1290 Manager *manager = userdata;
1291
1292 assert(manager);
1293
62d43dac 1294 manager_exit(manager);
912541b0 1295
e82e8fa5
TG
1296 return 1;
1297}
912541b0 1298
0561329d 1299static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1300 Manager *manager = userdata;
1301
1302 assert(manager);
1303
62d43dac 1304 manager_reload(manager);
912541b0 1305
e82e8fa5
TG
1306 return 1;
1307}
912541b0 1308
e82e8fa5 1309static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b 1310 Manager *manager = userdata;
0725c4b9 1311 int r;
c0c6806b
TG
1312
1313 assert(manager);
1314
e82e8fa5
TG
1315 for (;;) {
1316 pid_t pid;
1317 int status;
1318 struct worker *worker;
d1317d02 1319
e82e8fa5
TG
1320 pid = waitpid(-1, &status, WNOHANG);
1321 if (pid <= 0)
f29328d6 1322 break;
e82e8fa5 1323
4a0b58c4 1324 worker = hashmap_get(manager->workers, PID_TO_PTR(pid));
e82e8fa5 1325 if (!worker) {
dc7faf2a 1326 log_warning("Worker ["PID_FMT"] is unknown, ignoring", pid);
f29328d6 1327 continue;
912541b0 1328 }
e82e8fa5
TG
1329
1330 if (WIFEXITED(status)) {
1331 if (WEXITSTATUS(status) == 0)
dc7faf2a 1332 log_debug("Worker ["PID_FMT"] exited", pid);
e82e8fa5 1333 else
dc7faf2a 1334 log_warning("Worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
33ad742a 1335 } else if (WIFSIGNALED(status))
dc7faf2a 1336 log_warning("Worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), signal_to_string(WTERMSIG(status)));
33ad742a 1337 else if (WIFSTOPPED(status)) {
dc7faf2a 1338 log_info("Worker ["PID_FMT"] stopped", pid);
f29328d6 1339 continue;
e82e8fa5 1340 } else if (WIFCONTINUED(status)) {
dc7faf2a 1341 log_info("Worker ["PID_FMT"] continued", pid);
f29328d6 1342 continue;
e82e8fa5 1343 } else
dc7faf2a 1344 log_warning("Worker ["PID_FMT"] exit with status 0x%04x", pid, status);
e82e8fa5 1345
05e6d9c6 1346 if ((!WIFEXITED(status) || WEXITSTATUS(status) != 0) && worker->event) {
eb546b35 1347 log_device_error(worker->event->dev, "Worker ["PID_FMT"] failed", pid);
dc7faf2a 1348
05e6d9c6 1349 /* delete state from disk */
eb546b35
YW
1350 device_delete_db(worker->event->dev);
1351 device_tag_index(worker->event->dev, NULL, false);
dc7faf2a 1352
05e6d9c6 1353 /* forward kernel event without amending it */
eb546b35 1354 r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
dc7faf2a 1355 if (r < 0)
eb546b35 1356 log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
e82e8fa5
TG
1357 }
1358
1359 worker_free(worker);
912541b0 1360 }
e82e8fa5 1361
8302fe5a
TG
1362 /* we can start new workers, try to schedule events */
1363 event_queue_start(manager);
1364
eca195ec 1365 /* Disable unnecessary cleanup event */
0725c4b9
YW
1366 if (hashmap_isempty(manager->workers)) {
1367 r = event_source_disable(manager->kill_workers_event);
1368 if (r < 0)
1369 log_warning_errno(r, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
1370 }
eca195ec 1371
e82e8fa5 1372 return 1;
f27125f9 1373}
1374
693d371d
TG
1375static int on_post(sd_event_source *s, void *userdata) {
1376 Manager *manager = userdata;
693d371d
TG
1377
1378 assert(manager);
1379
b6107f01
YW
1380 if (!LIST_IS_EMPTY(manager->events))
1381 return 1;
1382
1383 /* There are no pending events. Let's cleanup idle process. */
1384
1385 if (!hashmap_isempty(manager->workers)) {
1386 /* There are idle workers */
6d63048a
YW
1387 (void) event_reset_time(manager->event, &manager->kill_workers_event, CLOCK_MONOTONIC,
1388 now(CLOCK_MONOTONIC) + 3 * USEC_PER_SEC, USEC_PER_SEC,
1389 on_kill_workers_event, manager, 0, "kill-workers-event", false);
b6107f01 1390 return 1;
693d371d
TG
1391 }
1392
b6107f01
YW
1393 /* There are no idle workers. */
1394
1395 if (manager->exit)
1396 return sd_event_exit(manager->event, 0);
1397
1398 if (manager->cgroup)
1399 /* cleanup possible left-over processes in our cgroup */
1400 (void) cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, CGROUP_IGNORE_SELF, NULL, NULL, NULL);
1401
693d371d
TG
1402 return 1;
1403}
1404
c4b69e99 1405static int listen_fds(int *ret_ctrl, int *ret_netlink) {
fcff1e72 1406 int ctrl_fd = -1, netlink_fd = -1;
c4b69e99 1407 int fd, n;
912541b0 1408
c4b69e99
YW
1409 assert(ret_ctrl);
1410 assert(ret_netlink);
fcff1e72 1411
912541b0 1412 n = sd_listen_fds(true);
fcff1e72
TG
1413 if (n < 0)
1414 return n;
912541b0
KS
1415
1416 for (fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) {
c52cff07 1417 if (sd_is_socket(fd, AF_LOCAL, SOCK_SEQPACKET, -1) > 0) {
fcff1e72
TG
1418 if (ctrl_fd >= 0)
1419 return -EINVAL;
1420 ctrl_fd = fd;
912541b0
KS
1421 continue;
1422 }
1423
c52cff07 1424 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
fcff1e72
TG
1425 if (netlink_fd >= 0)
1426 return -EINVAL;
1427 netlink_fd = fd;
912541b0
KS
1428 continue;
1429 }
1430
fcff1e72 1431 return -EINVAL;
912541b0
KS
1432 }
1433
c4b69e99
YW
1434 *ret_ctrl = ctrl_fd;
1435 *ret_netlink = netlink_fd;
912541b0 1436
912541b0 1437 return 0;
7459bcdc
KS
1438}
1439
e6f86cac 1440/*
3f85ef0f 1441 * read the kernel command line, in case we need to get into debug mode
1d84ad94
LP
1442 * udev.log_priority=<level> syslog priority
1443 * udev.children_max=<number of workers> events are fully serialized if set to 1
1444 * udev.exec_delay=<number of seconds> delay execution of every executed program
1445 * udev.event_timeout=<number of seconds> seconds to wait before terminating an event
e6f86cac 1446 */
96287a49 1447static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
92e72467 1448 int r = 0;
e6f86cac 1449
614a823c 1450 assert(key);
e6f86cac 1451
614a823c
TG
1452 if (!value)
1453 return 0;
e6f86cac 1454
1d84ad94
LP
1455 if (proc_cmdline_key_streq(key, "udev.log_priority")) {
1456
1457 if (proc_cmdline_value_missing(key, value))
1458 return 0;
1459
46f0fbd8 1460 r = log_level_from_string(value);
92e72467
ZJS
1461 if (r >= 0)
1462 log_set_max_level(r);
1d84ad94
LP
1463
1464 } else if (proc_cmdline_key_streq(key, "udev.event_timeout")) {
1465
1466 if (proc_cmdline_value_missing(key, value))
1467 return 0;
1468
9d9264ba 1469 r = parse_sec(value, &arg_event_timeout_usec);
1d84ad94
LP
1470
1471 } else if (proc_cmdline_key_streq(key, "udev.children_max")) {
1472
1473 if (proc_cmdline_value_missing(key, value))
1474 return 0;
1475
020328e1 1476 r = safe_atou(value, &arg_children_max);
1d84ad94
LP
1477
1478 } else if (proc_cmdline_key_streq(key, "udev.exec_delay")) {
1479
1480 if (proc_cmdline_value_missing(key, value))
1481 return 0;
1482
6b92f429 1483 r = parse_sec(value, &arg_exec_delay_usec);
1d84ad94
LP
1484
1485 } else if (startswith(key, "udev."))
044497e2 1486 log_warning("Unknown udev kernel command line option \"%s\", ignoring", key);
614a823c 1487
92e72467
ZJS
1488 if (r < 0)
1489 log_warning_errno(r, "Failed to parse \"%s=%s\", ignoring: %m", key, value);
1d84ad94 1490
614a823c 1491 return 0;
e6f86cac
KS
1492}
1493
37ec0fdd
LP
1494static int help(void) {
1495 _cleanup_free_ char *link = NULL;
1496 int r;
1497
1498 r = terminal_urlify_man("systemd-udevd.service", "8", &link);
1499 if (r < 0)
1500 return log_oom();
1501
ed216e1f
TG
1502 printf("%s [OPTIONS...]\n\n"
1503 "Manages devices.\n\n"
5ac0162c 1504 " -h --help Print this message\n"
2d19c17e
MF
1505 " -V --version Print version of the program\n"
1506 " -d --daemon Detach and run in the background\n"
1507 " -D --debug Enable debug output\n"
1508 " -c --children-max=INT Set maximum number of workers\n"
1509 " -e --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1510 " -t --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1511 " -N --resolve-names=early|late|never\n"
5ac0162c 1512 " When to resolve users and groups\n"
37ec0fdd
LP
1513 "\nSee the %s for details.\n"
1514 , program_invocation_short_name
1515 , link
1516 );
1517
1518 return 0;
ed216e1f
TG
1519}
1520
bba7a484 1521static int parse_argv(int argc, char *argv[]) {
912541b0 1522 static const struct option options[] = {
bba7a484
TG
1523 { "daemon", no_argument, NULL, 'd' },
1524 { "debug", no_argument, NULL, 'D' },
1525 { "children-max", required_argument, NULL, 'c' },
1526 { "exec-delay", required_argument, NULL, 'e' },
1527 { "event-timeout", required_argument, NULL, 't' },
1528 { "resolve-names", required_argument, NULL, 'N' },
1529 { "help", no_argument, NULL, 'h' },
1530 { "version", no_argument, NULL, 'V' },
912541b0
KS
1531 {}
1532 };
689a97f5 1533
044497e2 1534 int c, r;
689a97f5 1535
bba7a484
TG
1536 assert(argc >= 0);
1537 assert(argv);
912541b0 1538
e14b6f21 1539 while ((c = getopt_long(argc, argv, "c:de:Dt:N:hV", options, NULL)) >= 0) {
bba7a484 1540 switch (c) {
912541b0 1541
912541b0 1542 case 'd':
bba7a484 1543 arg_daemonize = true;
912541b0
KS
1544 break;
1545 case 'c':
020328e1 1546 r = safe_atou(optarg, &arg_children_max);
6f5cf8a8 1547 if (r < 0)
389f9bf2 1548 log_warning_errno(r, "Failed to parse --children-max= value '%s', ignoring: %m", optarg);
912541b0
KS
1549 break;
1550 case 'e':
6b92f429 1551 r = parse_sec(optarg, &arg_exec_delay_usec);
6f5cf8a8 1552 if (r < 0)
6b92f429 1553 log_warning_errno(r, "Failed to parse --exec-delay= value '%s', ignoring: %m", optarg);
912541b0 1554 break;
9719859c 1555 case 't':
9d9264ba 1556 r = parse_sec(optarg, &arg_event_timeout_usec);
f1e8664e 1557 if (r < 0)
9d9264ba 1558 log_warning_errno(r, "Failed to parse --event-timeout= value '%s', ignoring: %m", optarg);
9719859c 1559 break;
912541b0 1560 case 'D':
bba7a484 1561 arg_debug = true;
912541b0 1562 break;
c4d44cba
YW
1563 case 'N': {
1564 ResolveNameTiming t;
1565
1566 t = resolve_name_timing_from_string(optarg);
1567 if (t < 0)
1568 log_warning("Invalid --resolve-names= value '%s', ignoring.", optarg);
1569 else
1570 arg_resolve_name_timing = t;
912541b0 1571 break;
c4d44cba 1572 }
912541b0 1573 case 'h':
37ec0fdd 1574 return help();
912541b0 1575 case 'V':
681bd2c5 1576 printf("%s\n", GIT_VERSION);
bba7a484
TG
1577 return 0;
1578 case '?':
1579 return -EINVAL;
912541b0 1580 default:
bba7a484
TG
1581 assert_not_reached("Unhandled option");
1582
912541b0
KS
1583 }
1584 }
1585
bba7a484
TG
1586 return 1;
1587}
1588
b7f74dd4 1589static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1590 _cleanup_(manager_freep) Manager *manager = NULL;
b5af8c8c 1591 int r;
c0c6806b
TG
1592
1593 assert(ret);
1594
6f19b42f 1595 manager = new(Manager, 1);
c0c6806b
TG
1596 if (!manager)
1597 return log_oom();
1598
6f19b42f
YW
1599 *manager = (Manager) {
1600 .fd_inotify = -1,
1601 .worker_watch = { -1, -1 },
1602 .cgroup = cgroup,
1603 };
e237d8cb 1604
2024ed61 1605 manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
f59118ec 1606 if (!manager->ctrl)
886cf317 1607 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize udev control socket");
e237d8cb 1608
b5af8c8c
ZJS
1609 r = udev_ctrl_enable_receiving(manager->ctrl);
1610 if (r < 0)
1611 return log_error_errno(r, "Failed to bind udev control socket: %m");
c4b69e99 1612
7f2e3a14
YW
1613 r = device_monitor_new_full(&manager->monitor, MONITOR_GROUP_KERNEL, fd_uevent);
1614 if (r < 0)
1615 return log_error_errno(r, "Failed to initialize device monitor: %m");
e237d8cb 1616
90389323 1617 (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
c4b69e99 1618
b5af8c8c
ZJS
1619 r = device_monitor_enable_receiving(manager->monitor);
1620 if (r < 0)
1621 return log_error_errno(r, "Failed to bind netlink socket: %m");
1622
1623 *ret = TAKE_PTR(manager);
1624
1625 return 0;
1626}
1627
1628static int main_loop(Manager *manager) {
1629 int fd_worker, fd_ctrl, r;
1630
e237d8cb
TG
1631 /* unnamed socket from workers to the main daemon */
1632 r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
1633 if (r < 0)
044497e2 1634 return log_error_errno(errno, "Failed to create socketpair for communicating with workers: %m");
e237d8cb 1635
693d371d 1636 fd_worker = manager->worker_watch[READ_END];
e237d8cb 1637
2ff48e98 1638 r = setsockopt_int(fd_worker, SOL_SOCKET, SO_PASSCRED, true);
e237d8cb 1639 if (r < 0)
044497e2 1640 return log_error_errno(r, "Failed to enable SO_PASSCRED: %m");
e237d8cb 1641
b7759e04
YW
1642 r = udev_watch_init();
1643 if (r < 0)
1644 return log_error_errno(r, "Failed to create inotify descriptor: %m");
1645 manager->fd_inotify = r;
e237d8cb 1646
2024ed61 1647 udev_watch_restore();
e237d8cb
TG
1648
1649 /* block and listen to all signals on signalfd */
72c0a2c2 1650 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) >= 0);
693d371d 1651
49f997f3
TG
1652 r = sd_event_default(&manager->event);
1653 if (r < 0)
044497e2 1654 return log_error_errno(r, "Failed to allocate event loop: %m");
49f997f3 1655
693d371d
TG
1656 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1657 if (r < 0)
044497e2 1658 return log_error_errno(r, "Failed to create SIGINT event source: %m");
693d371d
TG
1659
1660 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1661 if (r < 0)
044497e2 1662 return log_error_errno(r, "Failed to create SIGTERM event source: %m");
693d371d
TG
1663
1664 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1665 if (r < 0)
044497e2 1666 return log_error_errno(r, "Failed to create SIGHUP event source: %m");
693d371d
TG
1667
1668 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1669 if (r < 0)
044497e2 1670 return log_error_errno(r, "Failed to create SIGCHLD event source: %m");
693d371d
TG
1671
1672 r = sd_event_set_watchdog(manager->event, true);
1673 if (r < 0)
044497e2 1674 return log_error_errno(r, "Failed to create watchdog event source: %m");
693d371d 1675
b5af8c8c
ZJS
1676 fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
1677 if (fd_ctrl < 0)
1678 return log_error_errno(fd_ctrl, "Failed to get udev control socket fd: %m");
1679
11b1dd8c 1680 r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager);
693d371d 1681 if (r < 0)
044497e2 1682 return log_error_errno(r, "Failed to create udev control event source: %m");
693d371d
TG
1683
1684 /* This needs to be after the inotify and uevent handling, to make sure
1685 * that the ping is send back after fully processing the pending uevents
1686 * (including the synthetic ones we may create due to inotify events).
1687 */
1688 r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
1689 if (r < 0)
044497e2 1690 return log_error_errno(r, "Failed to set IDLE event priority for udev control event source: %m");
693d371d
TG
1691
1692 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1693 if (r < 0)
044497e2 1694 return log_error_errno(r, "Failed to create inotify event source: %m");
693d371d 1695
f00d2b6d
YW
1696 r = sd_device_monitor_attach_event(manager->monitor, manager->event);
1697 if (r < 0)
1698 return log_error_errno(r, "Failed to attach event to device monitor: %m");
1699
1700 r = sd_device_monitor_start(manager->monitor, on_uevent, manager);
693d371d 1701 if (r < 0)
f00d2b6d
YW
1702 return log_error_errno(r, "Failed to start device monitor: %m");
1703
1704 (void) sd_event_source_set_description(sd_device_monitor_get_event_source(manager->monitor), "device-monitor");
693d371d
TG
1705
1706 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1707 if (r < 0)
044497e2 1708 return log_error_errno(r, "Failed to create worker event source: %m");
693d371d
TG
1709
1710 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1711 if (r < 0)
044497e2 1712 return log_error_errno(r, "Failed to create post event source: %m");
e237d8cb 1713
b5af8c8c 1714 udev_builtin_init();
077fc5e2 1715
b5af8c8c
ZJS
1716 r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
1717 if (!manager->rules)
1718 return log_error_errno(r, "Failed to read udev rules: %m");
077fc5e2
DH
1719
1720 r = udev_rules_apply_static_dev_perms(manager->rules);
1721 if (r < 0)
044497e2 1722 log_error_errno(r, "Failed to apply permissions on static device nodes: %m");
077fc5e2 1723
1ef72b55
MS
1724 (void) sd_notifyf(false,
1725 "READY=1\n"
1726 "STATUS=Processing with %u children at max", arg_children_max);
077fc5e2
DH
1727
1728 r = sd_event_loop(manager->event);
44dcf454 1729 if (r < 0)
044497e2 1730 log_error_errno(r, "Event loop failed: %m");
077fc5e2 1731
077fc5e2
DH
1732 sd_notify(false,
1733 "STOPPING=1\n"
1734 "STATUS=Shutting down...");
077fc5e2
DH
1735 return r;
1736}
1737
0c5a109a 1738static int run(int argc, char *argv[]) {
c26d1879 1739 _cleanup_free_ char *cgroup = NULL;
b5af8c8c 1740 _cleanup_(manager_freep) Manager *manager = NULL;
efa1606e 1741 int fd_ctrl = -1, fd_uevent = -1;
e5d7bce1 1742 int r;
bba7a484 1743
bba7a484 1744 log_set_target(LOG_TARGET_AUTO);
a14e7af1 1745 udev_parse_config_full(&arg_children_max, &arg_exec_delay_usec, &arg_event_timeout_usec, &arg_resolve_name_timing);
bba7a484
TG
1746 log_parse_environment();
1747 log_open();
1748
bba7a484
TG
1749 r = parse_argv(argc, argv);
1750 if (r <= 0)
0c5a109a 1751 return r;
bba7a484 1752
1d84ad94 1753 r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
614a823c 1754 if (r < 0)
044497e2 1755 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
912541b0 1756
78d3e041
KS
1757 if (arg_debug) {
1758 log_set_target(LOG_TARGET_CONSOLE);
bba7a484 1759 log_set_max_level(LOG_DEBUG);
78d3e041 1760 }
bba7a484 1761
6174a243
YW
1762 log_set_max_level_realm(LOG_REALM_SYSTEMD, log_get_max_level());
1763
fba868fa
LP
1764 r = must_be_root();
1765 if (r < 0)
0c5a109a 1766 return r;
912541b0 1767
712cebf1
TG
1768 if (arg_children_max == 0) {
1769 cpu_set_t cpu_set;
e438c57a 1770 unsigned long mem_limit;
ebc164ef 1771
712cebf1 1772 arg_children_max = 8;
d457ff83 1773
ece174c5 1774 if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) == 0)
faae64fa 1775 arg_children_max += CPU_COUNT(&cpu_set) * 8;
912541b0 1776
e438c57a
MW
1777 mem_limit = physical_memory() / (128LU*1024*1024);
1778 arg_children_max = MAX(10U, MIN(arg_children_max, mem_limit));
1779
044497e2 1780 log_debug("Set children_max to %u", arg_children_max);
d457ff83 1781 }
912541b0 1782
712cebf1
TG
1783 /* set umask before creating any file/directory */
1784 r = chdir("/");
0c5a109a
ZJS
1785 if (r < 0)
1786 return log_error_errno(errno, "Failed to change dir to '/': %m");
194bbe33 1787
712cebf1 1788 umask(022);
912541b0 1789
c3dacc8b 1790 r = mac_selinux_init();
0c5a109a
ZJS
1791 if (r < 0)
1792 return log_error_errno(r, "Could not initialize labelling: %m");
912541b0 1793
dae8b82e 1794 r = mkdir_errno_wrapper("/run/udev", 0755);
0c5a109a
ZJS
1795 if (r < 0 && r != -EEXIST)
1796 return log_error_errno(r, "Failed to create /run/udev: %m");
712cebf1 1797
03cfe0d5 1798 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1799
c26d1879
TG
1800 if (getppid() == 1) {
1801 /* get our own cgroup, we regularly kill everything udev has left behind
1802 we only do this on systemd systems, and only if we are directly spawned
1803 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1804 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
11b9fb15 1805 if (r < 0) {
a2d61f07 1806 if (IN_SET(r, -ENOENT, -ENOMEDIUM))
044497e2 1807 log_debug_errno(r, "Dedicated cgroup not found: %m");
11b9fb15 1808 else
044497e2 1809 log_warning_errno(r, "Failed to get cgroup: %m");
11b9fb15 1810 }
c26d1879
TG
1811 }
1812
b7f74dd4 1813 r = listen_fds(&fd_ctrl, &fd_uevent);
0c5a109a
ZJS
1814 if (r < 0)
1815 return log_error_errno(r, "Failed to listen on fds: %m");
b7f74dd4 1816
b5af8c8c
ZJS
1817 r = manager_new(&manager, fd_ctrl, fd_uevent, cgroup);
1818 if (r < 0)
1819 return log_error_errno(r, "Failed to create manager: %m");
1820
bba7a484 1821 if (arg_daemonize) {
912541b0 1822 pid_t pid;
912541b0 1823
b5af8c8c 1824 log_info("Starting version " GIT_VERSION);
3cbb2057 1825
40e749b5 1826 /* connect /dev/null to stdin, stdout, stderr */
c76cf844
AK
1827 if (log_get_max_level() < LOG_DEBUG) {
1828 r = make_null_stdio();
1829 if (r < 0)
1830 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
1831 }
1832
912541b0 1833 pid = fork();
0c5a109a
ZJS
1834 if (pid < 0)
1835 return log_error_errno(errno, "Failed to fork daemon: %m");
1836 if (pid > 0)
1837 /* parent */
1838 return 0;
912541b0 1839
0c5a109a 1840 /* child */
ece0fe12 1841 (void) setsid();
912541b0 1842
76cdddfb
YW
1843 r = set_oom_score_adjust(-1000);
1844 if (r < 0)
1845 log_debug_errno(r, "Failed to adjust OOM score, ignoring: %m");
7500cd5e 1846 }
912541b0 1847
b5af8c8c
ZJS
1848 r = main_loop(manager);
1849 /* FIXME: move this into manager_free() */
1850 udev_ctrl_cleanup(manager->ctrl);
1851 return r;
7fafc032 1852}
0c5a109a
ZJS
1853
1854DEFINE_MAIN_FUNCTION(run);