diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/chase.c | 31 | ||||
-rw-r--r-- | src/basic/chase.h | 2 | ||||
-rw-r--r-- | src/basic/os-util.c | 4 | ||||
-rw-r--r-- | src/basic/path-util.c | 28 | ||||
-rw-r--r-- | src/basic/path-util.h | 1 | ||||
-rw-r--r-- | src/shared/find-esp.c | 4 | ||||
-rw-r--r-- | src/test/test-chase.c | 37 | ||||
-rw-r--r-- | src/test/test-path-util.c | 39 |
8 files changed, 74 insertions, 72 deletions
diff --git a/src/basic/chase.c b/src/basic/chase.c index 96b59e7845..373252b645 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -583,6 +583,37 @@ int chase(const char *path, const char *root, ChaseFlags flags, char **ret_path, return r; } +int chaseat_prefix_root(const char *path, const char *root, char **ret) { + char *q; + int r; + + assert(path); + assert(ret); + + /* This is mostly for prefixing the result of chaseat(). */ + + if (!path_is_absolute(path)) { + _cleanup_free_ char *root_abs = NULL; + + /* If the dir_fd points to the root directory, chaseat() always returns an absolute path. */ + assert(!empty_or_root(root)); + + r = path_make_absolute_cwd(root, &root_abs); + if (r < 0) + return r; + + root = path_simplify(root_abs); + + q = path_join(root, path + (path[0] == '.' && IN_SET(path[1], '/', '\0'))); + } else + q = strdup(path); + if (!q) + return -ENOMEM; + + *ret = q; + return 0; +} + int chase_and_open(const char *path, const char *root, ChaseFlags chase_flags, int open_flags, char **ret_path) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL, *fname = NULL; diff --git a/src/basic/chase.h b/src/basic/chase.h index 40121f7d70..f37e836822 100644 --- a/src/basic/chase.h +++ b/src/basic/chase.h @@ -42,6 +42,8 @@ bool unsafe_transition(const struct stat *a, const struct stat *b); int chase(const char *path_with_prefix, const char *root, ChaseFlags chase_flags, char **ret_path, int *ret_fd); +int chaseat_prefix_root(const char *path, const char *root, char **ret); + int chase_and_open(const char *path, const char *root, ChaseFlags chase_flags, int open_flags, char **ret_path); int chase_and_opendir(const char *path, const char *root, ChaseFlags chase_flags, char **ret_path, DIR **ret_dir); int chase_and_stat(const char *path, const char *root, ChaseFlags chase_flags, char **ret_path, struct stat *ret_stat); diff --git a/src/basic/os-util.c b/src/basic/os-util.c index dd8faf2376..5d06e20871 100644 --- a/src/basic/os-util.c +++ b/src/basic/os-util.c @@ -155,7 +155,7 @@ int open_os_release(const char *root, char **ret_path, int *ret_fd) { return r; if (ret_path) { - r = path_prefix_root_cwd(p, root, ret_path); + r = chaseat_prefix_root(p, root, ret_path); if (r < 0) return r; } @@ -292,7 +292,7 @@ int open_extension_release( return r; if (ret_path) { - r = path_prefix_root_cwd(p, root, ret_path); + r = chaseat_prefix_root(p, root, ret_path); if (r < 0) return r; } diff --git a/src/basic/path-util.c b/src/basic/path-util.c index fa2e26789f..0b0f0da760 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -100,34 +100,6 @@ int path_make_absolute_cwd(const char *p, char **ret) { return 0; } -int path_prefix_root_cwd(const char *p, const char *root, char **ret) { - _cleanup_free_ char *root_abs = NULL; - char *c; - int r; - - assert(p); - assert(ret); - - /* Unlike path_make_absolute(), this always prefixes root path if specified. - * The root path is always simplified, but the provided path will not. - * This is useful for prefixing the result of chaseat(). */ - - if (empty_or_root(root)) - return path_make_absolute_cwd(p, ret); - - r = path_make_absolute_cwd(root, &root_abs); - if (r < 0) - return r; - - path_simplify(root_abs); - c = path_join(root_abs, p); - if (!c) - return -ENOMEM; - - *ret = c; - return 0; -} - int path_make_relative(const char *from, const char *to, char **ret) { _cleanup_free_ char *result = NULL; unsigned n_parents; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index a0af9de674..7843599816 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -60,7 +60,6 @@ int path_split_and_make_absolute(const char *p, char ***ret); char* path_make_absolute(const char *p, const char *prefix); int safe_getcwd(char **ret); int path_make_absolute_cwd(const char *p, char **ret); -int path_prefix_root_cwd(const char *p, const char *root, char **ret); int path_make_relative(const char *from, const char *to, char **ret); int path_make_relative_parent(const char *from_child, const char *to, char **ret); char *path_startswith_full(const char *path, const char *prefix, bool accept_dot_dot) _pure_; diff --git a/src/shared/find-esp.c b/src/shared/find-esp.c index 6a0002a2bd..c4cf508517 100644 --- a/src/shared/find-esp.c +++ b/src/shared/find-esp.c @@ -540,7 +540,7 @@ int find_esp_and_warn( return r; if (ret_path) { - r = path_prefix_root_cwd(p, root, ret_path); + r = chaseat_prefix_root(p, root, ret_path); if (r < 0) return r; } @@ -859,7 +859,7 @@ int find_xbootldr_and_warn( return r; if (ret_path) { - r = path_prefix_root_cwd(p, root, ret_path); + r = chaseat_prefix_root(p, root, ret_path); if (r < 0) return r; } diff --git a/src/test/test-chase.c b/src/test/test-chase.c index c5fc08ca25..558f4109e3 100644 --- a/src/test/test-chase.c +++ b/src/test/test-chase.c @@ -648,4 +648,41 @@ static int intro(void) { return EXIT_SUCCESS; } +TEST(chaseat_prefix_root) { + _cleanup_free_ char *cwd = NULL, *ret = NULL, *expected = NULL; + + assert_se(safe_getcwd(&cwd) >= 0); + + assert_se(chaseat_prefix_root("/hoge", NULL, &ret) >= 0); + assert_se(streq(ret, "/hoge")); + + ret = mfree(ret); + + assert_se(chaseat_prefix_root("/hoge", "a/b/c", &ret) >= 0); + assert_se(streq(ret, "/hoge")); + + ret = mfree(ret); + + assert_se(chaseat_prefix_root("hoge", "/a/b//./c///", &ret) >= 0); + assert_se(streq(ret, "/a/b/c/hoge")); + + ret = mfree(ret); + + assert_se(chaseat_prefix_root("hoge", "a/b//./c///", &ret) >= 0); + assert_se(expected = path_join(cwd, "a/b/c/hoge")); + assert_se(streq(ret, expected)); + + ret = mfree(ret); + expected = mfree(expected); + + assert_se(chaseat_prefix_root("./hoge/aaa/../././b", "/a/b//./c///", &ret) >= 0); + assert_se(streq(ret, "/a/b/c/hoge/aaa/../././b")); + + ret = mfree(ret); + + assert_se(chaseat_prefix_root("./hoge/aaa/../././b", "a/b//./c///", &ret) >= 0); + assert_se(expected = path_join(cwd, "a/b/c/hoge/aaa/../././b")); + assert_se(streq(ret, expected)); +} + DEFINE_TEST_MAIN_WITH_INTRO(LOG_INFO, intro); diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index 22e8f3481a..e40ffea4d5 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -494,45 +494,6 @@ TEST(fsck_exists) { assert_se(fsck_exists_for_fstype("/../bin/") == 0); } -TEST(path_prefix_root_cwd) { - _cleanup_free_ char *cwd = NULL, *ret = NULL, *expected = NULL; - - assert_se(safe_getcwd(&cwd) >= 0); - - assert_se(path_prefix_root_cwd("hoge", NULL, &ret) >= 0); - assert_se(expected = path_join(cwd, "hoge")); - assert_se(streq(ret, expected)); - - ret = mfree(ret); - expected = mfree(expected); - - assert_se(path_prefix_root_cwd("/hoge", NULL, &ret) >= 0); - assert_se(streq(ret, "/hoge")); - - ret = mfree(ret); - - assert_se(path_prefix_root_cwd("hoge", "/a/b//./c///", &ret) >= 0); - assert_se(streq(ret, "/a/b/c/hoge")); - - ret = mfree(ret); - - assert_se(path_prefix_root_cwd("hoge", "a/b//./c///", &ret) >= 0); - assert_se(expected = path_join(cwd, "a/b/c/hoge")); - assert_se(streq(ret, expected)); - - ret = mfree(ret); - expected = mfree(expected); - - assert_se(path_prefix_root_cwd("/../hoge/aaa/../././b", "/a/b//./c///", &ret) >= 0); - assert_se(streq(ret, "/a/b/c/../hoge/aaa/../././b")); - - ret = mfree(ret); - - assert_se(path_prefix_root_cwd("/../hoge/aaa/../././b", "a/b//./c///", &ret) >= 0); - assert_se(expected = path_join(cwd, "a/b/c/../hoge/aaa/../././b")); - assert_se(streq(ret, expected)); -} - static void test_path_make_relative_one(const char *from, const char *to, const char *expected) { _cleanup_free_ char *z = NULL; int r; |