From: Lennart Poettering Date: Thu, 24 Apr 2014 05:46:31 +0000 (+0200) Subject: util: make sure all our name_to_handle_at() code makes use of file_handle_union X-Git-Tag: v213~323 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=21749924e12201d8f5210c5dc9695e18fd16bb93 util: make sure all our name_to_handle_at() code makes use of file_handle_union --- diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index 0a2ab82a8..c05cb3e51 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -108,17 +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) { - union file_handle_union h = { .handle.handle_bytes = MAX_HANDLE_SZ, }; - 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; 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; diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 373dd7a35..69fcb1660 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -324,11 +324,15 @@ bool path_equal(const char *a, const char *b) { } int path_is_mount_point(const char *t, bool allow_symlink) { - char *parent; - int r; - struct file_handle *h; + + union file_handle_union h = { + .handle.handle_bytes = MAX_HANDLE_SZ + }; + int mount_id, mount_id_parent; + char *parent; struct stat a, b; + int r; /* We are not actually interested in the file handles, but * name_to_handle_at() also passes us the mount ID, hence use @@ -337,12 +341,9 @@ int path_is_mount_point(const char *t, bool allow_symlink) { if (path_equal(t, "/")) return 1; - h = alloca(MAX_HANDLE_SZ); - h->handle_bytes = MAX_HANDLE_SZ; - - r = name_to_handle_at(AT_FDCWD, t, h, &mount_id, allow_symlink ? AT_SYMLINK_FOLLOW : 0); + r = name_to_handle_at(AT_FDCWD, t, &h.handle, &mount_id, allow_symlink ? AT_SYMLINK_FOLLOW : 0); if (r < 0) { - if (errno == ENOSYS || errno == ENOTSUP) + if (IN_SET(errno, ENOSYS, EOPNOTSUPP)) /* This kernel or file system does not support * name_to_handle_at(), hence fallback to the * traditional stat() logic */ @@ -358,15 +359,14 @@ int path_is_mount_point(const char *t, bool allow_symlink) { if (r < 0) return r; - h->handle_bytes = MAX_HANDLE_SZ; - r = name_to_handle_at(AT_FDCWD, parent, h, &mount_id_parent, 0); + h.handle.handle_bytes = MAX_HANDLE_SZ; + r = name_to_handle_at(AT_FDCWD, parent, &h.handle, &mount_id_parent, 0); free(parent); - if (r < 0) { /* The parent can't do name_to_handle_at() but the * directory we are interested in can? If so, it must * be a mount point */ - if (errno == ENOTSUP) + if (errno == EOPNOTSUPP) return 1; return -errno; @@ -393,7 +393,6 @@ fallback: r = lstat(parent, &b); free(parent); - if (r < 0) return -errno;