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