Skip to content

Commit

Permalink
Merge pull request #23043 from yuwata/udev-node-use-flock
Browse files Browse the repository at this point in the history
udev-node: use flock() for symlink stack directory
  • Loading branch information
yuwata committed Sep 12, 2022
2 parents 4167e21 + 1055172 commit 75a5a14
Show file tree
Hide file tree
Showing 6 changed files with 274 additions and 296 deletions.
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);
}

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

0 comments on commit 75a5a14

Please sign in to comment.