]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mountpoint-util: Add path_get_mnt_id_at()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 14 Mar 2023 21:00:11 +0000 (22:00 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 15 Mar 2023 10:51:06 +0000 (11:51 +0100)
src/basic/mountpoint-util.c
src/basic/mountpoint-util.h

index e285702388a8f7e49f27c382ea8a6b71d768c865..24e38a34e82f6141464008c24dd918289560beaa 100644 (file)
@@ -355,11 +355,19 @@ int path_is_mount_point(const char *t, const char *root, int flags) {
         return fd_is_mount_point(fd, last_path_component(t), flags);
 }
 
-int path_get_mnt_id(const char *path, int *ret) {
+int path_get_mnt_id_at(int dir_fd, const char *path, int *ret) {
         STRUCT_NEW_STATX_DEFINE(buf);
         int r;
 
-        if (statx(AT_FDCWD, path, AT_SYMLINK_NOFOLLOW|AT_NO_AUTOMOUNT, STATX_MNT_ID, &buf.sx) < 0) {
+        assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
+        assert(path);
+        assert(ret);
+
+        if (statx(dir_fd,
+                  path,
+                  AT_NO_AUTOMOUNT|(isempty(path) ? AT_EMPTY_PATH : AT_SYMLINK_NOFOLLOW),
+                  STATX_MNT_ID,
+                  &buf.sx) < 0) {
                 if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno))
                         return -errno;
 
@@ -371,11 +379,11 @@ int path_get_mnt_id(const char *path, int *ret) {
                 return 0;
         }
 
-        r = name_to_handle_at_loop(AT_FDCWD, path, NULL, ret, 0);
+        r = name_to_handle_at_loop(dir_fd, path, NULL, ret, isempty(path) ? AT_EMPTY_PATH : 0);
         if (r == 0 || is_name_to_handle_at_fatal_error(r))
                 return r;
 
-        return fd_fdinfo_mnt_id(AT_FDCWD, path, 0, ret);
+        return fd_fdinfo_mnt_id(dir_fd, path, isempty(path) ? AT_EMPTY_PATH : 0, ret);
 }
 
 bool fstype_is_network(const char *fstype) {
index 977e8e738dd7766c8f37a2d2289b8c4862ce29b9..8c4cee2f544b085ca7ebf461ad545c3bd66ba0a4 100644 (file)
 
 int name_to_handle_at_loop(int fd, const char *path, struct file_handle **ret_handle, int *ret_mnt_id, int flags);
 
-int path_get_mnt_id(const char *path, int *ret);
+int path_get_mnt_id_at(int dir_fd, const char *path, int *ret);
+static inline int path_get_mnt_id(const char *path, int *ret) {
+        return path_get_mnt_id_at(AT_FDCWD, path, ret);
+}
 
 int fd_is_mount_point(int fd, const char *filename, int flags);
 int path_is_mount_point(const char *path, const char *root, int flags);