X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibudev%2Flibudev-monitor.c;h=c05cb3e511bd840146ed67e4fcc4e65f1defc8be;hp=ba1b04d4798cc6ee22a9690bbb425539967fe770;hb=21749924e12201d8f5210c5dc9695e18fd16bb93;hpb=955d98c9c1104d469c2989dbfb58f58ee6fe9bdc diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index ba1b04d47..c05cb3e51 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -108,19 +108,20 @@ static struct udev_monitor *udev_monitor_new(struct udev *udev) /* we consider udev running when /dev is on devtmpfs */ static bool udev_has_devtmpfs(struct udev *udev) { - struct file_handle *h; - int mount_id; + + union file_handle_union h = { + .handle.handle_bytes = MAX_HANDLE_SZ + }; + _cleanup_fclose_ FILE *f = NULL; char line[LINE_MAX], *e; + int mount_id; int r; - h = alloca(MAX_HANDLE_SZ); - h->handle_bytes = MAX_HANDLE_SZ; - r = name_to_handle_at(AT_FDCWD, "/dev", h, &mount_id, 0); + r = name_to_handle_at(AT_FDCWD, "/dev", &h.handle, &mount_id, 0); if (r < 0) return false; - f = fopen("/proc/self/mountinfo", "re"); if (!f) return false; @@ -146,21 +147,6 @@ static bool udev_has_devtmpfs(struct udev *udev) { return false; } -/* we consider udev running when we have running udev service */ -static bool udev_has_service(struct udev *udev) { - struct udev_queue *queue; - bool active; - - queue = udev_queue_new(udev); - if (!queue) - return false; - - active = udev_queue_get_udev_is_active(queue); - udev_queue_unref(queue); - - return active; -} - struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const char *name, int fd) { struct udev_monitor *udev_monitor; @@ -184,7 +170,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 (!udev_has_service(udev) && !udev_has_devtmpfs(udev)) { + if (access("/run/udev/control", F_OK) < 0 && !udev_has_devtmpfs(udev)) { udev_dbg(udev, "the udev service seems not to be active, disable the monitor\n"); group = UDEV_MONITOR_NONE; } else