From: Yu Watanabe Date: Wed, 15 Jan 2025 19:47:20 +0000 (+0900) Subject: udev-manager: rework initialization of device monitor X-Git-Tag: v258-rc1~1553^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a75abf1ab9f959e5f0cf4bcb090140d23a212f8d;p=thirdparty%2Fsystemd.git udev-manager: rework initialization of device monitor Let's determine the socket for device monitor based on its name. --- diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 59a04c6f441..19ea8e8bca7 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -1073,13 +1073,39 @@ Manager* manager_new(void) { return manager; } -static int manager_listen_fds(Manager *manager, int *ret_netlink) { +static int manager_init_device_monitor(Manager *manager, int fd) { + int r; + + assert(manager); + + /* This takes passed file descriptor on success. */ + + if (fd >= 0) { + if (manager->monitor) + return log_warning_errno(SYNTHETIC_ERRNO(EALREADY), "Received multiple netlink socket (%i), ignoring.", fd); + + r = sd_is_socket(fd, AF_NETLINK, SOCK_RAW, /* listening = */ -1); + if (r < 0) + return log_warning_errno(r, "Failed to verify socket type of %i, ignoring: %m", fd); + if (r == 0) + return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), "Received invalid netlink socket (%i), ignoring.", fd); + } else { + if (manager->monitor) + return 0; + } + + r = device_monitor_new_full(&manager->monitor, MONITOR_GROUP_KERNEL, fd); + if (r < 0) + return log_error_errno(r, "Failed to initialize device monitor: %m"); + + return 0; +} + +static int manager_listen_fds(Manager *manager) { _cleanup_strv_free_ char **names = NULL; - _cleanup_close_ int netlink_fd = -EBADF; int r; assert(manager); - assert(ret_netlink); int n = sd_listen_fds_with_names(/* unset_environment = */ true, &names); if (n < 0) @@ -1091,69 +1117,32 @@ static int manager_listen_fds(Manager *manager, int *ret_netlink) { for (int i = 0; i < n; i++) { int fd = SD_LISTEN_FDS_START + i; - if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) { - if (netlink_fd >= 0) { - log_debug("Received multiple netlink socket (%s), ignoring.", names[i]); - goto unused; - } - - netlink_fd = fd; - continue; - } - if (streq(names[i], "varlink")) r = 0; /* The fd will be handled by sd_varlink_server_listen_auto(). */ else if (streq(names[i], "systemd-udevd-control.socket")) r = manager_init_ctrl(manager, fd); + else if (streq(names[i], "systemd-udevd-kernel.socket")) + r = manager_init_device_monitor(manager, fd); else r = log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Received unexpected fd (%s), ignoring.", names[i]); if (r < 0) - goto unused; - - unused: - close_and_notify_warn(fd, names[i]); + close_and_notify_warn(fd, names[i]); } - *ret_netlink = TAKE_FD(netlink_fd); - return 0; -} - -static int manager_init_device_monitor(Manager *manager, int fd_uevent) { - _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor = NULL; - _cleanup_close_ int fd = fd_uevent; - int r; - - assert(manager); - - /* This consumes passed file descriptor. */ - - r = device_monitor_new_full(&monitor, MONITOR_GROUP_KERNEL, fd); - if (r < 0) - return log_error_errno(r, "Failed to initialize device monitor: %m"); - TAKE_FD(fd); - - (void) sd_device_monitor_set_description(monitor, "manager"); - - manager->monitor = TAKE_PTR(monitor); return 0; } int manager_init(Manager *manager) { - _cleanup_close_ int fd_uevent = -EBADF; - _cleanup_free_ char *cgroup = NULL; int r; assert(manager); - r = manager_listen_fds(manager, &fd_uevent); + r = manager_listen_fds(manager); if (r < 0) return log_error_errno(r, "Failed to listen on fds: %m"); - r = manager_init_device_monitor(manager, TAKE_FD(fd_uevent)); - if (r < 0) - return r; - + _cleanup_free_ char *cgroup = NULL; r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup); if (r < 0) log_debug_errno(r, "Failed to get cgroup, ignoring: %m"); @@ -1169,7 +1158,12 @@ static int manager_start_device_monitor(Manager *manager) { int r; assert(manager); - assert(manager->monitor); + + r = manager_init_device_monitor(manager, -EBADF); + if (r < 0) + return r; + + (void) sd_device_monitor_set_description(manager->monitor, "manager"); r = sd_device_monitor_attach_event(manager->monitor, manager->event); if (r < 0)