]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util-lib: rework path_check_fstype() and path_is_temporary_fs() to use O_PATH
authorLennart Poettering <lennart@poettering.net>
Tue, 20 Dec 2016 18:09:27 +0000 (19:09 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 21 Dec 2016 18:09:32 +0000 (19:09 +0100)
Also, add tests to make sure this actually works as intended.

src/basic/stat-util.c
src/test/test-stat-util.c

index ac5db71022934ea7a351798b3d820a22216232f7..7e1914aa140fae46a0c8c85078586b33befabccd 100644 (file)
@@ -204,7 +204,7 @@ int fd_check_fstype(int fd, statfs_f_type_t magic_value) {
 int path_check_fstype(const char *path, statfs_f_type_t magic_value) {
         _cleanup_close_ int fd = -1;
 
-        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_PATH);
         if (fd < 0)
                 return -errno;
 
@@ -228,7 +228,7 @@ int fd_is_temporary_fs(int fd) {
 int path_is_temporary_fs(const char *path) {
         _cleanup_close_ int fd = -1;
 
-        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_PATH);
         if (fd < 0)
                 return -errno;
 
index 10fc4af79fe9c6b165392176f53266175bb93e41..a48dca99e17b2c14c609efe78c5e1a7ee3e3f6c8 100644 (file)
 ***/
 
 #include <fcntl.h>
+#include <linux/magic.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "macro.h"
+#include "missing.h"
 #include "stat-util.h"
 
 static void test_files_same(void) {
@@ -66,10 +68,27 @@ static void test_path_is_os_tree(void) {
         assert_se(path_is_os_tree("/idontexist") == -ENOENT);
 }
 
+static void test_path_check_fstype(void) {
+        assert_se(path_check_fstype("/run", TMPFS_MAGIC) > 0);
+        assert_se(path_check_fstype("/run", BTRFS_SUPER_MAGIC) == 0);
+        assert_se(path_check_fstype("/proc", PROC_SUPER_MAGIC) > 0);
+        assert_se(path_check_fstype("/proc", BTRFS_SUPER_MAGIC) == 0);
+        assert_se(path_check_fstype("/proc", BTRFS_SUPER_MAGIC) == 0);
+        assert_se(path_check_fstype("/i-dont-exist", BTRFS_SUPER_MAGIC) == -ENOENT);
+}
+
+static void test_path_is_temporary_fs(void) {
+        assert_se(path_is_temporary_fs("/run") > 0);
+        assert_se(path_is_temporary_fs("/proc") == 0);
+        assert_se(path_is_temporary_fs("/i-dont-exist") == -ENOENT);
+}
+
 int main(int argc, char *argv[]) {
         test_files_same();
         test_is_symlink();
         test_path_is_os_tree();
+        test_path_check_fstype();
+        test_path_is_temporary_fs();
 
         return 0;
 }