]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
f4c13ad7 RC |
2 | |
3 | #include <fcntl.h> | |
436e916e | 4 | #include <linux/magic.h> |
f4c13ad7 RC |
5 | #include <unistd.h> |
6 | ||
7 | #include "alloc-util.h" | |
8 | #include "fd-util.h" | |
9 | #include "fileio.h" | |
10 | #include "macro.h" | |
436e916e | 11 | #include "missing.h" |
049af8ad | 12 | #include "mountpoint-util.h" |
f4c13ad7 RC |
13 | #include "stat-util.h" |
14 | ||
15 | static void test_files_same(void) { | |
16 | _cleanup_close_ int fd = -1; | |
17 | char name[] = "/tmp/test-files_same.XXXXXX"; | |
18 | char name_alias[] = "/tmp/test-files_same.alias"; | |
19 | ||
646853bd | 20 | fd = mkostemp_safe(name); |
f4c13ad7 RC |
21 | assert_se(fd >= 0); |
22 | assert_se(symlink(name, name_alias) >= 0); | |
23 | ||
e3f791a2 ZJS |
24 | assert_se(files_same(name, name, 0)); |
25 | assert_se(files_same(name, name, AT_SYMLINK_NOFOLLOW)); | |
26 | assert_se(files_same(name, name_alias, 0)); | |
27 | assert_se(!files_same(name, name_alias, AT_SYMLINK_NOFOLLOW)); | |
f4c13ad7 RC |
28 | |
29 | unlink(name); | |
30 | unlink(name_alias); | |
31 | } | |
32 | ||
33 | static void test_is_symlink(void) { | |
34 | char name[] = "/tmp/test-is_symlink.XXXXXX"; | |
35 | char name_link[] = "/tmp/test-is_symlink.link"; | |
36 | _cleanup_close_ int fd = -1; | |
37 | ||
646853bd | 38 | fd = mkostemp_safe(name); |
f4c13ad7 RC |
39 | assert_se(fd >= 0); |
40 | assert_se(symlink(name, name_link) >= 0); | |
41 | ||
42 | assert_se(is_symlink(name) == 0); | |
43 | assert_se(is_symlink(name_link) == 1); | |
44 | assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0); | |
45 | ||
f4c13ad7 RC |
46 | unlink(name); |
47 | unlink(name_link); | |
48 | } | |
49 | ||
40fd52f2 | 50 | static void test_path_is_fs_type(void) { |
cc390161 MP |
51 | /* run might not be a mount point in build chroots */ |
52 | if (path_is_mount_point("/run", NULL, AT_SYMLINK_FOLLOW) > 0) { | |
40fd52f2 ZJS |
53 | assert_se(path_is_fs_type("/run", TMPFS_MAGIC) > 0); |
54 | assert_se(path_is_fs_type("/run", BTRFS_SUPER_MAGIC) == 0); | |
cc390161 | 55 | } |
40fd52f2 ZJS |
56 | assert_se(path_is_fs_type("/proc", PROC_SUPER_MAGIC) > 0); |
57 | assert_se(path_is_fs_type("/proc", BTRFS_SUPER_MAGIC) == 0); | |
58 | assert_se(path_is_fs_type("/proc", BTRFS_SUPER_MAGIC) == 0); | |
59 | assert_se(path_is_fs_type("/i-dont-exist", BTRFS_SUPER_MAGIC) == -ENOENT); | |
436e916e LP |
60 | } |
61 | ||
62 | static void test_path_is_temporary_fs(void) { | |
8dfc2f40 MP |
63 | /* run might not be a mount point in build chroots */ |
64 | if (path_is_mount_point("/run", NULL, AT_SYMLINK_FOLLOW) > 0) | |
65 | assert_se(path_is_temporary_fs("/run") > 0); | |
436e916e LP |
66 | assert_se(path_is_temporary_fs("/proc") == 0); |
67 | assert_se(path_is_temporary_fs("/i-dont-exist") == -ENOENT); | |
68 | } | |
69 | ||
6619ad88 LP |
70 | static void test_fd_is_network_ns(void) { |
71 | _cleanup_close_ int fd = -1; | |
72 | assert_se(fd_is_network_ns(STDIN_FILENO) == 0); | |
73 | assert_se(fd_is_network_ns(STDERR_FILENO) == 0); | |
74 | assert_se(fd_is_network_ns(STDOUT_FILENO) == 0); | |
75 | ||
76 | assert_se((fd = open("/proc/self/ns/mnt", O_CLOEXEC|O_RDONLY)) >= 0); | |
77 | assert_se(IN_SET(fd_is_network_ns(fd), 0, -EUCLEAN)); | |
78 | fd = safe_close(fd); | |
79 | ||
80 | assert_se((fd = open("/proc/self/ns/net", O_CLOEXEC|O_RDONLY)) >= 0); | |
81 | assert_se(IN_SET(fd_is_network_ns(fd), 1, -EUCLEAN)); | |
82 | } | |
83 | ||
f4c13ad7 RC |
84 | int main(int argc, char *argv[]) { |
85 | test_files_same(); | |
86 | test_is_symlink(); | |
40fd52f2 | 87 | test_path_is_fs_type(); |
436e916e | 88 | test_path_is_temporary_fs(); |
6619ad88 | 89 | test_fd_is_network_ns(); |
f4c13ad7 RC |
90 | |
91 | return 0; | |
92 | } |