1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * Copyright © 2004 Chris Friesen <chris_friesen@sympatico.ca>
4 * Copyright © 2009 Canonical Ltd.
5 * Copyright © 2009 Scott James Remnant <scott@netsplit.com>
17 #include <sys/epoll.h>
19 #include <sys/inotify.h>
20 #include <sys/ioctl.h>
21 #include <sys/mount.h>
22 #include <sys/prctl.h>
23 #include <sys/signalfd.h>
24 #include <sys/socket.h>
30 #include "sd-daemon.h"
33 #include "alloc-util.h"
34 #include "cgroup-util.h"
35 #include "cpu-set-util.h"
36 #include "dev-setup.h"
37 #include "device-util.h"
40 #include "format-util.h"
44 #include "libudev-device-internal.h"
46 #include "netlink-util.h"
47 #include "parse-util.h"
48 #include "proc-cmdline.h"
49 #include "process-util.h"
50 #include "selinux-util.h"
51 #include "signal-util.h"
52 #include "socket-util.h"
53 #include "string-util.h"
54 #include "syslog-util.h"
55 #include "terminal-util.h"
56 #include "udev-builtin.h"
57 #include "udev-ctrl.h"
58 #include "udev-util.h"
59 #include "udev-watch.h"
61 #include "user-util.h"
63 static bool arg_debug
= false;
64 static int arg_daemonize
= false;
65 static ResolveNameTiming arg_resolve_name_timing
= RESOLVE_NAME_EARLY
;
66 static unsigned arg_children_max
= 0;
67 static usec_t arg_exec_delay_usec
= 0;
68 static usec_t arg_event_timeout_usec
= 180 * USEC_PER_SEC
;
70 typedef struct Manager
{
73 LIST_HEAD(struct event
, events
);
75 pid_t pid
; /* the process that originally allocated the manager object */
77 struct udev_rules
*rules
;
80 struct udev_monitor
*monitor
;
81 struct udev_ctrl
*ctrl
;
82 struct udev_ctrl_connection
*ctrl_conn_blocking
;
86 sd_event_source
*ctrl_event
;
87 sd_event_source
*uevent_event
;
88 sd_event_source
*inotify_event
;
89 sd_event_source
*kill_workers_event
;
93 bool stop_exec_queue
:1;
104 LIST_FIELDS(struct event
, event
);
106 struct udev_device
*dev
;
107 struct udev_device
*dev_kernel
;
108 struct worker
*worker
;
109 enum event_state state
;
110 unsigned long long int delaying_seqnum
;
111 unsigned long long int seqnum
;
114 const char *devpath_old
;
118 sd_event_source
*timeout_warning
;
119 sd_event_source
*timeout
;
122 static void event_queue_cleanup(Manager
*manager
, enum event_state type
);
134 struct udev_monitor
*monitor
;
135 enum worker_state state
;
139 /* passed from worker to main process */
140 struct worker_message
{
143 static void event_free(struct event
*event
) {
148 assert(event
->manager
);
150 LIST_REMOVE(event
, event
->manager
->events
, event
);
151 udev_device_unref(event
->dev
);
152 udev_device_unref(event
->dev_kernel
);
154 sd_event_source_unref(event
->timeout_warning
);
155 sd_event_source_unref(event
->timeout
);
158 event
->worker
->event
= NULL
;
160 if (LIST_IS_EMPTY(event
->manager
->events
)) {
161 /* only clean up the queue from the process that created it */
162 if (event
->manager
->pid
== getpid_cached()) {
163 r
= unlink("/run/udev/queue");
165 log_warning_errno(errno
, "could not unlink /run/udev/queue: %m");
172 static void worker_free(struct worker
*worker
) {
176 assert(worker
->manager
);
178 hashmap_remove(worker
->manager
->workers
, PID_TO_PTR(worker
->pid
));
179 udev_monitor_unref(worker
->monitor
);
180 event_free(worker
->event
);
185 static void manager_workers_free(Manager
*manager
) {
186 struct worker
*worker
;
191 HASHMAP_FOREACH(worker
, manager
->workers
, i
)
194 manager
->workers
= hashmap_free(manager
->workers
);
197 static int worker_new(struct worker
**ret
, Manager
*manager
, struct udev_monitor
*worker_monitor
, pid_t pid
) {
198 _cleanup_free_
struct worker
*worker
= NULL
;
203 assert(worker_monitor
);
206 worker
= new0(struct worker
, 1);
210 worker
->manager
= manager
;
211 /* close monitor, but keep address around */
212 udev_monitor_disconnect(worker_monitor
);
213 worker
->monitor
= udev_monitor_ref(worker_monitor
);
216 r
= hashmap_ensure_allocated(&manager
->workers
, NULL
);
220 r
= hashmap_put(manager
->workers
, PID_TO_PTR(pid
), worker
);
224 *ret
= TAKE_PTR(worker
);
229 static int on_event_timeout(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
230 struct event
*event
= userdata
;
233 assert(event
->worker
);
235 kill_and_sigcont(event
->worker
->pid
, SIGKILL
);
236 event
->worker
->state
= WORKER_KILLED
;
238 log_error("seq %llu '%s' killed", udev_device_get_seqnum(event
->dev
), event
->devpath
);
243 static int on_event_timeout_warning(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
244 struct event
*event
= userdata
;
248 log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event
->dev
), event
->devpath
);
253 static void worker_attach_event(struct worker
*worker
, struct event
*event
) {
258 assert(worker
->manager
);
260 assert(!event
->worker
);
261 assert(!worker
->event
);
263 worker
->state
= WORKER_RUNNING
;
264 worker
->event
= event
;
265 event
->state
= EVENT_RUNNING
;
266 event
->worker
= worker
;
268 e
= worker
->manager
->event
;
270 assert_se(sd_event_now(e
, CLOCK_MONOTONIC
, &usec
) >= 0);
272 (void) sd_event_add_time(e
, &event
->timeout_warning
, CLOCK_MONOTONIC
,
273 usec
+ udev_warn_timeout(arg_event_timeout_usec
), USEC_PER_SEC
, on_event_timeout_warning
, event
);
275 (void) sd_event_add_time(e
, &event
->timeout
, CLOCK_MONOTONIC
,
276 usec
+ arg_event_timeout_usec
, USEC_PER_SEC
, on_event_timeout
, event
);
279 static void manager_free(Manager
*manager
) {
285 sd_event_source_unref(manager
->ctrl_event
);
286 sd_event_source_unref(manager
->uevent_event
);
287 sd_event_source_unref(manager
->inotify_event
);
288 sd_event_source_unref(manager
->kill_workers_event
);
290 sd_event_unref(manager
->event
);
291 manager_workers_free(manager
);
292 event_queue_cleanup(manager
, EVENT_UNDEF
);
294 udev_monitor_unref(manager
->monitor
);
295 udev_ctrl_unref(manager
->ctrl
);
296 udev_ctrl_connection_unref(manager
->ctrl_conn_blocking
);
298 hashmap_free_free_free(manager
->properties
);
299 udev_rules_unref(manager
->rules
);
301 safe_close(manager
->fd_inotify
);
302 safe_close_pair(manager
->worker_watch
);
307 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
309 static int worker_send_message(int fd
) {
310 struct worker_message message
= {};
312 return loop_write(fd
, &message
, sizeof(message
), false);
315 static bool shall_lock_device(struct udev_device
*dev
) {
318 if (!streq_ptr("block", udev_device_get_subsystem(dev
)))
321 sysname
= udev_device_get_sysname(dev
);
322 return !startswith(sysname
, "dm-") &&
323 !startswith(sysname
, "md") &&
324 !startswith(sysname
, "drbd");
327 static void worker_spawn(Manager
*manager
, struct event
*event
) {
328 _cleanup_(udev_monitor_unrefp
) struct udev_monitor
*worker_monitor
= NULL
;
332 /* listen for new events */
333 worker_monitor
= udev_monitor_new_from_netlink(NULL
, NULL
);
334 if (worker_monitor
== NULL
)
336 /* allow the main daemon netlink address to send devices to the worker */
337 udev_monitor_allow_unicast_sender(worker_monitor
, manager
->monitor
);
338 r
= udev_monitor_enable_receiving(worker_monitor
);
340 log_error_errno(r
, "worker: could not enable receiving of device: %m");
345 _cleanup_(udev_device_unrefp
) struct udev_device
*dev
= NULL
;
346 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
348 _cleanup_close_
int fd_signal
= -1, fd_ep
= -1;
349 struct epoll_event ep_signal
= { .events
= EPOLLIN
};
350 struct epoll_event ep_monitor
= { .events
= EPOLLIN
};
353 /* take initial device from queue */
354 dev
= TAKE_PTR(event
->dev
);
356 unsetenv("NOTIFY_SOCKET");
358 manager_workers_free(manager
);
359 event_queue_cleanup(manager
, EVENT_UNDEF
);
361 manager
->monitor
= udev_monitor_unref(manager
->monitor
);
362 manager
->ctrl_conn_blocking
= udev_ctrl_connection_unref(manager
->ctrl_conn_blocking
);
363 manager
->ctrl
= udev_ctrl_unref(manager
->ctrl
);
364 manager
->worker_watch
[READ_END
] = safe_close(manager
->worker_watch
[READ_END
]);
366 manager
->ctrl_event
= sd_event_source_unref(manager
->ctrl_event
);
367 manager
->uevent_event
= sd_event_source_unref(manager
->uevent_event
);
368 manager
->inotify_event
= sd_event_source_unref(manager
->inotify_event
);
369 manager
->kill_workers_event
= sd_event_source_unref(manager
->kill_workers_event
);
371 manager
->event
= sd_event_unref(manager
->event
);
374 fd_signal
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
376 r
= log_error_errno(errno
, "error creating signalfd %m");
379 ep_signal
.data
.fd
= fd_signal
;
381 fd_monitor
= udev_monitor_get_fd(worker_monitor
);
382 ep_monitor
.data
.fd
= fd_monitor
;
384 fd_ep
= epoll_create1(EPOLL_CLOEXEC
);
386 r
= log_error_errno(errno
, "error creating epoll fd: %m");
390 if (epoll_ctl(fd_ep
, EPOLL_CTL_ADD
, fd_signal
, &ep_signal
) < 0 ||
391 epoll_ctl(fd_ep
, EPOLL_CTL_ADD
, fd_monitor
, &ep_monitor
) < 0) {
392 r
= log_error_errno(errno
, "fail to add fds to epoll: %m");
396 /* Request TERM signal if parent exits.
397 Ignore error, not much we can do in that case. */
398 (void) prctl(PR_SET_PDEATHSIG
, SIGTERM
);
400 /* Reset OOM score, we only protect the main daemon. */
401 r
= set_oom_score_adjust(0);
403 log_debug_errno(r
, "Failed to reset OOM score, ignoring: %m");
406 _cleanup_(udev_event_freep
) struct udev_event
*udev_event
= NULL
;
411 log_debug("seq %llu running", udev_device_get_seqnum(dev
));
412 udev_event
= udev_event_new(dev
->device
, arg_exec_delay_usec
, rtnl
);
419 * Take a shared lock on the device node; this establishes
420 * a concept of device "ownership" to serialize device
421 * access. External processes holding an exclusive lock will
422 * cause udev to skip the event handling; in the case udev
423 * acquired the lock, the external process can block until
424 * udev has finished its event handling.
426 if (!streq_ptr(udev_device_get_action(dev
), "remove") &&
427 shall_lock_device(dev
)) {
428 struct udev_device
*d
= dev
;
430 if (streq_ptr("partition", udev_device_get_devtype(d
)))
431 d
= udev_device_get_parent(d
);
434 fd_lock
= open(udev_device_get_devnode(d
), O_RDONLY
|O_CLOEXEC
|O_NOFOLLOW
|O_NONBLOCK
);
435 if (fd_lock
>= 0 && flock(fd_lock
, LOCK_SH
|LOCK_NB
) < 0) {
436 log_debug_errno(errno
, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d
));
437 fd_lock
= safe_close(fd_lock
);
443 /* apply rules, create node, symlinks */
444 udev_event_execute_rules(udev_event
, arg_event_timeout_usec
, manager
->properties
, manager
->rules
);
445 udev_event_execute_run(udev_event
, arg_event_timeout_usec
);
448 /* in case rtnl was initialized */
449 rtnl
= sd_netlink_ref(udev_event
->rtnl
);
451 /* apply/restore inotify watch */
452 if (udev_event
->inotify_watch
) {
453 (void) udev_watch_begin(dev
->device
);
454 udev_device_update_db(dev
);
459 /* send processed event back to libudev listeners */
460 udev_monitor_send_device(worker_monitor
, NULL
, dev
);
463 log_debug("seq %llu processed", udev_device_get_seqnum(dev
));
465 /* send udevd the result of the event execution */
466 r
= worker_send_message(manager
->worker_watch
[WRITE_END
]);
468 log_error_errno(r
, "failed to send result of seq %llu to main daemon: %m",
469 udev_device_get_seqnum(dev
));
471 dev
= udev_device_unref(dev
);
473 /* wait for more device messages from main udevd, or term signal */
474 while (dev
== NULL
) {
475 struct epoll_event ev
[4];
479 fdcount
= epoll_wait(fd_ep
, ev
, ELEMENTSOF(ev
), -1);
483 r
= log_error_errno(errno
, "failed to poll: %m");
487 for (i
= 0; i
< fdcount
; i
++) {
488 if (ev
[i
].data
.fd
== fd_monitor
&& ev
[i
].events
& EPOLLIN
) {
489 dev
= udev_monitor_receive_device(worker_monitor
);
491 } else if (ev
[i
].data
.fd
== fd_signal
&& ev
[i
].events
& EPOLLIN
) {
492 struct signalfd_siginfo fdsi
;
495 size
= read(fd_signal
, &fdsi
, sizeof(struct signalfd_siginfo
));
496 if (size
!= sizeof(struct signalfd_siginfo
))
498 switch (fdsi
.ssi_signo
) {
507 udev_device_unref(dev
);
508 manager_free(manager
);
510 _exit(r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
513 event
->state
= EVENT_QUEUED
;
514 log_error_errno(errno
, "fork of child failed: %m");
518 struct worker
*worker
;
520 r
= worker_new(&worker
, manager
, worker_monitor
, pid
);
524 worker_attach_event(worker
, event
);
526 log_debug("seq %llu forked new worker ["PID_FMT
"]", udev_device_get_seqnum(event
->dev
), pid
);
532 static void event_run(Manager
*manager
, struct event
*event
) {
533 struct worker
*worker
;
539 HASHMAP_FOREACH(worker
, manager
->workers
, i
) {
542 if (worker
->state
!= WORKER_IDLE
)
545 count
= udev_monitor_send_device(manager
->monitor
, worker
->monitor
, event
->dev
);
547 log_error_errno(errno
, "worker ["PID_FMT
"] did not accept message %zi (%m), kill it",
549 (void) kill(worker
->pid
, SIGKILL
);
550 worker
->state
= WORKER_KILLED
;
553 worker_attach_event(worker
, event
);
557 if (hashmap_size(manager
->workers
) >= arg_children_max
) {
558 if (arg_children_max
> 1)
559 log_debug("maximum number (%i) of children reached", hashmap_size(manager
->workers
));
563 /* start new worker and pass initial device */
564 worker_spawn(manager
, event
);
567 static int event_queue_insert(Manager
*manager
, struct udev_device
*dev
) {
574 /* only one process can add events to the queue */
575 if (manager
->pid
== 0)
576 manager
->pid
= getpid_cached();
578 assert(manager
->pid
== getpid_cached());
580 event
= new0(struct event
, 1);
584 event
->manager
= manager
;
586 event
->dev_kernel
= udev_device_shallow_clone(dev
);
587 udev_device_copy_properties(event
->dev_kernel
, dev
);
588 event
->seqnum
= udev_device_get_seqnum(dev
);
589 event
->devpath
= udev_device_get_devpath(dev
);
590 event
->devpath_len
= strlen(event
->devpath
);
591 event
->devpath_old
= udev_device_get_devpath_old(dev
);
592 event
->devnum
= udev_device_get_devnum(dev
);
593 event
->is_block
= streq("block", udev_device_get_subsystem(dev
));
594 event
->ifindex
= udev_device_get_ifindex(dev
);
596 log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev
),
597 udev_device_get_action(dev
), udev_device_get_subsystem(dev
));
599 event
->state
= EVENT_QUEUED
;
601 if (LIST_IS_EMPTY(manager
->events
)) {
602 r
= touch("/run/udev/queue");
604 log_warning_errno(r
, "could not touch /run/udev/queue: %m");
607 LIST_APPEND(event
, manager
->events
, event
);
612 static void manager_kill_workers(Manager
*manager
) {
613 struct worker
*worker
;
618 HASHMAP_FOREACH(worker
, manager
->workers
, i
) {
619 if (worker
->state
== WORKER_KILLED
)
622 worker
->state
= WORKER_KILLED
;
623 (void) kill(worker
->pid
, SIGTERM
);
627 /* lookup event for identical, parent, child device */
628 static bool is_devpath_busy(Manager
*manager
, struct event
*event
) {
629 struct event
*loop_event
;
632 /* check if queue contains events we depend on */
633 LIST_FOREACH(event
, loop_event
, manager
->events
) {
634 /* we already found a later event, earlier cannot block us, no need to check again */
635 if (loop_event
->seqnum
< event
->delaying_seqnum
)
638 /* event we checked earlier still exists, no need to check again */
639 if (loop_event
->seqnum
== event
->delaying_seqnum
)
642 /* found ourself, no later event can block us */
643 if (loop_event
->seqnum
>= event
->seqnum
)
646 /* check major/minor */
647 if (major(event
->devnum
) != 0 && event
->devnum
== loop_event
->devnum
&& event
->is_block
== loop_event
->is_block
)
650 /* check network device ifindex */
651 if (event
->ifindex
> 0 && event
->ifindex
== loop_event
->ifindex
)
654 /* check our old name */
655 if (event
->devpath_old
&& streq(loop_event
->devpath
, event
->devpath_old
)) {
656 event
->delaying_seqnum
= loop_event
->seqnum
;
660 /* compare devpath */
661 common
= MIN(loop_event
->devpath_len
, event
->devpath_len
);
663 /* one devpath is contained in the other? */
664 if (memcmp(loop_event
->devpath
, event
->devpath
, common
) != 0)
667 /* identical device event found */
668 if (loop_event
->devpath_len
== event
->devpath_len
) {
669 /* devices names might have changed/swapped in the meantime */
670 if (major(event
->devnum
) != 0 || event
->ifindex
> 0)
672 event
->delaying_seqnum
= loop_event
->seqnum
;
676 /* parent device event found */
677 if (event
->devpath
[common
] == '/') {
678 event
->delaying_seqnum
= loop_event
->seqnum
;
682 /* child device event found */
683 if (loop_event
->devpath
[common
] == '/') {
684 event
->delaying_seqnum
= loop_event
->seqnum
;
692 static int on_exit_timeout(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
693 Manager
*manager
= userdata
;
697 log_error_errno(ETIMEDOUT
, "giving up waiting for workers to finish");
699 sd_event_exit(manager
->event
, -ETIMEDOUT
);
704 static void manager_exit(Manager
*manager
) {
710 manager
->exit
= true;
714 "STATUS=Starting shutdown...");
716 /* close sources of new events and discard buffered events */
717 manager
->ctrl_event
= sd_event_source_unref(manager
->ctrl_event
);
718 manager
->ctrl
= udev_ctrl_unref(manager
->ctrl
);
720 manager
->inotify_event
= sd_event_source_unref(manager
->inotify_event
);
721 manager
->fd_inotify
= safe_close(manager
->fd_inotify
);
723 manager
->uevent_event
= sd_event_source_unref(manager
->uevent_event
);
724 manager
->monitor
= udev_monitor_unref(manager
->monitor
);
726 /* discard queued events and kill workers */
727 event_queue_cleanup(manager
, EVENT_QUEUED
);
728 manager_kill_workers(manager
);
730 assert_se(sd_event_now(manager
->event
, CLOCK_MONOTONIC
, &usec
) >= 0);
732 r
= sd_event_add_time(manager
->event
, NULL
, CLOCK_MONOTONIC
,
733 usec
+ 30 * USEC_PER_SEC
, USEC_PER_SEC
, on_exit_timeout
, manager
);
738 /* reload requested, HUP signal received, rules changed, builtin changed */
739 static void manager_reload(Manager
*manager
) {
745 "STATUS=Flushing configuration...");
747 manager_kill_workers(manager
);
748 manager
->rules
= udev_rules_unref(manager
->rules
);
753 "STATUS=Processing with %u children at max", arg_children_max
);
756 static int on_kill_workers_event(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
757 Manager
*manager
= userdata
;
761 log_debug("Cleanup idle workers");
762 manager_kill_workers(manager
);
767 static int manager_enable_kill_workers_event(Manager
*manager
) {
772 if (!manager
->kill_workers_event
)
775 r
= sd_event_source_get_enabled(manager
->kill_workers_event
, &enabled
);
777 log_debug_errno(r
, "Failed to query whether event source for killing idle workers is enabled or not, trying to create new event source: %m");
778 manager
->kill_workers_event
= sd_event_source_unref(manager
->kill_workers_event
);
782 if (enabled
== SD_EVENT_ONESHOT
)
785 r
= sd_event_source_set_time(manager
->kill_workers_event
, now(CLOCK_MONOTONIC
) + 3 * USEC_PER_SEC
);
787 log_debug_errno(r
, "Failed to set time to event source for killing idle workers, trying to create new event source: %m");
788 manager
->kill_workers_event
= sd_event_source_unref(manager
->kill_workers_event
);
792 r
= sd_event_source_set_enabled(manager
->kill_workers_event
, SD_EVENT_ONESHOT
);
794 log_debug_errno(r
, "Failed to enable event source for killing idle workers, trying to create new event source: %m");
795 manager
->kill_workers_event
= sd_event_source_unref(manager
->kill_workers_event
);
802 r
= sd_event_add_time(manager
->event
, &manager
->kill_workers_event
, CLOCK_MONOTONIC
,
803 now(CLOCK_MONOTONIC
) + 3 * USEC_PER_SEC
, USEC_PER_SEC
, on_kill_workers_event
, manager
);
805 return log_warning_errno(r
, "Failed to create timer event for killing idle workers: %m");
810 static int manager_disable_kill_workers_event(Manager
*manager
) {
813 if (!manager
->kill_workers_event
)
816 r
= sd_event_source_set_enabled(manager
->kill_workers_event
, SD_EVENT_OFF
);
818 return log_warning_errno(r
, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
823 static void event_queue_start(Manager
*manager
) {
829 if (LIST_IS_EMPTY(manager
->events
) ||
830 manager
->exit
|| manager
->stop_exec_queue
)
833 assert_se(sd_event_now(manager
->event
, CLOCK_MONOTONIC
, &usec
) >= 0);
834 /* check for changed config, every 3 seconds at most */
835 if (manager
->last_usec
== 0 ||
836 (usec
- manager
->last_usec
) > 3 * USEC_PER_SEC
) {
837 if (udev_rules_check_timestamp(manager
->rules
) ||
838 udev_builtin_validate())
839 manager_reload(manager
);
841 manager
->last_usec
= usec
;
844 (void) manager_disable_kill_workers_event(manager
);
848 if (!manager
->rules
) {
849 manager
->rules
= udev_rules_new(arg_resolve_name_timing
);
854 LIST_FOREACH(event
,event
,manager
->events
) {
855 if (event
->state
!= EVENT_QUEUED
)
858 /* do not start event if parent or child event is still running */
859 if (is_devpath_busy(manager
, event
))
862 event_run(manager
, event
);
866 static void event_queue_cleanup(Manager
*manager
, enum event_state match_type
) {
867 struct event
*event
, *tmp
;
869 LIST_FOREACH_SAFE(event
, event
, tmp
, manager
->events
) {
870 if (match_type
!= EVENT_UNDEF
&& match_type
!= event
->state
)
877 static int on_worker(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
878 Manager
*manager
= userdata
;
883 struct worker_message msg
;
884 struct iovec iovec
= {
886 .iov_len
= sizeof(msg
),
889 struct cmsghdr cmsghdr
;
890 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
))];
892 struct msghdr msghdr
= {
895 .msg_control
= &control
,
896 .msg_controllen
= sizeof(control
),
898 struct cmsghdr
*cmsg
;
900 struct ucred
*ucred
= NULL
;
901 struct worker
*worker
;
903 size
= recvmsg(fd
, &msghdr
, MSG_DONTWAIT
);
907 else if (errno
== EAGAIN
)
908 /* nothing more to read */
911 return log_error_errno(errno
, "failed to receive message: %m");
912 } else if (size
!= sizeof(struct worker_message
)) {
913 log_warning_errno(EIO
, "ignoring worker message with invalid size %zi bytes", size
);
917 CMSG_FOREACH(cmsg
, &msghdr
) {
918 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
919 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
920 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
)))
921 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
924 if (!ucred
|| ucred
->pid
<= 0) {
925 log_warning_errno(EIO
, "ignoring worker message without valid PID");
929 /* lookup worker who sent the signal */
930 worker
= hashmap_get(manager
->workers
, PID_TO_PTR(ucred
->pid
));
932 log_debug("worker ["PID_FMT
"] returned, but is no longer tracked", ucred
->pid
);
936 if (worker
->state
!= WORKER_KILLED
)
937 worker
->state
= WORKER_IDLE
;
939 /* worker returned */
940 event_free(worker
->event
);
943 /* we have free workers, try to schedule events */
944 event_queue_start(manager
);
949 static int on_uevent(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
950 Manager
*manager
= userdata
;
951 struct udev_device
*dev
;
956 dev
= udev_monitor_receive_device(manager
->monitor
);
958 udev_device_ensure_usec_initialized(dev
, NULL
);
959 r
= event_queue_insert(manager
, dev
);
961 udev_device_unref(dev
);
963 /* we have fresh events, try to schedule them */
964 event_queue_start(manager
);
970 /* receive the udevd message from userspace */
971 static int on_ctrl_msg(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
972 Manager
*manager
= userdata
;
973 _cleanup_(udev_ctrl_connection_unrefp
) struct udev_ctrl_connection
*ctrl_conn
= NULL
;
974 _cleanup_(udev_ctrl_msg_unrefp
) struct udev_ctrl_msg
*ctrl_msg
= NULL
;
980 ctrl_conn
= udev_ctrl_get_connection(manager
->ctrl
);
984 ctrl_msg
= udev_ctrl_receive_msg(ctrl_conn
);
988 i
= udev_ctrl_get_set_log_level(ctrl_msg
);
990 log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i
);
991 log_set_max_level(i
);
992 manager_kill_workers(manager
);
995 if (udev_ctrl_get_stop_exec_queue(ctrl_msg
) > 0) {
996 log_debug("udevd message (STOP_EXEC_QUEUE) received");
997 manager
->stop_exec_queue
= true;
1000 if (udev_ctrl_get_start_exec_queue(ctrl_msg
) > 0) {
1001 log_debug("udevd message (START_EXEC_QUEUE) received");
1002 manager
->stop_exec_queue
= false;
1003 event_queue_start(manager
);
1006 if (udev_ctrl_get_reload(ctrl_msg
) > 0) {
1007 log_debug("udevd message (RELOAD) received");
1008 manager_reload(manager
);
1011 str
= udev_ctrl_get_set_env(ctrl_msg
);
1013 _cleanup_free_
char *key
= NULL
, *val
= NULL
, *old_key
= NULL
, *old_val
= NULL
;
1016 eq
= strchr(str
, '=');
1018 log_error("Invalid key format '%s'", str
);
1022 key
= strndup(str
, eq
- str
);
1028 old_val
= hashmap_remove2(manager
->properties
, key
, (void **) &old_key
);
1030 r
= hashmap_ensure_allocated(&manager
->properties
, &string_hash_ops
);
1038 log_debug("udevd message (ENV) received, unset '%s'", key
);
1040 r
= hashmap_put(manager
->properties
, key
, NULL
);
1052 log_debug("udevd message (ENV) received, set '%s=%s'", key
, val
);
1054 r
= hashmap_put(manager
->properties
, key
, val
);
1062 manager_kill_workers(manager
);
1065 i
= udev_ctrl_get_set_children_max(ctrl_msg
);
1067 log_debug("udevd message (SET_MAX_CHILDREN) received, children_max=%i", i
);
1068 arg_children_max
= i
;
1070 (void) sd_notifyf(false,
1072 "STATUS=Processing with %u children at max", arg_children_max
);
1075 if (udev_ctrl_get_ping(ctrl_msg
) > 0)
1076 log_debug("udevd message (SYNC) received");
1078 if (udev_ctrl_get_exit(ctrl_msg
) > 0) {
1079 log_debug("udevd message (EXIT) received");
1080 manager_exit(manager
);
1081 /* keep reference to block the client until we exit
1082 TODO: deal with several blocking exit requests */
1083 manager
->ctrl_conn_blocking
= udev_ctrl_connection_ref(ctrl_conn
);
1089 static int synthesize_change(sd_device
*dev
) {
1090 const char *subsystem
, *sysname
, *devname
, *syspath
, *devtype
;
1091 char filename
[PATH_MAX
];
1094 r
= sd_device_get_subsystem(dev
, &subsystem
);
1098 r
= sd_device_get_sysname(dev
, &sysname
);
1102 r
= sd_device_get_devname(dev
, &devname
);
1106 r
= sd_device_get_syspath(dev
, &syspath
);
1110 r
= sd_device_get_devtype(dev
, &devtype
);
1114 if (streq_ptr("block", subsystem
) &&
1115 streq_ptr("disk", devtype
) &&
1116 !startswith(sysname
, "dm-")) {
1117 _cleanup_(sd_device_enumerator_unrefp
) sd_device_enumerator
*e
= NULL
;
1118 bool part_table_read
= false, has_partitions
= false;
1123 * Try to re-read the partition table. This only succeeds if
1124 * none of the devices is busy. The kernel returns 0 if no
1125 * partition table is found, and we will not get an event for
1128 fd
= open(devname
, O_RDONLY
|O_CLOEXEC
|O_NOFOLLOW
|O_NONBLOCK
);
1130 r
= flock(fd
, LOCK_EX
|LOCK_NB
);
1132 r
= ioctl(fd
, BLKRRPART
, 0);
1136 part_table_read
= true;
1139 /* search for partitions */
1140 r
= sd_device_enumerator_new(&e
);
1144 r
= sd_device_enumerator_allow_uninitialized(e
);
1148 r
= sd_device_enumerator_add_match_parent(e
, dev
);
1152 r
= sd_device_enumerator_add_match_subsystem(e
, "block", true);
1156 FOREACH_DEVICE(e
, d
) {
1159 if (sd_device_get_devtype(d
, &t
) < 0 ||
1160 !streq("partition", t
))
1163 has_partitions
= true;
1168 * We have partitions and re-read the table, the kernel already sent
1169 * out a "change" event for the disk, and "remove/add" for all
1172 if (part_table_read
&& has_partitions
)
1176 * We have partitions but re-reading the partition table did not
1177 * work, synthesize "change" for the disk and all partitions.
1179 log_debug("Device '%s' is closed, synthesising 'change'", devname
);
1180 strscpyl(filename
, sizeof(filename
), syspath
, "/uevent", NULL
);
1181 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1183 FOREACH_DEVICE(e
, d
) {
1184 const char *t
, *n
, *s
;
1186 if (sd_device_get_devtype(d
, &t
) < 0 ||
1187 !streq("partition", t
))
1190 if (sd_device_get_devname(d
, &n
) < 0 ||
1191 sd_device_get_syspath(d
, &s
) < 0)
1194 log_debug("Device '%s' is closed, synthesising partition '%s' 'change'", devname
, n
);
1195 strscpyl(filename
, sizeof(filename
), s
, "/uevent", NULL
);
1196 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1202 log_debug("Device %s is closed, synthesising 'change'", devname
);
1203 strscpyl(filename
, sizeof(filename
), syspath
, "/uevent", NULL
);
1204 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1209 static int on_inotify(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1210 Manager
*manager
= userdata
;
1211 union inotify_event_buffer buffer
;
1212 struct inotify_event
*e
;
1217 (void) manager_disable_kill_workers_event(manager
);
1219 l
= read(fd
, &buffer
, sizeof(buffer
));
1221 if (IN_SET(errno
, EAGAIN
, EINTR
))
1224 return log_error_errno(errno
, "Failed to read inotify fd: %m");
1227 FOREACH_INOTIFY_EVENT(e
, buffer
, l
) {
1228 _cleanup_(sd_device_unrefp
) sd_device
*dev
= NULL
;
1229 const char *devnode
;
1231 if (udev_watch_lookup(e
->wd
, &dev
) <= 0)
1234 if (sd_device_get_devname(dev
, &devnode
) < 0)
1237 log_device_debug(dev
, "Inotify event: %x for %s", e
->mask
, devnode
);
1238 if (e
->mask
& IN_CLOSE_WRITE
)
1239 synthesize_change(dev
);
1240 else if (e
->mask
& IN_IGNORED
)
1241 udev_watch_end(dev
);
1247 static int on_sigterm(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1248 Manager
*manager
= userdata
;
1252 manager_exit(manager
);
1257 static int on_sighup(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1258 Manager
*manager
= userdata
;
1262 manager_reload(manager
);
1267 static int on_sigchld(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1268 Manager
*manager
= userdata
;
1275 struct worker
*worker
;
1277 pid
= waitpid(-1, &status
, WNOHANG
);
1281 worker
= hashmap_get(manager
->workers
, PID_TO_PTR(pid
));
1283 log_warning("worker ["PID_FMT
"] is unknown, ignoring", pid
);
1287 if (WIFEXITED(status
)) {
1288 if (WEXITSTATUS(status
) == 0)
1289 log_debug("worker ["PID_FMT
"] exited", pid
);
1291 log_warning("worker ["PID_FMT
"] exited with return code %i", pid
, WEXITSTATUS(status
));
1292 } else if (WIFSIGNALED(status
)) {
1293 log_warning("worker ["PID_FMT
"] terminated by signal %i (%s)", pid
, WTERMSIG(status
), signal_to_string(WTERMSIG(status
)));
1294 } else if (WIFSTOPPED(status
)) {
1295 log_info("worker ["PID_FMT
"] stopped", pid
);
1297 } else if (WIFCONTINUED(status
)) {
1298 log_info("worker ["PID_FMT
"] continued", pid
);
1301 log_warning("worker ["PID_FMT
"] exit with status 0x%04x", pid
, status
);
1303 if ((!WIFEXITED(status
) || WEXITSTATUS(status
) != 0) && worker
->event
) {
1304 log_error("worker ["PID_FMT
"] failed while handling '%s'", pid
, worker
->event
->devpath
);
1305 /* delete state from disk */
1306 udev_device_delete_db(worker
->event
->dev
);
1307 udev_device_tag_index(worker
->event
->dev
, NULL
, false);
1308 /* forward kernel event without amending it */
1309 udev_monitor_send_device(manager
->monitor
, NULL
, worker
->event
->dev_kernel
);
1312 worker_free(worker
);
1315 /* we can start new workers, try to schedule events */
1316 event_queue_start(manager
);
1318 /* Disable unnecessary cleanup event */
1319 if (hashmap_isempty(manager
->workers
) && manager
->kill_workers_event
)
1320 (void) sd_event_source_set_enabled(manager
->kill_workers_event
, SD_EVENT_OFF
);
1325 static int on_post(sd_event_source
*s
, void *userdata
) {
1326 Manager
*manager
= userdata
;
1330 if (!LIST_IS_EMPTY(manager
->events
))
1333 /* There are no pending events. Let's cleanup idle process. */
1335 if (!hashmap_isempty(manager
->workers
)) {
1336 /* There are idle workers */
1337 (void) manager_enable_kill_workers_event(manager
);
1341 /* There are no idle workers. */
1344 return sd_event_exit(manager
->event
, 0);
1346 if (manager
->cgroup
)
1347 /* cleanup possible left-over processes in our cgroup */
1348 (void) cg_kill(SYSTEMD_CGROUP_CONTROLLER
, manager
->cgroup
, SIGKILL
, CGROUP_IGNORE_SELF
, NULL
, NULL
, NULL
);
1353 static int listen_fds(int *ret_ctrl
, int *ret_netlink
) {
1354 int ctrl_fd
= -1, netlink_fd
= -1;
1358 assert(ret_netlink
);
1360 n
= sd_listen_fds(true);
1364 for (fd
= SD_LISTEN_FDS_START
; fd
< n
+ SD_LISTEN_FDS_START
; fd
++) {
1365 if (sd_is_socket(fd
, AF_LOCAL
, SOCK_SEQPACKET
, -1) > 0) {
1372 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
1373 if (netlink_fd
>= 0)
1382 *ret_ctrl
= ctrl_fd
;
1383 *ret_netlink
= netlink_fd
;
1389 * read the kernel command line, in case we need to get into debug mode
1390 * udev.log_priority=<level> syslog priority
1391 * udev.children_max=<number of workers> events are fully serialized if set to 1
1392 * udev.exec_delay=<number of seconds> delay execution of every executed program
1393 * udev.event_timeout=<number of seconds> seconds to wait before terminating an event
1395 static int parse_proc_cmdline_item(const char *key
, const char *value
, void *data
) {
1403 if (proc_cmdline_key_streq(key
, "udev.log_priority")) {
1405 if (proc_cmdline_value_missing(key
, value
))
1408 r
= log_level_from_string(value
);
1410 log_set_max_level(r
);
1412 } else if (proc_cmdline_key_streq(key
, "udev.event_timeout")) {
1414 if (proc_cmdline_value_missing(key
, value
))
1417 r
= parse_sec(value
, &arg_event_timeout_usec
);
1419 } else if (proc_cmdline_key_streq(key
, "udev.children_max")) {
1421 if (proc_cmdline_value_missing(key
, value
))
1424 r
= safe_atou(value
, &arg_children_max
);
1426 } else if (proc_cmdline_key_streq(key
, "udev.exec_delay")) {
1428 if (proc_cmdline_value_missing(key
, value
))
1431 r
= parse_sec(value
, &arg_exec_delay_usec
);
1433 } else if (startswith(key
, "udev."))
1434 log_warning("Unknown udev kernel command line option \"%s\"", key
);
1437 log_warning_errno(r
, "Failed to parse \"%s=%s\", ignoring: %m", key
, value
);
1442 static int help(void) {
1443 _cleanup_free_
char *link
= NULL
;
1446 r
= terminal_urlify_man("systemd-udevd.service", "8", &link
);
1450 printf("%s [OPTIONS...]\n\n"
1451 "Manages devices.\n\n"
1452 " -h --help Print this message\n"
1453 " -V --version Print version of the program\n"
1454 " -d --daemon Detach and run in the background\n"
1455 " -D --debug Enable debug output\n"
1456 " -c --children-max=INT Set maximum number of workers\n"
1457 " -e --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1458 " -t --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1459 " -N --resolve-names=early|late|never\n"
1460 " When to resolve users and groups\n"
1461 "\nSee the %s for details.\n"
1462 , program_invocation_short_name
1469 static int parse_argv(int argc
, char *argv
[]) {
1470 static const struct option options
[] = {
1471 { "daemon", no_argument
, NULL
, 'd' },
1472 { "debug", no_argument
, NULL
, 'D' },
1473 { "children-max", required_argument
, NULL
, 'c' },
1474 { "exec-delay", required_argument
, NULL
, 'e' },
1475 { "event-timeout", required_argument
, NULL
, 't' },
1476 { "resolve-names", required_argument
, NULL
, 'N' },
1477 { "help", no_argument
, NULL
, 'h' },
1478 { "version", no_argument
, NULL
, 'V' },
1487 while ((c
= getopt_long(argc
, argv
, "c:de:Dt:N:hV", options
, NULL
)) >= 0) {
1493 arg_daemonize
= true;
1496 r
= safe_atou(optarg
, &arg_children_max
);
1498 log_warning_errno(r
, "Failed to parse --children-max= value '%s', ignoring: %m", optarg
);
1501 r
= parse_sec(optarg
, &arg_exec_delay_usec
);
1503 log_warning_errno(r
, "Failed to parse --exec-delay= value '%s', ignoring: %m", optarg
);
1506 r
= parse_sec(optarg
, &arg_event_timeout_usec
);
1508 log_warning_errno(r
, "Failed to parse --event-timeout= value '%s', ignoring: %m", optarg
);
1514 ResolveNameTiming t
;
1516 t
= resolve_name_timing_from_string(optarg
);
1518 log_warning("Invalid --resolve-names= value '%s', ignoring.", optarg
);
1520 arg_resolve_name_timing
= t
;
1526 printf("%s\n", PACKAGE_VERSION
);
1531 assert_not_reached("Unhandled option");
1539 static int manager_new(Manager
**ret
, int fd_ctrl
, int fd_uevent
, const char *cgroup
) {
1540 _cleanup_(manager_freep
) Manager
*manager
= NULL
;
1545 manager
= new(Manager
, 1);
1549 *manager
= (Manager
) {
1551 .worker_watch
= { -1, -1 },
1555 udev_builtin_init();
1557 manager
->rules
= udev_rules_new(arg_resolve_name_timing
);
1558 if (!manager
->rules
)
1559 return log_error_errno(ENOMEM
, "error reading rules");
1561 manager
->ctrl
= udev_ctrl_new_from_fd(fd_ctrl
);
1563 return log_error_errno(EINVAL
, "error taking over udev control socket");
1565 r
= udev_ctrl_enable_receiving(manager
->ctrl
);
1567 return log_error_errno(r
, "Failed to bind udev control socket: %m");
1569 fd_ctrl
= udev_ctrl_get_fd(manager
->ctrl
);
1571 return log_error_errno(fd_ctrl
, "Failed to get udev control fd: %m");
1573 manager
->monitor
= udev_monitor_new_from_netlink_fd(NULL
, "kernel", fd_uevent
);
1574 if (!manager
->monitor
)
1575 return log_error_errno(EINVAL
, "error taking over netlink socket");
1577 (void) udev_monitor_set_receive_buffer_size(manager
->monitor
, 128 * 1024 * 1024);
1579 r
= udev_monitor_enable_receiving(manager
->monitor
);
1581 return log_error_errno(r
, "Failed to bind netlink socket; %m");
1583 fd_uevent
= udev_monitor_get_fd(manager
->monitor
);
1585 return log_error_errno(fd_uevent
, "Failed to get uevent fd: %m");
1587 /* unnamed socket from workers to the main daemon */
1588 r
= socketpair(AF_LOCAL
, SOCK_DGRAM
|SOCK_CLOEXEC
, 0, manager
->worker_watch
);
1590 return log_error_errno(errno
, "error creating socketpair: %m");
1592 fd_worker
= manager
->worker_watch
[READ_END
];
1594 r
= setsockopt_int(fd_worker
, SOL_SOCKET
, SO_PASSCRED
, true);
1596 return log_error_errno(r
, "could not enable SO_PASSCRED: %m");
1598 r
= udev_watch_init();
1600 return log_error_errno(r
, "Failed to create inotify descriptor: %m");
1601 manager
->fd_inotify
= r
;
1603 udev_watch_restore();
1605 /* block and listen to all signals on signalfd */
1606 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGTERM
, SIGINT
, SIGHUP
, SIGCHLD
, -1) >= 0);
1608 r
= sd_event_default(&manager
->event
);
1610 return log_error_errno(r
, "could not allocate event loop: %m");
1612 r
= sd_event_add_signal(manager
->event
, NULL
, SIGINT
, on_sigterm
, manager
);
1614 return log_error_errno(r
, "error creating sigint event source: %m");
1616 r
= sd_event_add_signal(manager
->event
, NULL
, SIGTERM
, on_sigterm
, manager
);
1618 return log_error_errno(r
, "error creating sigterm event source: %m");
1620 r
= sd_event_add_signal(manager
->event
, NULL
, SIGHUP
, on_sighup
, manager
);
1622 return log_error_errno(r
, "error creating sighup event source: %m");
1624 r
= sd_event_add_signal(manager
->event
, NULL
, SIGCHLD
, on_sigchld
, manager
);
1626 return log_error_errno(r
, "error creating sigchld event source: %m");
1628 r
= sd_event_set_watchdog(manager
->event
, true);
1630 return log_error_errno(r
, "error creating watchdog event source: %m");
1632 r
= sd_event_add_io(manager
->event
, &manager
->ctrl_event
, fd_ctrl
, EPOLLIN
, on_ctrl_msg
, manager
);
1634 return log_error_errno(r
, "error creating ctrl event source: %m");
1636 /* This needs to be after the inotify and uevent handling, to make sure
1637 * that the ping is send back after fully processing the pending uevents
1638 * (including the synthetic ones we may create due to inotify events).
1640 r
= sd_event_source_set_priority(manager
->ctrl_event
, SD_EVENT_PRIORITY_IDLE
);
1642 return log_error_errno(r
, "cold not set IDLE event priority for ctrl event source: %m");
1644 r
= sd_event_add_io(manager
->event
, &manager
->inotify_event
, manager
->fd_inotify
, EPOLLIN
, on_inotify
, manager
);
1646 return log_error_errno(r
, "error creating inotify event source: %m");
1648 r
= sd_event_add_io(manager
->event
, &manager
->uevent_event
, fd_uevent
, EPOLLIN
, on_uevent
, manager
);
1650 return log_error_errno(r
, "error creating uevent event source: %m");
1652 r
= sd_event_add_io(manager
->event
, NULL
, fd_worker
, EPOLLIN
, on_worker
, manager
);
1654 return log_error_errno(r
, "error creating worker event source: %m");
1656 r
= sd_event_add_post(manager
->event
, NULL
, on_post
, manager
);
1658 return log_error_errno(r
, "error creating post event source: %m");
1660 *ret
= TAKE_PTR(manager
);
1665 static int run(int fd_ctrl
, int fd_uevent
, const char *cgroup
) {
1666 _cleanup_(manager_freep
) Manager
*manager
= NULL
;
1669 r
= manager_new(&manager
, fd_ctrl
, fd_uevent
, cgroup
);
1671 r
= log_error_errno(r
, "failed to allocate manager object: %m");
1675 r
= udev_rules_apply_static_dev_perms(manager
->rules
);
1677 log_error_errno(r
, "failed to apply permissions on static device nodes: %m");
1679 (void) sd_notifyf(false,
1681 "STATUS=Processing with %u children at max", arg_children_max
);
1683 r
= sd_event_loop(manager
->event
);
1685 log_error_errno(r
, "event loop failed: %m");
1689 sd_event_get_exit_code(manager
->event
, &r
);
1694 "STATUS=Shutting down...");
1696 udev_ctrl_cleanup(manager
->ctrl
);
1700 int main(int argc
, char *argv
[]) {
1701 _cleanup_free_
char *cgroup
= NULL
;
1702 int fd_ctrl
= -1, fd_uevent
= -1;
1705 log_set_target(LOG_TARGET_AUTO
);
1706 udev_parse_config_full(&arg_children_max
, &arg_exec_delay_usec
, &arg_event_timeout_usec
, &arg_resolve_name_timing
);
1707 log_parse_environment();
1710 r
= parse_argv(argc
, argv
);
1714 r
= proc_cmdline_parse(parse_proc_cmdline_item
, NULL
, PROC_CMDLINE_STRIP_RD_PREFIX
);
1716 log_warning_errno(r
, "failed to parse kernel command line, ignoring: %m");
1719 log_set_target(LOG_TARGET_CONSOLE
);
1720 log_set_max_level(LOG_DEBUG
);
1723 log_set_max_level_realm(LOG_REALM_SYSTEMD
, log_get_max_level());
1729 if (arg_children_max
== 0) {
1731 unsigned long mem_limit
;
1733 arg_children_max
= 8;
1735 if (sched_getaffinity(0, sizeof(cpu_set
), &cpu_set
) == 0)
1736 arg_children_max
+= CPU_COUNT(&cpu_set
) * 8;
1738 mem_limit
= physical_memory() / (128LU*1024*1024);
1739 arg_children_max
= MAX(10U, MIN(arg_children_max
, mem_limit
));
1741 log_debug("set children_max to %u", arg_children_max
);
1744 /* set umask before creating any file/directory */
1747 r
= log_error_errno(errno
, "could not change dir to /: %m");
1753 r
= mac_selinux_init();
1755 log_error_errno(r
, "could not initialize labelling: %m");
1759 r
= mkdir_errno_wrapper("/run/udev", 0755);
1760 if (r
< 0 && r
!= -EEXIST
) {
1761 log_error_errno(r
, "could not create /run/udev: %m");
1765 dev_setup(NULL
, UID_INVALID
, GID_INVALID
);
1767 if (getppid() == 1) {
1768 /* get our own cgroup, we regularly kill everything udev has left behind
1769 we only do this on systemd systems, and only if we are directly spawned
1770 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1771 r
= cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER
, 0, &cgroup
);
1773 if (IN_SET(r
, -ENOENT
, -ENOMEDIUM
))
1774 log_debug_errno(r
, "did not find dedicated cgroup: %m");
1776 log_warning_errno(r
, "failed to get cgroup: %m");
1780 r
= listen_fds(&fd_ctrl
, &fd_uevent
);
1782 r
= log_error_errno(r
, "could not listen on fds: %m");
1786 if (arg_daemonize
) {
1789 log_info("starting version " PACKAGE_VERSION
);
1791 /* connect /dev/null to stdin, stdout, stderr */
1792 if (log_get_max_level() < LOG_DEBUG
) {
1793 r
= make_null_stdio();
1795 log_warning_errno(r
, "Failed to redirect standard streams to /dev/null: %m");
1803 r
= log_error_errno(errno
, "fork of daemon failed: %m");
1806 mac_selinux_finish();
1808 _exit(EXIT_SUCCESS
);
1813 r
= set_oom_score_adjust(-1000);
1815 log_debug_errno(r
, "Failed to adjust OOM score, ignoring: %m");
1818 r
= run(fd_ctrl
, fd_uevent
, cgroup
);
1821 mac_selinux_finish();
1823 return r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
;