test-mount-util: move test_path_is_mount_point here
path-util.c and mount-util.c are intertwined, but path_is_mount_point() is defined in mount-util.c. No functional difference.
This commit is contained in:
parent
9d4f242a53
commit
ee3467c6bd
|
@ -26,8 +26,10 @@
|
|||
#include "fileio.h"
|
||||
#include "hashmap.h"
|
||||
#include "log.h"
|
||||
#include "log.h"
|
||||
#include "mount-util.h"
|
||||
#include "path-util.h"
|
||||
#include "rm-rf.h"
|
||||
#include "string-util.h"
|
||||
|
||||
static void test_mount_propagation_flags(const char *name, int ret, unsigned long expected) {
|
||||
|
@ -100,6 +102,143 @@ static void test_mnt_id(void) {
|
|||
hashmap_free_free(h);
|
||||
}
|
||||
|
||||
static void test_path_is_mount_point(void) {
|
||||
int fd;
|
||||
char tmp_dir[] = "/tmp/test-path-is-mount-point-XXXXXX";
|
||||
_cleanup_free_ char *file1 = NULL, *file2 = NULL, *link1 = NULL, *link2 = NULL;
|
||||
_cleanup_free_ char *dir1 = NULL, *dir1file = NULL, *dirlink1 = NULL, *dirlink1file = NULL;
|
||||
_cleanup_free_ char *dir2 = NULL, *dir2file = NULL;
|
||||
|
||||
assert_se(path_is_mount_point("/", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/", NULL, 0) > 0);
|
||||
|
||||
assert_se(path_is_mount_point("/proc", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/proc", NULL, 0) > 0);
|
||||
|
||||
assert_se(path_is_mount_point("/proc/1", NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point("/proc/1", NULL, 0) == 0);
|
||||
|
||||
assert_se(path_is_mount_point("/sys", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/sys", NULL, 0) > 0);
|
||||
|
||||
/* we'll create a hierarchy of different kinds of dir/file/link
|
||||
* layouts:
|
||||
*
|
||||
* <tmp>/file1, <tmp>/file2
|
||||
* <tmp>/link1 -> file1, <tmp>/link2 -> file2
|
||||
* <tmp>/dir1/
|
||||
* <tmp>/dir1/file
|
||||
* <tmp>/dirlink1 -> dir1
|
||||
* <tmp>/dirlink1file -> dirlink1/file
|
||||
* <tmp>/dir2/
|
||||
* <tmp>/dir2/file
|
||||
*/
|
||||
|
||||
/* file mountpoints */
|
||||
assert_se(mkdtemp(tmp_dir) != NULL);
|
||||
file1 = path_join(NULL, tmp_dir, "file1");
|
||||
assert_se(file1);
|
||||
file2 = path_join(NULL, tmp_dir, "file2");
|
||||
assert_se(file2);
|
||||
fd = open(file1, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
fd = open(file2, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
link1 = path_join(NULL, tmp_dir, "link1");
|
||||
assert_se(link1);
|
||||
assert_se(symlink("file1", link1) == 0);
|
||||
link2 = path_join(NULL, tmp_dir, "link2");
|
||||
assert_se(link1);
|
||||
assert_se(symlink("file2", link2) == 0);
|
||||
|
||||
assert_se(path_is_mount_point(file1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(file1, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(link1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(link1, NULL, 0) == 0);
|
||||
|
||||
/* directory mountpoints */
|
||||
dir1 = path_join(NULL, tmp_dir, "dir1");
|
||||
assert_se(dir1);
|
||||
assert_se(mkdir(dir1, 0755) == 0);
|
||||
dirlink1 = path_join(NULL, tmp_dir, "dirlink1");
|
||||
assert_se(dirlink1);
|
||||
assert_se(symlink("dir1", dirlink1) == 0);
|
||||
dirlink1file = path_join(NULL, tmp_dir, "dirlink1file");
|
||||
assert_se(dirlink1file);
|
||||
assert_se(symlink("dirlink1/file", dirlink1file) == 0);
|
||||
dir2 = path_join(NULL, tmp_dir, "dir2");
|
||||
assert_se(dir2);
|
||||
assert_se(mkdir(dir2, 0755) == 0);
|
||||
|
||||
assert_se(path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dir1, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1, NULL, 0) == 0);
|
||||
|
||||
/* file in subdirectory mountpoints */
|
||||
dir1file = path_join(NULL, dir1, "file");
|
||||
assert_se(dir1file);
|
||||
fd = open(dir1file, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
|
||||
assert_se(path_is_mount_point(dir1file, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dir1file, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1file, NULL, 0) == 0);
|
||||
|
||||
/* these tests will only work as root */
|
||||
if (mount(file1, file2, NULL, MS_BIND, NULL) >= 0) {
|
||||
int rt, rf, rlt, rlf, rl1t, rl1f;
|
||||
|
||||
/* files */
|
||||
/* capture results in vars, to avoid dangling mounts on failure */
|
||||
rf = path_is_mount_point(file2, NULL, 0);
|
||||
rt = path_is_mount_point(file2, NULL, AT_SYMLINK_FOLLOW);
|
||||
rlf = path_is_mount_point(link2, NULL, 0);
|
||||
rlt = path_is_mount_point(link2, NULL, AT_SYMLINK_FOLLOW);
|
||||
|
||||
assert_se(umount(file2) == 0);
|
||||
|
||||
assert_se(rf == 1);
|
||||
assert_se(rt == 1);
|
||||
assert_se(rlf == 0);
|
||||
assert_se(rlt == 1);
|
||||
|
||||
/* dirs */
|
||||
dir2file = path_join(NULL, dir2, "file");
|
||||
assert_se(dir2file);
|
||||
fd = open(dir2file, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
|
||||
assert_se(mount(dir2, dir1, NULL, MS_BIND, NULL) >= 0);
|
||||
|
||||
rf = path_is_mount_point(dir1, NULL, 0);
|
||||
rt = path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW);
|
||||
rlf = path_is_mount_point(dirlink1, NULL, 0);
|
||||
rlt = path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW);
|
||||
/* its parent is a mount point, but not /file itself */
|
||||
rl1f = path_is_mount_point(dirlink1file, NULL, 0);
|
||||
rl1t = path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW);
|
||||
|
||||
assert_se(umount(dir1) == 0);
|
||||
|
||||
assert_se(rf == 1);
|
||||
assert_se(rt == 1);
|
||||
assert_se(rlf == 0);
|
||||
assert_se(rlt == 1);
|
||||
assert_se(rl1f == 0);
|
||||
assert_se(rl1t == 0);
|
||||
|
||||
} else
|
||||
printf("Skipping bind mount file test: %m\n");
|
||||
|
||||
assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
log_set_max_level(LOG_DEBUG);
|
||||
|
@ -113,6 +252,7 @@ int main(int argc, char *argv[]) {
|
|||
test_mount_propagation_flags(" ", -EINVAL, 0);
|
||||
|
||||
test_mnt_id();
|
||||
test_path_is_mount_point();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/mount.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
|
@ -376,143 +375,6 @@ static void test_prefix_root(void) {
|
|||
test_prefix_root_one("/foo///", "//bar", "/foo/bar");
|
||||
}
|
||||
|
||||
static void test_path_is_mount_point(void) {
|
||||
int fd;
|
||||
char tmp_dir[] = "/tmp/test-path-is-mount-point-XXXXXX";
|
||||
_cleanup_free_ char *file1 = NULL, *file2 = NULL, *link1 = NULL, *link2 = NULL;
|
||||
_cleanup_free_ char *dir1 = NULL, *dir1file = NULL, *dirlink1 = NULL, *dirlink1file = NULL;
|
||||
_cleanup_free_ char *dir2 = NULL, *dir2file = NULL;
|
||||
|
||||
assert_se(path_is_mount_point("/", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/", NULL, 0) > 0);
|
||||
|
||||
assert_se(path_is_mount_point("/proc", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/proc", NULL, 0) > 0);
|
||||
|
||||
assert_se(path_is_mount_point("/proc/1", NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point("/proc/1", NULL, 0) == 0);
|
||||
|
||||
assert_se(path_is_mount_point("/sys", NULL, AT_SYMLINK_FOLLOW) > 0);
|
||||
assert_se(path_is_mount_point("/sys", NULL, 0) > 0);
|
||||
|
||||
/* we'll create a hierarchy of different kinds of dir/file/link
|
||||
* layouts:
|
||||
*
|
||||
* <tmp>/file1, <tmp>/file2
|
||||
* <tmp>/link1 -> file1, <tmp>/link2 -> file2
|
||||
* <tmp>/dir1/
|
||||
* <tmp>/dir1/file
|
||||
* <tmp>/dirlink1 -> dir1
|
||||
* <tmp>/dirlink1file -> dirlink1/file
|
||||
* <tmp>/dir2/
|
||||
* <tmp>/dir2/file
|
||||
*/
|
||||
|
||||
/* file mountpoints */
|
||||
assert_se(mkdtemp(tmp_dir) != NULL);
|
||||
file1 = path_join(NULL, tmp_dir, "file1");
|
||||
assert_se(file1);
|
||||
file2 = path_join(NULL, tmp_dir, "file2");
|
||||
assert_se(file2);
|
||||
fd = open(file1, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
fd = open(file2, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
link1 = path_join(NULL, tmp_dir, "link1");
|
||||
assert_se(link1);
|
||||
assert_se(symlink("file1", link1) == 0);
|
||||
link2 = path_join(NULL, tmp_dir, "link2");
|
||||
assert_se(link1);
|
||||
assert_se(symlink("file2", link2) == 0);
|
||||
|
||||
assert_se(path_is_mount_point(file1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(file1, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(link1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(link1, NULL, 0) == 0);
|
||||
|
||||
/* directory mountpoints */
|
||||
dir1 = path_join(NULL, tmp_dir, "dir1");
|
||||
assert_se(dir1);
|
||||
assert_se(mkdir(dir1, 0755) == 0);
|
||||
dirlink1 = path_join(NULL, tmp_dir, "dirlink1");
|
||||
assert_se(dirlink1);
|
||||
assert_se(symlink("dir1", dirlink1) == 0);
|
||||
dirlink1file = path_join(NULL, tmp_dir, "dirlink1file");
|
||||
assert_se(dirlink1file);
|
||||
assert_se(symlink("dirlink1/file", dirlink1file) == 0);
|
||||
dir2 = path_join(NULL, tmp_dir, "dir2");
|
||||
assert_se(dir2);
|
||||
assert_se(mkdir(dir2, 0755) == 0);
|
||||
|
||||
assert_se(path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dir1, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1, NULL, 0) == 0);
|
||||
|
||||
/* file in subdirectory mountpoints */
|
||||
dir1file = path_join(NULL, dir1, "file");
|
||||
assert_se(dir1file);
|
||||
fd = open(dir1file, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
|
||||
assert_se(path_is_mount_point(dir1file, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dir1file, NULL, 0) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW) == 0);
|
||||
assert_se(path_is_mount_point(dirlink1file, NULL, 0) == 0);
|
||||
|
||||
/* these tests will only work as root */
|
||||
if (mount(file1, file2, NULL, MS_BIND, NULL) >= 0) {
|
||||
int rt, rf, rlt, rlf, rl1t, rl1f;
|
||||
|
||||
/* files */
|
||||
/* capture results in vars, to avoid dangling mounts on failure */
|
||||
rf = path_is_mount_point(file2, NULL, 0);
|
||||
rt = path_is_mount_point(file2, NULL, AT_SYMLINK_FOLLOW);
|
||||
rlf = path_is_mount_point(link2, NULL, 0);
|
||||
rlt = path_is_mount_point(link2, NULL, AT_SYMLINK_FOLLOW);
|
||||
|
||||
assert_se(umount(file2) == 0);
|
||||
|
||||
assert_se(rf == 1);
|
||||
assert_se(rt == 1);
|
||||
assert_se(rlf == 0);
|
||||
assert_se(rlt == 1);
|
||||
|
||||
/* dirs */
|
||||
dir2file = path_join(NULL, dir2, "file");
|
||||
assert_se(dir2file);
|
||||
fd = open(dir2file, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
|
||||
assert_se(fd > 0);
|
||||
close(fd);
|
||||
|
||||
assert_se(mount(dir2, dir1, NULL, MS_BIND, NULL) >= 0);
|
||||
|
||||
rf = path_is_mount_point(dir1, NULL, 0);
|
||||
rt = path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW);
|
||||
rlf = path_is_mount_point(dirlink1, NULL, 0);
|
||||
rlt = path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW);
|
||||
/* its parent is a mount point, but not /file itself */
|
||||
rl1f = path_is_mount_point(dirlink1file, NULL, 0);
|
||||
rl1t = path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW);
|
||||
|
||||
assert_se(umount(dir1) == 0);
|
||||
|
||||
assert_se(rf == 1);
|
||||
assert_se(rt == 1);
|
||||
assert_se(rlf == 0);
|
||||
assert_se(rlt == 1);
|
||||
assert_se(rl1f == 0);
|
||||
assert_se(rl1t == 0);
|
||||
|
||||
} else
|
||||
printf("Skipping bind mount file test: %m\n");
|
||||
|
||||
assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
|
||||
}
|
||||
|
||||
static void test_file_in_same_dir(void) {
|
||||
char *t;
|
||||
|
||||
|
@ -621,7 +483,6 @@ int main(int argc, char **argv) {
|
|||
test_strv_resolve();
|
||||
test_path_startswith();
|
||||
test_prefix_root();
|
||||
test_path_is_mount_point();
|
||||
test_file_in_same_dir();
|
||||
test_filename_is_valid();
|
||||
test_hidden_or_backup_file();
|
||||
|
|
Loading…
Reference in New Issue