]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
6a4f4a0f RC |
2 | |
3 | #include <fcntl.h> | |
48d7c648 | 4 | #include <sys/stat.h> |
6a4f4a0f RC |
5 | #include <unistd.h> |
6 | ||
7 | #include "alloc-util.h" | |
48d7c648 | 8 | #include "dirent-util.h" |
48d7c648 | 9 | #include "fs-util.h" |
6a4f4a0f RC |
10 | #include "glob-util.h" |
11 | #include "macro.h" | |
48d7c648 | 12 | #include "rm-rf.h" |
4f7452a8 | 13 | #include "tests.h" |
e4de7287 | 14 | #include "tmpfile-util.h" |
6a4f4a0f | 15 | |
f52faaf9 LB |
16 | TEST(glob_first) { |
17 | char *first, name[] = "/tmp/test-glob_first.XXXXXX"; | |
254d1313 | 18 | int fd = -EBADF; |
f52faaf9 LB |
19 | int r; |
20 | ||
21 | fd = mkostemp_safe(name); | |
22 | assert_se(fd >= 0); | |
23 | close(fd); | |
24 | ||
25 | r = glob_first("/tmp/test-glob_first*", &first); | |
26 | assert_se(r == 1); | |
27 | assert_se(streq(name, first)); | |
28 | first = mfree(first); | |
29 | ||
30 | r = unlink(name); | |
31 | assert_se(r == 0); | |
32 | r = glob_first("/tmp/test-glob_first*", &first); | |
33 | assert_se(r == 0); | |
34 | assert_se(first == NULL); | |
35 | } | |
36 | ||
4f7452a8 | 37 | TEST(glob_exists) { |
6a4f4a0f | 38 | char name[] = "/tmp/test-glob_exists.XXXXXX"; |
254d1313 | 39 | int fd = -EBADF; |
6a4f4a0f RC |
40 | int r; |
41 | ||
646853bd | 42 | fd = mkostemp_safe(name); |
6a4f4a0f RC |
43 | assert_se(fd >= 0); |
44 | close(fd); | |
45 | ||
46 | r = glob_exists("/tmp/test-glob_exists*"); | |
47 | assert_se(r == 1); | |
48 | ||
49 | r = unlink(name); | |
50 | assert_se(r == 0); | |
51 | r = glob_exists("/tmp/test-glob_exists*"); | |
52 | assert_se(r == 0); | |
53 | } | |
54 | ||
46dcfbbd | 55 | static void closedir_wrapper(void* v) { |
1fe10174 ZJS |
56 | (void) closedir(v); |
57 | } | |
58 | ||
4f7452a8 | 59 | TEST(glob_no_dot) { |
48d7c648 ZJS |
60 | char template[] = "/tmp/test-glob-util.XXXXXXX"; |
61 | const char *fn; | |
62 | ||
63 | _cleanup_globfree_ glob_t g = { | |
46dcfbbd | 64 | .gl_closedir = closedir_wrapper, |
48d7c648 ZJS |
65 | .gl_readdir = (struct dirent *(*)(void *)) readdir_no_dot, |
66 | .gl_opendir = (void *(*)(const char *)) opendir, | |
67 | .gl_lstat = lstat, | |
68 | .gl_stat = stat, | |
69 | }; | |
70 | ||
71 | int r; | |
72 | ||
73 | assert_se(mkdtemp(template)); | |
74 | ||
75 | fn = strjoina(template, "/*"); | |
76 | r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g); | |
77 | assert_se(r == GLOB_NOMATCH); | |
78 | ||
79 | fn = strjoina(template, "/.*"); | |
80 | r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g); | |
81 | assert_se(r == GLOB_NOMATCH); | |
82 | ||
83 | (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL); | |
84 | } | |
85 | ||
4f7452a8 | 86 | TEST(safe_glob) { |
48d7c648 ZJS |
87 | char template[] = "/tmp/test-glob-util.XXXXXXX"; |
88 | const char *fn, *fn2, *fname; | |
89 | ||
90 | _cleanup_globfree_ glob_t g = {}; | |
91 | int r; | |
92 | ||
93 | assert_se(mkdtemp(template)); | |
94 | ||
95 | fn = strjoina(template, "/*"); | |
96 | r = safe_glob(fn, 0, &g); | |
97 | assert_se(r == -ENOENT); | |
98 | ||
99 | fn2 = strjoina(template, "/.*"); | |
100 | r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g); | |
101 | assert_se(r == -ENOENT); | |
102 | ||
103 | fname = strjoina(template, "/.foobar"); | |
104 | assert_se(touch(fname) == 0); | |
105 | ||
106 | r = safe_glob(fn, 0, &g); | |
107 | assert_se(r == -ENOENT); | |
108 | ||
109 | r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g); | |
110 | assert_se(r == 0); | |
111 | assert_se(g.gl_pathc == 1); | |
112 | assert_se(streq(g.gl_pathv[0], fname)); | |
113 | assert_se(g.gl_pathv[1] == NULL); | |
114 | ||
115 | (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL); | |
116 | } | |
117 | ||
1e472a6c ZJS |
118 | static void test_glob_non_glob_prefix_one(const char *path, const char *expected) { |
119 | _cleanup_free_ char *t; | |
120 | ||
121 | assert_se(glob_non_glob_prefix(path, &t) == 0); | |
122 | assert_se(streq(t, expected)); | |
123 | } | |
124 | ||
4f7452a8 | 125 | TEST(glob_non_glob) { |
1e472a6c ZJS |
126 | test_glob_non_glob_prefix_one("/tmp/.X11-*", "/tmp/"); |
127 | test_glob_non_glob_prefix_one("/tmp/*", "/tmp/"); | |
128 | test_glob_non_glob_prefix_one("/tmp*", "/"); | |
129 | test_glob_non_glob_prefix_one("/tmp/*/whatever", "/tmp/"); | |
130 | test_glob_non_glob_prefix_one("/tmp/*/whatever?", "/tmp/"); | |
131 | test_glob_non_glob_prefix_one("/?", "/"); | |
132 | ||
133 | char *x; | |
134 | assert_se(glob_non_glob_prefix("?", &x) == -ENOENT); | |
135 | } | |
136 | ||
4f7452a8 | 137 | DEFINE_TEST_MAIN(LOG_INFO); |