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-private.h"
38 #include "device-util.h"
39 #include "event-util.h"
42 #include "format-util.h"
46 #include "libudev-device-internal.h"
48 #include "netlink-util.h"
49 #include "parse-util.h"
50 #include "proc-cmdline.h"
51 #include "process-util.h"
52 #include "selinux-util.h"
53 #include "signal-util.h"
54 #include "socket-util.h"
55 #include "string-util.h"
56 #include "syslog-util.h"
57 #include "terminal-util.h"
58 #include "udev-builtin.h"
59 #include "udev-ctrl.h"
60 #include "udev-util.h"
61 #include "udev-watch.h"
63 #include "user-util.h"
65 static bool arg_debug
= false;
66 static int arg_daemonize
= false;
67 static ResolveNameTiming arg_resolve_name_timing
= RESOLVE_NAME_EARLY
;
68 static unsigned arg_children_max
= 0;
69 static usec_t arg_exec_delay_usec
= 0;
70 static usec_t arg_event_timeout_usec
= 180 * USEC_PER_SEC
;
72 typedef struct Manager
{
75 LIST_HEAD(struct event
, events
);
77 pid_t pid
; /* the process that originally allocated the manager object */
79 struct udev_rules
*rules
;
84 struct udev_monitor
*monitor
;
85 struct udev_ctrl
*ctrl
;
86 struct udev_ctrl_connection
*ctrl_conn_blocking
;
90 sd_event_source
*ctrl_event
;
91 sd_event_source
*uevent_event
;
92 sd_event_source
*inotify_event
;
93 sd_event_source
*kill_workers_event
;
97 bool stop_exec_queue
:1;
108 LIST_FIELDS(struct event
, event
);
110 struct udev_device
*dev
;
111 struct udev_device
*dev_kernel
;
112 struct worker
*worker
;
113 enum event_state state
;
114 unsigned long long int delaying_seqnum
;
115 unsigned long long int seqnum
;
118 const char *devpath_old
;
122 sd_event_source
*timeout_warning
;
123 sd_event_source
*timeout
;
126 static void event_queue_cleanup(Manager
*manager
, enum event_state type
);
138 struct udev_monitor
*monitor
;
139 enum worker_state state
;
143 /* passed from worker to main process */
144 struct worker_message
{
147 static void event_free(struct event
*event
) {
152 assert(event
->manager
);
154 LIST_REMOVE(event
, event
->manager
->events
, event
);
155 udev_device_unref(event
->dev
);
156 udev_device_unref(event
->dev_kernel
);
158 sd_event_source_unref(event
->timeout_warning
);
159 sd_event_source_unref(event
->timeout
);
162 event
->worker
->event
= NULL
;
164 if (LIST_IS_EMPTY(event
->manager
->events
)) {
165 /* only clean up the queue from the process that created it */
166 if (event
->manager
->pid
== getpid_cached()) {
167 r
= unlink("/run/udev/queue");
169 log_warning_errno(errno
, "could not unlink /run/udev/queue: %m");
176 static void worker_free(struct worker
*worker
) {
180 assert(worker
->manager
);
182 hashmap_remove(worker
->manager
->workers
, PID_TO_PTR(worker
->pid
));
183 udev_monitor_unref(worker
->monitor
);
184 event_free(worker
->event
);
189 static void manager_workers_free(Manager
*manager
) {
190 struct worker
*worker
;
195 HASHMAP_FOREACH(worker
, manager
->workers
, i
)
198 manager
->workers
= hashmap_free(manager
->workers
);
201 static int worker_new(struct worker
**ret
, Manager
*manager
, struct udev_monitor
*worker_monitor
, pid_t pid
) {
202 _cleanup_free_
struct worker
*worker
= NULL
;
207 assert(worker_monitor
);
210 worker
= new0(struct worker
, 1);
214 worker
->manager
= manager
;
215 /* close monitor, but keep address around */
216 udev_monitor_disconnect(worker_monitor
);
217 worker
->monitor
= udev_monitor_ref(worker_monitor
);
220 r
= hashmap_ensure_allocated(&manager
->workers
, NULL
);
224 r
= hashmap_put(manager
->workers
, PID_TO_PTR(pid
), worker
);
228 *ret
= TAKE_PTR(worker
);
233 static int on_event_timeout(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
234 struct event
*event
= userdata
;
237 assert(event
->worker
);
239 kill_and_sigcont(event
->worker
->pid
, SIGKILL
);
240 event
->worker
->state
= WORKER_KILLED
;
242 log_error("seq %llu '%s' killed", udev_device_get_seqnum(event
->dev
), event
->devpath
);
247 static int on_event_timeout_warning(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
248 struct event
*event
= userdata
;
252 log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event
->dev
), event
->devpath
);
257 static void worker_attach_event(struct worker
*worker
, struct event
*event
) {
262 assert(worker
->manager
);
264 assert(!event
->worker
);
265 assert(!worker
->event
);
267 worker
->state
= WORKER_RUNNING
;
268 worker
->event
= event
;
269 event
->state
= EVENT_RUNNING
;
270 event
->worker
= worker
;
272 e
= worker
->manager
->event
;
274 assert_se(sd_event_now(e
, CLOCK_MONOTONIC
, &usec
) >= 0);
276 (void) sd_event_add_time(e
, &event
->timeout_warning
, CLOCK_MONOTONIC
,
277 usec
+ udev_warn_timeout(arg_event_timeout_usec
), USEC_PER_SEC
, on_event_timeout_warning
, event
);
279 (void) sd_event_add_time(e
, &event
->timeout
, CLOCK_MONOTONIC
,
280 usec
+ arg_event_timeout_usec
, USEC_PER_SEC
, on_event_timeout
, event
);
283 static void manager_clear_for_worker(Manager
*manager
) {
286 manager
->ctrl_event
= sd_event_source_unref(manager
->ctrl_event
);
287 manager
->uevent_event
= sd_event_source_unref(manager
->uevent_event
);
288 manager
->inotify_event
= sd_event_source_unref(manager
->inotify_event
);
289 manager
->kill_workers_event
= sd_event_source_unref(manager
->kill_workers_event
);
291 manager
->event
= sd_event_unref(manager
->event
);
293 manager_workers_free(manager
);
294 event_queue_cleanup(manager
, EVENT_UNDEF
);
296 manager
->monitor
= udev_monitor_unref(manager
->monitor
);
297 manager
->ctrl_conn_blocking
= udev_ctrl_connection_unref(manager
->ctrl_conn_blocking
);
298 manager
->ctrl
= udev_ctrl_unref(manager
->ctrl
);
300 manager
->worker_watch
[READ_END
] = safe_close(manager
->worker_watch
[READ_END
]);
303 static void manager_free(Manager
*manager
) {
309 manager_clear_for_worker(manager
);
311 sd_netlink_unref(manager
->rtnl
);
313 hashmap_free_free_free(manager
->properties
);
314 udev_rules_unref(manager
->rules
);
316 safe_close(manager
->fd_inotify
);
317 safe_close_pair(manager
->worker_watch
);
322 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
324 static int worker_send_message(int fd
) {
325 struct worker_message message
= {};
327 return loop_write(fd
, &message
, sizeof(message
), false);
330 static int worker_lock_block_device(sd_device
*dev
, int *ret_fd
) {
331 _cleanup_close_
int fd
= -1;
339 * Take a shared lock on the device node; this establishes
340 * a concept of device "ownership" to serialize device
341 * access. External processes holding an exclusive lock will
342 * cause udev to skip the event handling; in the case udev
343 * acquired the lock, the external process can block until
344 * udev has finished its event handling.
347 r
= sd_device_get_property_value(dev
, "ACTION", &val
);
349 return log_device_debug_errno(dev
, r
, "Failed to get the value of property 'ACTION': %m");
351 if (streq(val
, "remove"))
354 r
= sd_device_get_subsystem(dev
, &val
);
356 return log_device_debug_errno(dev
, r
, "Failed to get subsystem: %m");
358 if (!streq(val
, "block"))
361 r
= sd_device_get_sysname(dev
, &val
);
363 return log_device_debug_errno(dev
, r
, "Failed to get sysname: %m");
365 if (startswith(val
, "dm-") ||
366 startswith(val
, "md") ||
367 startswith(val
, "drbd"))
370 r
= sd_device_get_devtype(dev
, &val
);
371 if (r
< 0 && r
!= -ENOENT
)
372 return log_device_debug_errno(dev
, r
, "Failed to get devtype: %m");
373 if (r
>= 0 && streq(val
, "partition")) {
374 r
= sd_device_get_parent(dev
, &dev
);
376 return log_device_debug_errno(dev
, r
, "Failed to get parent device: %m");
379 r
= sd_device_get_devname(dev
, &val
);
383 return log_device_debug_errno(dev
, r
, "Failed to get devname: %m");
385 fd
= open(val
, O_RDONLY
|O_CLOEXEC
|O_NOFOLLOW
|O_NONBLOCK
);
387 log_device_debug_errno(dev
, errno
, "Failed to open '%s', ignoring: %m", val
);
391 if (flock(fd
, LOCK_SH
|LOCK_NB
) < 0)
392 return log_device_debug_errno(dev
, errno
, "Failed to flock(%s): %m", val
);
394 *ret_fd
= TAKE_FD(fd
);
398 static int worker_process_device(Manager
*manager
, sd_device
*dev
) {
399 _cleanup_(udev_event_freep
) struct udev_event
*udev_event
= NULL
;
400 _cleanup_close_
int fd_lock
= -1;
407 r
= sd_device_get_property_value(dev
, "SEQNUM", &seqnum
);
409 log_device_debug_errno(dev
, r
, "Failed to get SEQNUM: %m");
411 log_device_debug(dev
, "Processing device (SEQNUM=%s)", seqnum
);
413 udev_event
= udev_event_new(dev
, arg_exec_delay_usec
, manager
->rtnl
);
417 r
= worker_lock_block_device(dev
, &fd_lock
);
421 /* apply rules, create node, symlinks */
422 udev_event_execute_rules(udev_event
, arg_event_timeout_usec
, manager
->properties
, manager
->rules
);
423 udev_event_execute_run(udev_event
, arg_event_timeout_usec
);
426 /* in case rtnl was initialized */
427 manager
->rtnl
= sd_netlink_ref(udev_event
->rtnl
);
429 /* apply/restore inotify watch */
430 if (udev_event
->inotify_watch
) {
431 (void) udev_watch_begin(dev
);
432 r
= device_update_db(dev
);
434 return log_device_debug_errno(dev
, r
, "Failed to update database under /run/udev/data/: %m");
437 log_device_debug(dev
, "Device (SEQNUM=%s) processed", seqnum
);
442 static int worker_main(Manager
*_manager
, struct udev_monitor
*monitor
, struct udev_device
*first_device
) {
443 _cleanup_(udev_device_unrefp
) struct udev_device
*dev
= first_device
;
444 _cleanup_(manager_freep
) Manager
*manager
= _manager
;
445 _cleanup_close_
int fd_signal
= -1, fd_ep
= -1;
446 struct epoll_event ep_signal
= { .events
= EPOLLIN
};
447 struct epoll_event ep_monitor
= { .events
= EPOLLIN
};
455 unsetenv("NOTIFY_SOCKET");
457 /* Clear unnecessary data form worker in Manager object.*/
458 manager_clear_for_worker(manager
);
461 fd_signal
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
463 return log_error_errno(errno
, "error creating signalfd %m");
464 ep_signal
.data
.fd
= fd_signal
;
466 fd_monitor
= udev_monitor_get_fd(monitor
);
467 ep_monitor
.data
.fd
= fd_monitor
;
469 fd_ep
= epoll_create1(EPOLL_CLOEXEC
);
471 return log_error_errno(errno
, "error creating epoll fd: %m");
473 if (epoll_ctl(fd_ep
, EPOLL_CTL_ADD
, fd_signal
, &ep_signal
) < 0 ||
474 epoll_ctl(fd_ep
, EPOLL_CTL_ADD
, fd_monitor
, &ep_monitor
) < 0)
475 return log_error_errno(errno
, "fail to add fds to epoll: %m");
477 /* Request TERM signal if parent exits.
478 * Ignore error, not much we can do in that case. */
479 (void) prctl(PR_SET_PDEATHSIG
, SIGTERM
);
481 /* Reset OOM score, we only protect the main daemon. */
482 r
= set_oom_score_adjust(0);
484 log_debug_errno(r
, "Failed to reset OOM score, ignoring: %m");
487 r
= worker_process_device(manager
, dev
->device
);
489 log_device_warning_errno(dev
->device
, r
, "Failed to process device, ignoring: %m");
491 /* send processed event back to libudev listeners */
492 r
= udev_monitor_send_device(monitor
, NULL
, dev
);
494 log_device_warning_errno(dev
->device
, r
, "Failed to send device to udev event listeners, ignoring: %m");
496 /* send udevd the result of the event execution */
497 r
= worker_send_message(manager
->worker_watch
[WRITE_END
]);
499 log_device_warning_errno(dev
->device
, r
, "Failed to send result of seq %llu to main daemon: %m",
500 udev_device_get_seqnum(dev
));
502 dev
= udev_device_unref(dev
);
504 /* wait for more device messages from main udevd, or term signal */
506 struct epoll_event ev
[4];
510 fdcount
= epoll_wait(fd_ep
, ev
, ELEMENTSOF(ev
), -1);
514 return log_error_errno(errno
, "failed to poll: %m");
517 for (i
= 0; i
< fdcount
; i
++) {
518 if (ev
[i
].data
.fd
== fd_monitor
&& ev
[i
].events
& EPOLLIN
) {
519 dev
= udev_monitor_receive_device(monitor
);
521 } else if (ev
[i
].data
.fd
== fd_signal
&& ev
[i
].events
& EPOLLIN
) {
522 struct signalfd_siginfo fdsi
;
525 size
= read(fd_signal
, &fdsi
, sizeof(struct signalfd_siginfo
));
526 if (size
!= sizeof(struct signalfd_siginfo
))
528 switch (fdsi
.ssi_signo
) {
538 static void worker_spawn(Manager
*manager
, struct event
*event
) {
539 _cleanup_(udev_monitor_unrefp
) struct udev_monitor
*worker_monitor
= NULL
;
543 /* listen for new events */
544 worker_monitor
= udev_monitor_new_from_netlink(NULL
, NULL
);
545 if (worker_monitor
== NULL
)
547 /* allow the main daemon netlink address to send devices to the worker */
548 udev_monitor_allow_unicast_sender(worker_monitor
, manager
->monitor
);
549 r
= udev_monitor_enable_receiving(worker_monitor
);
551 log_error_errno(r
, "worker: could not enable receiving of device: %m");
556 r
= worker_main(manager
, worker_monitor
, TAKE_PTR(event
->dev
));
558 _exit(r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
561 event
->state
= EVENT_QUEUED
;
562 log_error_errno(errno
, "fork of child failed: %m");
566 struct worker
*worker
;
568 r
= worker_new(&worker
, manager
, worker_monitor
, pid
);
572 worker_attach_event(worker
, event
);
574 log_debug("seq %llu forked new worker ["PID_FMT
"]", udev_device_get_seqnum(event
->dev
), pid
);
580 static void event_run(Manager
*manager
, struct event
*event
) {
581 struct worker
*worker
;
587 HASHMAP_FOREACH(worker
, manager
->workers
, i
) {
590 if (worker
->state
!= WORKER_IDLE
)
593 count
= udev_monitor_send_device(manager
->monitor
, worker
->monitor
, event
->dev
);
595 log_error_errno(errno
, "worker ["PID_FMT
"] did not accept message %zi (%m), kill it",
597 (void) kill(worker
->pid
, SIGKILL
);
598 worker
->state
= WORKER_KILLED
;
601 worker_attach_event(worker
, event
);
605 if (hashmap_size(manager
->workers
) >= arg_children_max
) {
606 if (arg_children_max
> 1)
607 log_debug("maximum number (%i) of children reached", hashmap_size(manager
->workers
));
611 /* start new worker and pass initial device */
612 worker_spawn(manager
, event
);
615 static int event_queue_insert(Manager
*manager
, struct udev_device
*dev
) {
622 /* only one process can add events to the queue */
623 if (manager
->pid
== 0)
624 manager
->pid
= getpid_cached();
626 assert(manager
->pid
== getpid_cached());
628 event
= new0(struct event
, 1);
632 event
->manager
= manager
;
634 event
->dev_kernel
= udev_device_shallow_clone(dev
);
635 udev_device_copy_properties(event
->dev_kernel
, dev
);
636 event
->seqnum
= udev_device_get_seqnum(dev
);
637 event
->devpath
= udev_device_get_devpath(dev
);
638 event
->devpath_len
= strlen(event
->devpath
);
639 event
->devpath_old
= udev_device_get_devpath_old(dev
);
640 event
->devnum
= udev_device_get_devnum(dev
);
641 event
->is_block
= streq("block", udev_device_get_subsystem(dev
));
642 event
->ifindex
= udev_device_get_ifindex(dev
);
644 log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev
),
645 udev_device_get_action(dev
), udev_device_get_subsystem(dev
));
647 event
->state
= EVENT_QUEUED
;
649 if (LIST_IS_EMPTY(manager
->events
)) {
650 r
= touch("/run/udev/queue");
652 log_warning_errno(r
, "could not touch /run/udev/queue: %m");
655 LIST_APPEND(event
, manager
->events
, event
);
660 static void manager_kill_workers(Manager
*manager
) {
661 struct worker
*worker
;
666 HASHMAP_FOREACH(worker
, manager
->workers
, i
) {
667 if (worker
->state
== WORKER_KILLED
)
670 worker
->state
= WORKER_KILLED
;
671 (void) kill(worker
->pid
, SIGTERM
);
675 /* lookup event for identical, parent, child device */
676 static bool is_devpath_busy(Manager
*manager
, struct event
*event
) {
677 struct event
*loop_event
;
680 /* check if queue contains events we depend on */
681 LIST_FOREACH(event
, loop_event
, manager
->events
) {
682 /* we already found a later event, earlier cannot block us, no need to check again */
683 if (loop_event
->seqnum
< event
->delaying_seqnum
)
686 /* event we checked earlier still exists, no need to check again */
687 if (loop_event
->seqnum
== event
->delaying_seqnum
)
690 /* found ourself, no later event can block us */
691 if (loop_event
->seqnum
>= event
->seqnum
)
694 /* check major/minor */
695 if (major(event
->devnum
) != 0 && event
->devnum
== loop_event
->devnum
&& event
->is_block
== loop_event
->is_block
)
698 /* check network device ifindex */
699 if (event
->ifindex
> 0 && event
->ifindex
== loop_event
->ifindex
)
702 /* check our old name */
703 if (event
->devpath_old
&& streq(loop_event
->devpath
, event
->devpath_old
)) {
704 event
->delaying_seqnum
= loop_event
->seqnum
;
708 /* compare devpath */
709 common
= MIN(loop_event
->devpath_len
, event
->devpath_len
);
711 /* one devpath is contained in the other? */
712 if (memcmp(loop_event
->devpath
, event
->devpath
, common
) != 0)
715 /* identical device event found */
716 if (loop_event
->devpath_len
== event
->devpath_len
) {
717 /* devices names might have changed/swapped in the meantime */
718 if (major(event
->devnum
) != 0 || event
->ifindex
> 0)
720 event
->delaying_seqnum
= loop_event
->seqnum
;
724 /* parent device event found */
725 if (event
->devpath
[common
] == '/') {
726 event
->delaying_seqnum
= loop_event
->seqnum
;
730 /* child device event found */
731 if (loop_event
->devpath
[common
] == '/') {
732 event
->delaying_seqnum
= loop_event
->seqnum
;
740 static int on_exit_timeout(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
741 Manager
*manager
= userdata
;
745 log_error_errno(ETIMEDOUT
, "giving up waiting for workers to finish");
747 sd_event_exit(manager
->event
, -ETIMEDOUT
);
752 static void manager_exit(Manager
*manager
) {
758 manager
->exit
= true;
762 "STATUS=Starting shutdown...");
764 /* close sources of new events and discard buffered events */
765 manager
->ctrl_event
= sd_event_source_unref(manager
->ctrl_event
);
766 manager
->ctrl
= udev_ctrl_unref(manager
->ctrl
);
768 manager
->inotify_event
= sd_event_source_unref(manager
->inotify_event
);
769 manager
->fd_inotify
= safe_close(manager
->fd_inotify
);
771 manager
->uevent_event
= sd_event_source_unref(manager
->uevent_event
);
772 manager
->monitor
= udev_monitor_unref(manager
->monitor
);
774 /* discard queued events and kill workers */
775 event_queue_cleanup(manager
, EVENT_QUEUED
);
776 manager_kill_workers(manager
);
778 assert_se(sd_event_now(manager
->event
, CLOCK_MONOTONIC
, &usec
) >= 0);
780 r
= sd_event_add_time(manager
->event
, NULL
, CLOCK_MONOTONIC
,
781 usec
+ 30 * USEC_PER_SEC
, USEC_PER_SEC
, on_exit_timeout
, manager
);
786 /* reload requested, HUP signal received, rules changed, builtin changed */
787 static void manager_reload(Manager
*manager
) {
793 "STATUS=Flushing configuration...");
795 manager_kill_workers(manager
);
796 manager
->rules
= udev_rules_unref(manager
->rules
);
801 "STATUS=Processing with %u children at max", arg_children_max
);
804 static int on_kill_workers_event(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
805 Manager
*manager
= userdata
;
809 log_debug("Cleanup idle workers");
810 manager_kill_workers(manager
);
815 static void event_queue_start(Manager
*manager
) {
822 if (LIST_IS_EMPTY(manager
->events
) ||
823 manager
->exit
|| manager
->stop_exec_queue
)
826 assert_se(sd_event_now(manager
->event
, CLOCK_MONOTONIC
, &usec
) >= 0);
827 /* check for changed config, every 3 seconds at most */
828 if (manager
->last_usec
== 0 ||
829 (usec
- manager
->last_usec
) > 3 * USEC_PER_SEC
) {
830 if (udev_rules_check_timestamp(manager
->rules
) ||
831 udev_builtin_validate())
832 manager_reload(manager
);
834 manager
->last_usec
= usec
;
837 r
= event_source_disable(manager
->kill_workers_event
);
839 log_warning_errno(r
, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
843 if (!manager
->rules
) {
844 manager
->rules
= udev_rules_new(arg_resolve_name_timing
);
849 LIST_FOREACH(event
,event
,manager
->events
) {
850 if (event
->state
!= EVENT_QUEUED
)
853 /* do not start event if parent or child event is still running */
854 if (is_devpath_busy(manager
, event
))
857 event_run(manager
, event
);
861 static void event_queue_cleanup(Manager
*manager
, enum event_state match_type
) {
862 struct event
*event
, *tmp
;
864 LIST_FOREACH_SAFE(event
, event
, tmp
, manager
->events
) {
865 if (match_type
!= EVENT_UNDEF
&& match_type
!= event
->state
)
872 static int on_worker(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
873 Manager
*manager
= userdata
;
878 struct worker_message msg
;
879 struct iovec iovec
= {
881 .iov_len
= sizeof(msg
),
884 struct cmsghdr cmsghdr
;
885 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
))];
887 struct msghdr msghdr
= {
890 .msg_control
= &control
,
891 .msg_controllen
= sizeof(control
),
893 struct cmsghdr
*cmsg
;
895 struct ucred
*ucred
= NULL
;
896 struct worker
*worker
;
898 size
= recvmsg(fd
, &msghdr
, MSG_DONTWAIT
);
902 else if (errno
== EAGAIN
)
903 /* nothing more to read */
906 return log_error_errno(errno
, "failed to receive message: %m");
907 } else if (size
!= sizeof(struct worker_message
)) {
908 log_warning_errno(EIO
, "ignoring worker message with invalid size %zi bytes", size
);
912 CMSG_FOREACH(cmsg
, &msghdr
) {
913 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
914 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
915 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
)))
916 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
919 if (!ucred
|| ucred
->pid
<= 0) {
920 log_warning_errno(EIO
, "ignoring worker message without valid PID");
924 /* lookup worker who sent the signal */
925 worker
= hashmap_get(manager
->workers
, PID_TO_PTR(ucred
->pid
));
927 log_debug("worker ["PID_FMT
"] returned, but is no longer tracked", ucred
->pid
);
931 if (worker
->state
!= WORKER_KILLED
)
932 worker
->state
= WORKER_IDLE
;
934 /* worker returned */
935 event_free(worker
->event
);
938 /* we have free workers, try to schedule events */
939 event_queue_start(manager
);
944 static int on_uevent(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
945 Manager
*manager
= userdata
;
946 struct udev_device
*dev
;
951 dev
= udev_monitor_receive_device(manager
->monitor
);
953 udev_device_ensure_usec_initialized(dev
, NULL
);
954 r
= event_queue_insert(manager
, dev
);
956 udev_device_unref(dev
);
958 /* we have fresh events, try to schedule them */
959 event_queue_start(manager
);
965 /* receive the udevd message from userspace */
966 static int on_ctrl_msg(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
967 Manager
*manager
= userdata
;
968 _cleanup_(udev_ctrl_connection_unrefp
) struct udev_ctrl_connection
*ctrl_conn
= NULL
;
969 _cleanup_(udev_ctrl_msg_unrefp
) struct udev_ctrl_msg
*ctrl_msg
= NULL
;
975 ctrl_conn
= udev_ctrl_get_connection(manager
->ctrl
);
979 ctrl_msg
= udev_ctrl_receive_msg(ctrl_conn
);
983 i
= udev_ctrl_get_set_log_level(ctrl_msg
);
985 log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i
);
986 log_set_max_level(i
);
987 manager_kill_workers(manager
);
990 if (udev_ctrl_get_stop_exec_queue(ctrl_msg
) > 0) {
991 log_debug("udevd message (STOP_EXEC_QUEUE) received");
992 manager
->stop_exec_queue
= true;
995 if (udev_ctrl_get_start_exec_queue(ctrl_msg
) > 0) {
996 log_debug("udevd message (START_EXEC_QUEUE) received");
997 manager
->stop_exec_queue
= false;
998 event_queue_start(manager
);
1001 if (udev_ctrl_get_reload(ctrl_msg
) > 0) {
1002 log_debug("udevd message (RELOAD) received");
1003 manager_reload(manager
);
1006 str
= udev_ctrl_get_set_env(ctrl_msg
);
1008 _cleanup_free_
char *key
= NULL
, *val
= NULL
, *old_key
= NULL
, *old_val
= NULL
;
1011 eq
= strchr(str
, '=');
1013 log_error("Invalid key format '%s'", str
);
1017 key
= strndup(str
, eq
- str
);
1023 old_val
= hashmap_remove2(manager
->properties
, key
, (void **) &old_key
);
1025 r
= hashmap_ensure_allocated(&manager
->properties
, &string_hash_ops
);
1033 log_debug("udevd message (ENV) received, unset '%s'", key
);
1035 r
= hashmap_put(manager
->properties
, key
, NULL
);
1047 log_debug("udevd message (ENV) received, set '%s=%s'", key
, val
);
1049 r
= hashmap_put(manager
->properties
, key
, val
);
1057 manager_kill_workers(manager
);
1060 i
= udev_ctrl_get_set_children_max(ctrl_msg
);
1062 log_debug("udevd message (SET_MAX_CHILDREN) received, children_max=%i", i
);
1063 arg_children_max
= i
;
1065 (void) sd_notifyf(false,
1067 "STATUS=Processing with %u children at max", arg_children_max
);
1070 if (udev_ctrl_get_ping(ctrl_msg
) > 0)
1071 log_debug("udevd message (SYNC) received");
1073 if (udev_ctrl_get_exit(ctrl_msg
) > 0) {
1074 log_debug("udevd message (EXIT) received");
1075 manager_exit(manager
);
1076 /* keep reference to block the client until we exit
1077 TODO: deal with several blocking exit requests */
1078 manager
->ctrl_conn_blocking
= udev_ctrl_connection_ref(ctrl_conn
);
1084 static int synthesize_change(sd_device
*dev
) {
1085 const char *subsystem
, *sysname
, *devname
, *syspath
, *devtype
;
1086 char filename
[PATH_MAX
];
1089 r
= sd_device_get_subsystem(dev
, &subsystem
);
1093 r
= sd_device_get_sysname(dev
, &sysname
);
1097 r
= sd_device_get_devname(dev
, &devname
);
1101 r
= sd_device_get_syspath(dev
, &syspath
);
1105 r
= sd_device_get_devtype(dev
, &devtype
);
1109 if (streq_ptr("block", subsystem
) &&
1110 streq_ptr("disk", devtype
) &&
1111 !startswith(sysname
, "dm-")) {
1112 _cleanup_(sd_device_enumerator_unrefp
) sd_device_enumerator
*e
= NULL
;
1113 bool part_table_read
= false, has_partitions
= false;
1118 * Try to re-read the partition table. This only succeeds if
1119 * none of the devices is busy. The kernel returns 0 if no
1120 * partition table is found, and we will not get an event for
1123 fd
= open(devname
, O_RDONLY
|O_CLOEXEC
|O_NOFOLLOW
|O_NONBLOCK
);
1125 r
= flock(fd
, LOCK_EX
|LOCK_NB
);
1127 r
= ioctl(fd
, BLKRRPART
, 0);
1131 part_table_read
= true;
1134 /* search for partitions */
1135 r
= sd_device_enumerator_new(&e
);
1139 r
= sd_device_enumerator_allow_uninitialized(e
);
1143 r
= sd_device_enumerator_add_match_parent(e
, dev
);
1147 r
= sd_device_enumerator_add_match_subsystem(e
, "block", true);
1151 FOREACH_DEVICE(e
, d
) {
1154 if (sd_device_get_devtype(d
, &t
) < 0 ||
1155 !streq("partition", t
))
1158 has_partitions
= true;
1163 * We have partitions and re-read the table, the kernel already sent
1164 * out a "change" event for the disk, and "remove/add" for all
1167 if (part_table_read
&& has_partitions
)
1171 * We have partitions but re-reading the partition table did not
1172 * work, synthesize "change" for the disk and all partitions.
1174 log_debug("Device '%s' is closed, synthesising 'change'", devname
);
1175 strscpyl(filename
, sizeof(filename
), syspath
, "/uevent", NULL
);
1176 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1178 FOREACH_DEVICE(e
, d
) {
1179 const char *t
, *n
, *s
;
1181 if (sd_device_get_devtype(d
, &t
) < 0 ||
1182 !streq("partition", t
))
1185 if (sd_device_get_devname(d
, &n
) < 0 ||
1186 sd_device_get_syspath(d
, &s
) < 0)
1189 log_debug("Device '%s' is closed, synthesising partition '%s' 'change'", devname
, n
);
1190 strscpyl(filename
, sizeof(filename
), s
, "/uevent", NULL
);
1191 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1197 log_debug("Device %s is closed, synthesising 'change'", devname
);
1198 strscpyl(filename
, sizeof(filename
), syspath
, "/uevent", NULL
);
1199 write_string_file(filename
, "change", WRITE_STRING_FILE_DISABLE_BUFFER
);
1204 static int on_inotify(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1205 Manager
*manager
= userdata
;
1206 union inotify_event_buffer buffer
;
1207 struct inotify_event
*e
;
1213 r
= event_source_disable(manager
->kill_workers_event
);
1215 log_warning_errno(r
, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
1217 l
= read(fd
, &buffer
, sizeof(buffer
));
1219 if (IN_SET(errno
, EAGAIN
, EINTR
))
1222 return log_error_errno(errno
, "Failed to read inotify fd: %m");
1225 FOREACH_INOTIFY_EVENT(e
, buffer
, l
) {
1226 _cleanup_(sd_device_unrefp
) sd_device
*dev
= NULL
;
1227 const char *devnode
;
1229 if (udev_watch_lookup(e
->wd
, &dev
) <= 0)
1232 if (sd_device_get_devname(dev
, &devnode
) < 0)
1235 log_device_debug(dev
, "Inotify event: %x for %s", e
->mask
, devnode
);
1236 if (e
->mask
& IN_CLOSE_WRITE
)
1237 synthesize_change(dev
);
1238 else if (e
->mask
& IN_IGNORED
)
1239 udev_watch_end(dev
);
1245 static int on_sigterm(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1246 Manager
*manager
= userdata
;
1250 manager_exit(manager
);
1255 static int on_sighup(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1256 Manager
*manager
= userdata
;
1260 manager_reload(manager
);
1265 static int on_sigchld(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1266 Manager
*manager
= userdata
;
1274 struct worker
*worker
;
1276 pid
= waitpid(-1, &status
, WNOHANG
);
1280 worker
= hashmap_get(manager
->workers
, PID_TO_PTR(pid
));
1282 log_warning("worker ["PID_FMT
"] is unknown, ignoring", pid
);
1286 if (WIFEXITED(status
)) {
1287 if (WEXITSTATUS(status
) == 0)
1288 log_debug("worker ["PID_FMT
"] exited", pid
);
1290 log_warning("worker ["PID_FMT
"] exited with return code %i", pid
, WEXITSTATUS(status
));
1291 } else if (WIFSIGNALED(status
)) {
1292 log_warning("worker ["PID_FMT
"] terminated by signal %i (%s)", pid
, WTERMSIG(status
), signal_to_string(WTERMSIG(status
)));
1293 } else if (WIFSTOPPED(status
)) {
1294 log_info("worker ["PID_FMT
"] stopped", pid
);
1296 } else if (WIFCONTINUED(status
)) {
1297 log_info("worker ["PID_FMT
"] continued", pid
);
1300 log_warning("worker ["PID_FMT
"] exit with status 0x%04x", pid
, status
);
1302 if ((!WIFEXITED(status
) || WEXITSTATUS(status
) != 0) && worker
->event
) {
1303 log_error("worker ["PID_FMT
"] failed while handling '%s'", pid
, worker
->event
->devpath
);
1304 /* delete state from disk */
1305 udev_device_delete_db(worker
->event
->dev
);
1306 udev_device_tag_index(worker
->event
->dev
, NULL
, false);
1307 /* forward kernel event without amending it */
1308 udev_monitor_send_device(manager
->monitor
, NULL
, worker
->event
->dev_kernel
);
1311 worker_free(worker
);
1314 /* we can start new workers, try to schedule events */
1315 event_queue_start(manager
);
1317 /* Disable unnecessary cleanup event */
1318 if (hashmap_isempty(manager
->workers
)) {
1319 r
= event_source_disable(manager
->kill_workers_event
);
1321 log_warning_errno(r
, "Failed to disable event source for cleaning up idle workers, ignoring: %m");
1327 static int on_post(sd_event_source
*s
, void *userdata
) {
1328 Manager
*manager
= userdata
;
1332 if (!LIST_IS_EMPTY(manager
->events
))
1335 /* There are no pending events. Let's cleanup idle process. */
1337 if (!hashmap_isempty(manager
->workers
)) {
1338 /* There are idle workers */
1339 (void) event_reset_time(manager
->event
, &manager
->kill_workers_event
, CLOCK_MONOTONIC
,
1340 now(CLOCK_MONOTONIC
) + 3 * USEC_PER_SEC
, USEC_PER_SEC
,
1341 on_kill_workers_event
, manager
, 0, "kill-workers-event", false);
1345 /* There are no idle workers. */
1348 return sd_event_exit(manager
->event
, 0);
1350 if (manager
->cgroup
)
1351 /* cleanup possible left-over processes in our cgroup */
1352 (void) cg_kill(SYSTEMD_CGROUP_CONTROLLER
, manager
->cgroup
, SIGKILL
, CGROUP_IGNORE_SELF
, NULL
, NULL
, NULL
);
1357 static int listen_fds(int *ret_ctrl
, int *ret_netlink
) {
1358 int ctrl_fd
= -1, netlink_fd
= -1;
1362 assert(ret_netlink
);
1364 n
= sd_listen_fds(true);
1368 for (fd
= SD_LISTEN_FDS_START
; fd
< n
+ SD_LISTEN_FDS_START
; fd
++) {
1369 if (sd_is_socket(fd
, AF_LOCAL
, SOCK_SEQPACKET
, -1) > 0) {
1376 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
1377 if (netlink_fd
>= 0)
1386 *ret_ctrl
= ctrl_fd
;
1387 *ret_netlink
= netlink_fd
;
1393 * read the kernel command line, in case we need to get into debug mode
1394 * udev.log_priority=<level> syslog priority
1395 * udev.children_max=<number of workers> events are fully serialized if set to 1
1396 * udev.exec_delay=<number of seconds> delay execution of every executed program
1397 * udev.event_timeout=<number of seconds> seconds to wait before terminating an event
1399 static int parse_proc_cmdline_item(const char *key
, const char *value
, void *data
) {
1407 if (proc_cmdline_key_streq(key
, "udev.log_priority")) {
1409 if (proc_cmdline_value_missing(key
, value
))
1412 r
= log_level_from_string(value
);
1414 log_set_max_level(r
);
1416 } else if (proc_cmdline_key_streq(key
, "udev.event_timeout")) {
1418 if (proc_cmdline_value_missing(key
, value
))
1421 r
= parse_sec(value
, &arg_event_timeout_usec
);
1423 } else if (proc_cmdline_key_streq(key
, "udev.children_max")) {
1425 if (proc_cmdline_value_missing(key
, value
))
1428 r
= safe_atou(value
, &arg_children_max
);
1430 } else if (proc_cmdline_key_streq(key
, "udev.exec_delay")) {
1432 if (proc_cmdline_value_missing(key
, value
))
1435 r
= parse_sec(value
, &arg_exec_delay_usec
);
1437 } else if (startswith(key
, "udev."))
1438 log_warning("Unknown udev kernel command line option \"%s\"", key
);
1441 log_warning_errno(r
, "Failed to parse \"%s=%s\", ignoring: %m", key
, value
);
1446 static int help(void) {
1447 _cleanup_free_
char *link
= NULL
;
1450 r
= terminal_urlify_man("systemd-udevd.service", "8", &link
);
1454 printf("%s [OPTIONS...]\n\n"
1455 "Manages devices.\n\n"
1456 " -h --help Print this message\n"
1457 " -V --version Print version of the program\n"
1458 " -d --daemon Detach and run in the background\n"
1459 " -D --debug Enable debug output\n"
1460 " -c --children-max=INT Set maximum number of workers\n"
1461 " -e --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1462 " -t --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1463 " -N --resolve-names=early|late|never\n"
1464 " When to resolve users and groups\n"
1465 "\nSee the %s for details.\n"
1466 , program_invocation_short_name
1473 static int parse_argv(int argc
, char *argv
[]) {
1474 static const struct option options
[] = {
1475 { "daemon", no_argument
, NULL
, 'd' },
1476 { "debug", no_argument
, NULL
, 'D' },
1477 { "children-max", required_argument
, NULL
, 'c' },
1478 { "exec-delay", required_argument
, NULL
, 'e' },
1479 { "event-timeout", required_argument
, NULL
, 't' },
1480 { "resolve-names", required_argument
, NULL
, 'N' },
1481 { "help", no_argument
, NULL
, 'h' },
1482 { "version", no_argument
, NULL
, 'V' },
1491 while ((c
= getopt_long(argc
, argv
, "c:de:Dt:N:hV", options
, NULL
)) >= 0) {
1497 arg_daemonize
= true;
1500 r
= safe_atou(optarg
, &arg_children_max
);
1502 log_warning_errno(r
, "Failed to parse --children-max= value '%s', ignoring: %m", optarg
);
1505 r
= parse_sec(optarg
, &arg_exec_delay_usec
);
1507 log_warning_errno(r
, "Failed to parse --exec-delay= value '%s', ignoring: %m", optarg
);
1510 r
= parse_sec(optarg
, &arg_event_timeout_usec
);
1512 log_warning_errno(r
, "Failed to parse --event-timeout= value '%s', ignoring: %m", optarg
);
1518 ResolveNameTiming t
;
1520 t
= resolve_name_timing_from_string(optarg
);
1522 log_warning("Invalid --resolve-names= value '%s', ignoring.", optarg
);
1524 arg_resolve_name_timing
= t
;
1530 printf("%s\n", PACKAGE_VERSION
);
1535 assert_not_reached("Unhandled option");
1543 static int manager_new(Manager
**ret
, int fd_ctrl
, int fd_uevent
, const char *cgroup
) {
1544 _cleanup_(manager_freep
) Manager
*manager
= NULL
;
1549 manager
= new(Manager
, 1);
1553 *manager
= (Manager
) {
1555 .worker_watch
= { -1, -1 },
1559 udev_builtin_init();
1561 manager
->rules
= udev_rules_new(arg_resolve_name_timing
);
1562 if (!manager
->rules
)
1563 return log_error_errno(ENOMEM
, "error reading rules");
1565 manager
->ctrl
= udev_ctrl_new_from_fd(fd_ctrl
);
1567 return log_error_errno(EINVAL
, "error taking over udev control socket");
1569 r
= udev_ctrl_enable_receiving(manager
->ctrl
);
1571 return log_error_errno(r
, "Failed to bind udev control socket: %m");
1573 fd_ctrl
= udev_ctrl_get_fd(manager
->ctrl
);
1575 return log_error_errno(fd_ctrl
, "Failed to get udev control fd: %m");
1577 manager
->monitor
= udev_monitor_new_from_netlink_fd(NULL
, "kernel", fd_uevent
);
1578 if (!manager
->monitor
)
1579 return log_error_errno(EINVAL
, "error taking over netlink socket");
1581 (void) udev_monitor_set_receive_buffer_size(manager
->monitor
, 128 * 1024 * 1024);
1583 r
= udev_monitor_enable_receiving(manager
->monitor
);
1585 return log_error_errno(r
, "Failed to bind netlink socket; %m");
1587 fd_uevent
= udev_monitor_get_fd(manager
->monitor
);
1589 return log_error_errno(fd_uevent
, "Failed to get uevent fd: %m");
1591 /* unnamed socket from workers to the main daemon */
1592 r
= socketpair(AF_LOCAL
, SOCK_DGRAM
|SOCK_CLOEXEC
, 0, manager
->worker_watch
);
1594 return log_error_errno(errno
, "error creating socketpair: %m");
1596 fd_worker
= manager
->worker_watch
[READ_END
];
1598 r
= setsockopt_int(fd_worker
, SOL_SOCKET
, SO_PASSCRED
, true);
1600 return log_error_errno(r
, "could not enable SO_PASSCRED: %m");
1602 r
= udev_watch_init();
1604 return log_error_errno(r
, "Failed to create inotify descriptor: %m");
1605 manager
->fd_inotify
= r
;
1607 udev_watch_restore();
1609 /* block and listen to all signals on signalfd */
1610 assert_se(sigprocmask_many(SIG_BLOCK
, NULL
, SIGTERM
, SIGINT
, SIGHUP
, SIGCHLD
, -1) >= 0);
1612 r
= sd_event_default(&manager
->event
);
1614 return log_error_errno(r
, "could not allocate event loop: %m");
1616 r
= sd_event_add_signal(manager
->event
, NULL
, SIGINT
, on_sigterm
, manager
);
1618 return log_error_errno(r
, "error creating sigint event source: %m");
1620 r
= sd_event_add_signal(manager
->event
, NULL
, SIGTERM
, on_sigterm
, manager
);
1622 return log_error_errno(r
, "error creating sigterm event source: %m");
1624 r
= sd_event_add_signal(manager
->event
, NULL
, SIGHUP
, on_sighup
, manager
);
1626 return log_error_errno(r
, "error creating sighup event source: %m");
1628 r
= sd_event_add_signal(manager
->event
, NULL
, SIGCHLD
, on_sigchld
, manager
);
1630 return log_error_errno(r
, "error creating sigchld event source: %m");
1632 r
= sd_event_set_watchdog(manager
->event
, true);
1634 return log_error_errno(r
, "error creating watchdog event source: %m");
1636 r
= sd_event_add_io(manager
->event
, &manager
->ctrl_event
, fd_ctrl
, EPOLLIN
, on_ctrl_msg
, manager
);
1638 return log_error_errno(r
, "error creating ctrl event source: %m");
1640 /* This needs to be after the inotify and uevent handling, to make sure
1641 * that the ping is send back after fully processing the pending uevents
1642 * (including the synthetic ones we may create due to inotify events).
1644 r
= sd_event_source_set_priority(manager
->ctrl_event
, SD_EVENT_PRIORITY_IDLE
);
1646 return log_error_errno(r
, "cold not set IDLE event priority for ctrl event source: %m");
1648 r
= sd_event_add_io(manager
->event
, &manager
->inotify_event
, manager
->fd_inotify
, EPOLLIN
, on_inotify
, manager
);
1650 return log_error_errno(r
, "error creating inotify event source: %m");
1652 r
= sd_event_add_io(manager
->event
, &manager
->uevent_event
, fd_uevent
, EPOLLIN
, on_uevent
, manager
);
1654 return log_error_errno(r
, "error creating uevent event source: %m");
1656 r
= sd_event_add_io(manager
->event
, NULL
, fd_worker
, EPOLLIN
, on_worker
, manager
);
1658 return log_error_errno(r
, "error creating worker event source: %m");
1660 r
= sd_event_add_post(manager
->event
, NULL
, on_post
, manager
);
1662 return log_error_errno(r
, "error creating post event source: %m");
1664 *ret
= TAKE_PTR(manager
);
1669 static int run(int fd_ctrl
, int fd_uevent
, const char *cgroup
) {
1670 _cleanup_(manager_freep
) Manager
*manager
= NULL
;
1673 r
= manager_new(&manager
, fd_ctrl
, fd_uevent
, cgroup
);
1675 r
= log_error_errno(r
, "failed to allocate manager object: %m");
1679 r
= udev_rules_apply_static_dev_perms(manager
->rules
);
1681 log_error_errno(r
, "failed to apply permissions on static device nodes: %m");
1683 (void) sd_notifyf(false,
1685 "STATUS=Processing with %u children at max", arg_children_max
);
1687 r
= sd_event_loop(manager
->event
);
1689 log_error_errno(r
, "event loop failed: %m");
1693 sd_event_get_exit_code(manager
->event
, &r
);
1698 "STATUS=Shutting down...");
1700 udev_ctrl_cleanup(manager
->ctrl
);
1704 int main(int argc
, char *argv
[]) {
1705 _cleanup_free_
char *cgroup
= NULL
;
1706 int fd_ctrl
= -1, fd_uevent
= -1;
1709 log_set_target(LOG_TARGET_AUTO
);
1710 udev_parse_config_full(&arg_children_max
, &arg_exec_delay_usec
, &arg_event_timeout_usec
, &arg_resolve_name_timing
);
1711 log_parse_environment();
1714 r
= parse_argv(argc
, argv
);
1718 r
= proc_cmdline_parse(parse_proc_cmdline_item
, NULL
, PROC_CMDLINE_STRIP_RD_PREFIX
);
1720 log_warning_errno(r
, "failed to parse kernel command line, ignoring: %m");
1723 log_set_target(LOG_TARGET_CONSOLE
);
1724 log_set_max_level(LOG_DEBUG
);
1727 log_set_max_level_realm(LOG_REALM_SYSTEMD
, log_get_max_level());
1733 if (arg_children_max
== 0) {
1735 unsigned long mem_limit
;
1737 arg_children_max
= 8;
1739 if (sched_getaffinity(0, sizeof(cpu_set
), &cpu_set
) == 0)
1740 arg_children_max
+= CPU_COUNT(&cpu_set
) * 8;
1742 mem_limit
= physical_memory() / (128LU*1024*1024);
1743 arg_children_max
= MAX(10U, MIN(arg_children_max
, mem_limit
));
1745 log_debug("set children_max to %u", arg_children_max
);
1748 /* set umask before creating any file/directory */
1751 r
= log_error_errno(errno
, "could not change dir to /: %m");
1757 r
= mac_selinux_init();
1759 log_error_errno(r
, "could not initialize labelling: %m");
1763 r
= mkdir_errno_wrapper("/run/udev", 0755);
1764 if (r
< 0 && r
!= -EEXIST
) {
1765 log_error_errno(r
, "could not create /run/udev: %m");
1769 dev_setup(NULL
, UID_INVALID
, GID_INVALID
);
1771 if (getppid() == 1) {
1772 /* get our own cgroup, we regularly kill everything udev has left behind
1773 we only do this on systemd systems, and only if we are directly spawned
1774 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1775 r
= cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER
, 0, &cgroup
);
1777 if (IN_SET(r
, -ENOENT
, -ENOMEDIUM
))
1778 log_debug_errno(r
, "did not find dedicated cgroup: %m");
1780 log_warning_errno(r
, "failed to get cgroup: %m");
1784 r
= listen_fds(&fd_ctrl
, &fd_uevent
);
1786 r
= log_error_errno(r
, "could not listen on fds: %m");
1790 if (arg_daemonize
) {
1793 log_info("starting version " PACKAGE_VERSION
);
1795 /* connect /dev/null to stdin, stdout, stderr */
1796 if (log_get_max_level() < LOG_DEBUG
) {
1797 r
= make_null_stdio();
1799 log_warning_errno(r
, "Failed to redirect standard streams to /dev/null: %m");
1807 r
= log_error_errno(errno
, "fork of daemon failed: %m");
1810 mac_selinux_finish();
1812 _exit(EXIT_SUCCESS
);
1817 r
= set_oom_score_adjust(-1000);
1819 log_debug_errno(r
, "Failed to adjust OOM score, ignoring: %m");
1822 r
= run(fd_ctrl
, fd_uevent
, cgroup
);
1825 mac_selinux_finish();
1827 return r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
;