]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
file_utils: add same_device() helper
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 17 Aug 2021 08:38:44 +0000 (10:38 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 17 Aug 2021 09:39:17 +0000 (11:39 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/file_utils.c
src/lxc/file_utils.h

index a361d188e7baf9e2e6f8610227ae169686e67611..eaa9a5a403e2d3dd463ec34af77d357ed10324a4 100644 (file)
@@ -766,3 +766,35 @@ bool same_file_lax(int fda, int fdb)
        return (st_fda.st_dev == st_fdb.st_dev) &&
               (st_fda.st_ino == st_fdb.st_ino);
 }
+
+bool same_device(int fda, const char *patha, int fdb, const char *pathb)
+{
+       int ret;
+       mode_t modea, modeb;
+       struct stat st_fda, st_fdb;
+
+        if (fda == fdb)
+                return true;
+
+       if (is_empty_string(patha))
+               ret = fstat(fda, &st_fda);
+       else
+               ret = fstatat(fda, patha, &st_fda, 0);
+       if (ret)
+               return false;
+
+       if (is_empty_string(pathb))
+               ret = fstat(fdb, &st_fdb);
+       else
+               ret = fstatat(fdb, pathb, &st_fdb, 0);
+       if (ret)
+               return false;
+
+       errno = EINVAL;
+       modea = (st_fda.st_mode & S_IFMT);
+       modeb = (st_fdb.st_mode & S_IFMT);
+       if (modea != modeb || !IN_SET(modea, S_IFCHR, S_IFBLK))
+               return false;
+
+       return (st_fda.st_rdev == st_fdb.st_rdev);
+}
index faf7454dde60fc708d0f4ab0e8a625e73e9eca7f..c9765da50b971b84c60b1692f59ebb991ee93a9b 100644 (file)
@@ -123,4 +123,7 @@ static inline int dup_cloexec(int fd)
        return move_fd(fd_dup);
 }
 
+__hidden extern bool same_device(int fda, const char *patha, int fdb,
+                                const char *pathb);
+
 #endif /* __LXC_FILE_UTILS_H */