From be1791ad6a09d08f6234ba53e45d022e3269dffd Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 13 Aug 2018 17:59:44 +0900 Subject: [PATCH] libudev-monitor: rename udev_has_devtmpfs() and move it to mount-util.c As the function itself is quite generic. --- src/basic/mount-util.c | 36 ++++++++++++++++++++++++++++++ src/basic/mount-util.h | 2 ++ src/libudev/libudev-monitor.c | 42 +---------------------------------- 3 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/basic/mount-util.c b/src/basic/mount-util.c index 1f9590ccb6..ae62d3090e 100644 --- a/src/basic/mount-util.c +++ b/src/basic/mount-util.c @@ -951,3 +951,39 @@ int mount_option_mangle( return 0; } + +int dev_is_devtmpfs(void) { + _cleanup_fclose_ FILE *proc_self_mountinfo = NULL; + char line[LINE_MAX], *e; + int mount_id, r; + + r = path_get_mnt_id("/dev", &mount_id); + if (r < 0) + return r; + + proc_self_mountinfo = fopen("/proc/self/mountinfo", "re"); + if (!proc_self_mountinfo) + return -errno; + + (void) __fsetlocking(proc_self_mountinfo, FSETLOCKING_BYCALLER); + + FOREACH_LINE(line, proc_self_mountinfo, return -errno) { + int mid; + + if (sscanf(line, "%i", &mid) != 1) + continue; + + if (mid != mount_id) + continue; + + e = strstr(line, " - "); + if (!e) + continue; + + /* accept any name that starts with the currently expected type */ + if (startswith(e + 3, "devtmpfs")) + return true; + } + + return false; +} diff --git a/src/basic/mount-util.h b/src/basic/mount-util.h index 3cfea3bb20..ad8c47cb32 100644 --- a/src/basic/mount-util.h +++ b/src/basic/mount-util.h @@ -54,3 +54,5 @@ int mount_option_mangle( unsigned long mount_flags, unsigned long *ret_mount_flags, char **ret_remaining_options); + +int dev_is_devtmpfs(void); diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index f83115c95c..5ca035d43c 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -94,46 +94,6 @@ static struct udev_monitor *udev_monitor_new(struct udev *udev) { return udev_monitor; } -/* we consider udev running when /dev is on devtmpfs */ -static bool udev_has_devtmpfs(struct udev *udev) { - - _cleanup_fclose_ FILE *f = NULL; - char line[LINE_MAX], *e; - int mount_id, r; - - r = path_get_mnt_id("/dev", &mount_id); - if (r < 0) { - if (r != -EOPNOTSUPP) - log_debug_errno(r, "name_to_handle_at on /dev: %m"); - - return false; - } - - f = fopen("/proc/self/mountinfo", "re"); - if (!f) - return false; - - FOREACH_LINE(line, f, return false) { - int mid; - - if (sscanf(line, "%i", &mid) != 1) - continue; - - if (mid != mount_id) - continue; - - e = strstr(line, " - "); - if (!e) - continue; - - /* accept any name that starts with the currently expected type */ - if (startswith(e + 3, "devtmpfs")) - return true; - } - - return false; -} - static void monitor_set_nl_address(struct udev_monitor *udev_monitor) { union sockaddr_union snl; socklen_t addrlen; @@ -169,7 +129,7 @@ struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const c * We do not set a netlink multicast group here, so the socket * will not receive any messages. */ - if (access("/run/udev/control", F_OK) < 0 && !udev_has_devtmpfs(udev)) { + if (access("/run/udev/control", F_OK) < 0 && dev_is_devtmpfs() <= 0) { log_debug("the udev service seems not to be active, disable the monitor"); group = UDEV_MONITOR_NONE; } else