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