summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-09-23 16:17:03 +0900
committerLennart Poettering <lennart@poettering.net>2018-09-24 18:52:53 +0300
commit6c9c51e5e2fcc2bf91d739f6d31ae475e6772af6 (patch)
treeddb14284389c4d9e40128d1e98a2b3380f0c9906
parentbee13f2e491f4aa500a073c7b0f81ab8d75a96c5 (diff)
downloadsystemd-6c9c51e5e2fcc2bf91d739f6d31ae475e6772af6.tar.gz
fs-util: make symlink_idempotent() optionally create relative link
-rw-r--r--src/basic/fs-util.c17
-rw-r--r--src/basic/fs-util.h2
-rw-r--r--src/core/execute.c14
-rw-r--r--src/core/socket.c4
-rw-r--r--src/nspawn/nspawn-cgroup.c4
5 files changed, 23 insertions, 18 deletions
diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c
index 09fcc32e0e..1fa76bda3d 100644
--- a/src/basic/fs-util.c
+++ b/src/basic/fs-util.c
@@ -346,12 +346,27 @@ int touch(const char *path) {
return touch_file(path, false, USEC_INFINITY, UID_INVALID, GID_INVALID, MODE_INVALID);
}
-int symlink_idempotent(const char *from, const char *to) {
+int symlink_idempotent(const char *from, const char *to, bool make_relative) {
+ _cleanup_free_ char *relpath = NULL;
int r;
assert(from);
assert(to);
+ if (make_relative) {
+ _cleanup_free_ char *parent = NULL;
+
+ parent = dirname_malloc(to);
+ if (!parent)
+ return -ENOMEM;
+
+ r = path_make_relative(parent, from, &relpath);
+ if (r < 0)
+ return r;
+
+ from = relpath;
+ }
+
if (symlink(from, to) < 0) {
_cleanup_free_ char *p = NULL;
diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h
index 4b65625861..bc753d5920 100644
--- a/src/basic/fs-util.h
+++ b/src/basic/fs-util.h
@@ -37,7 +37,7 @@ int fd_warn_permissions(const char *path, int fd);
int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode);
int touch(const char *path);
-int symlink_idempotent(const char *from, const char *to);
+int symlink_idempotent(const char *from, const char *to, bool make_relative);
int symlink_atomic(const char *from, const char *to);
int mknod_atomic(const char *path, mode_t mode, dev_t dev);
diff --git a/src/core/execute.c b/src/core/execute.c
index 35dd3898da..77e3ce8bfd 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -2027,7 +2027,7 @@ static int setup_exec_directory(
if (context->dynamic_user &&
!IN_SET(type, EXEC_DIRECTORY_RUNTIME, EXEC_DIRECTORY_CONFIGURATION)) {
- _cleanup_free_ char *private_root = NULL, *relative = NULL, *parent = NULL;
+ _cleanup_free_ char *private_root = NULL;
/* So, here's one extra complication when dealing with DynamicUser=1 units. In that case we
* want to avoid leaving a directory around fully accessible that is owned by a dynamic user
@@ -2092,18 +2092,8 @@ static int setup_exec_directory(
goto fail;
}
- parent = dirname_malloc(p);
- if (!parent) {
- r = -ENOMEM;
- goto fail;
- }
-
- r = path_make_relative(parent, pp, &relative);
- if (r < 0)
- goto fail;
-
/* And link it up from the original place */
- r = symlink_idempotent(relative, p);
+ r = symlink_idempotent(pp, p, true);
if (r < 0)
goto fail;
diff --git a/src/core/socket.c b/src/core/socket.c
index 8775bc8a58..aac80f3548 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1313,7 +1313,7 @@ static int socket_symlink(Socket *s) {
STRV_FOREACH(i, s->symlinks) {
(void) mkdir_parents_label(*i, s->directory_mode);
- r = symlink_idempotent(p, *i);
+ r = symlink_idempotent(p, *i, false);
if (r == -EEXIST && s->remove_on_stop) {
/* If there's already something where we want to create the symlink, and the destructive
@@ -1321,7 +1321,7 @@ static int socket_symlink(Socket *s) {
* again. */
if (unlink(*i) >= 0)
- r = symlink_idempotent(p, *i);
+ r = symlink_idempotent(p, *i, false);
}
if (r < 0)
diff --git a/src/nspawn/nspawn-cgroup.c b/src/nspawn/nspawn-cgroup.c
index 4a3cd29094..f7ec077f7b 100644
--- a/src/nspawn/nspawn-cgroup.c
+++ b/src/nspawn/nspawn-cgroup.c
@@ -373,7 +373,7 @@ static int mount_legacy_cgns_supported(
if (!target)
return log_oom();
- r = symlink_idempotent(controller, target);
+ r = symlink_idempotent(controller, target, false);
if (r == -EINVAL)
return log_error_errno(r, "Invalid existing symlink for combined hierarchy: %m");
if (r < 0)
@@ -482,7 +482,7 @@ static int mount_legacy_cgns_unsupported(
if (r < 0)
return r;
- r = symlink_idempotent(combined, target);
+ r = symlink_idempotent(combined, target, false);
if (r == -EINVAL)
return log_error_errno(r, "Invalid existing symlink for combined hierarchy: %m");
if (r < 0)