Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

udev-node: use flock() for symlink stack directory #23043

Merged
merged 10 commits into from
Sep 12, 2022
18 changes: 18 additions & 0 deletions src/basic/path-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,24 @@ int path_make_relative(const char *from, const char *to, char **ret) {
return 0;
}

int path_make_relative_parent(const char *from_child, const char *to, char **ret) {
_cleanup_free_ char *from = NULL;
int r;

assert(from_child);
assert(to);
assert(ret);

/* Similar to path_make_relative(), but provides the relative path from the parent directory of
* 'from_child'. This may be useful when creating relative symlink. */

r = path_extract_directory(from_child, &from);
if (r < 0)
return r;

return path_make_relative(from, to, ret);
}

yuwata marked this conversation as resolved.
Show resolved Hide resolved
char* path_startswith_strv(const char *p, char **set) {
STRV_FOREACH(s, set) {
char *t;
Expand Down
1 change: 1 addition & 0 deletions src/basic/path-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ 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_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_;
static inline char* path_startswith(const char *path, const char *prefix) {
return path_startswith_full(path, prefix, true);
Expand Down
27 changes: 27 additions & 0 deletions src/test/test-path-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,33 @@ TEST(path_make_relative) {
test_path_make_relative_one("//extra.//.//./.slashes//./won't////fo.ol///anybody//", "/././/extra././/.slashes////ar.e/.just/././.fine///", "../../../ar.e/.just/.fine");
}

static void test_path_make_relative_parent_one(const char *from, const char *to, const char *expected) {
_cleanup_free_ char *z = NULL;
int r;

log_info("/* %s(%s, %s) */", __func__, from, to);

r = path_make_relative_parent(from, to, &z);
assert_se((r >= 0) == !!expected);
assert_se(streq_ptr(z, expected));
}

TEST(path_make_relative_parent) {
test_path_make_relative_parent_one("some/relative/path/hoge", "/some/path", NULL);
test_path_make_relative_parent_one("/some/path/hoge", "some/relative/path", NULL);
test_path_make_relative_parent_one("/some/dotdot/../path/hoge", "/some/path", NULL);
test_path_make_relative_parent_one("/", "/aaa", NULL);

test_path_make_relative_parent_one("/hoge", "/", ".");
test_path_make_relative_parent_one("/hoge", "/some/path", "some/path");
test_path_make_relative_parent_one("/some/path/hoge", "/some/path", ".");
test_path_make_relative_parent_one("/some/path/hoge", "/some/path/in/subdir", "in/subdir");
test_path_make_relative_parent_one("/some/path/hoge", "/", "../..");
test_path_make_relative_parent_one("/some/path/hoge", "/some/other/path", "../other/path");
test_path_make_relative_parent_one("/some/path/./dot/hoge", "/some/further/path", "../../further/path");
test_path_make_relative_parent_one("//extra.//.//./.slashes//./won't////fo.ol///anybody//hoge", "/././/extra././/.slashes////ar.e/.just/././.fine///", "../../../ar.e/.just/.fine");
}

TEST(path_strv_resolve) {
char tmp_dir[] = "/tmp/test-path-util-XXXXXX";
_cleanup_strv_free_ char **search_dirs = NULL;
Expand Down