mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
chase: replace path_prefix_root_cwd() with chaseat_prefix_root()
The function path_prefix_root_cwd() was introduced for prefixing the result from chaseat() with root, but - it is named slightly generic, - the logic is different from what chase() does. This makes the name more explanative and specific for the result of the chaseat(), and make the logic consistent with chase(). Fixes https://github.com/systemd/systemd/pull/27199#issuecomment-1511387731. Follow-up for #27199.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user