diff options
author | Iago López Galeiras <iago@endocode.com> | 2015-05-13 15:45:49 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-05-13 16:03:07 +0200 |
commit | 875e1014dd9d55cd0692dcce843598cffb2d09b0 (patch) | |
tree | 56dc288f358172ede7ab92d9b3fab5e409d3cdfd /src/shared/util.c | |
parent | 54b4755f15438c86991d5a4eaadc47150f7e5a84 (diff) |
nspawn: skip symlink to a combined cgroup hierarchy if it already exists
If a symlink to a combined cgroup hierarchy already exists and points to
the right path, skip it. This avoids an error when the cgroups are set
manually before calling nspawn.
Diffstat (limited to 'src/shared/util.c')
-rw-r--r-- | src/shared/util.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 466dce439f..72711e133a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -2765,6 +2765,28 @@ int symlink_atomic(const char *from, const char *to) { return 0; } +int symlink_idempotent(const char *from, const char *to) { + _cleanup_free_ char *p = NULL; + int r; + + assert(from); + assert(to); + + if (symlink(from, to) < 0) { + if (errno != EEXIST) + return -errno; + + r = readlink_malloc(to, &p); + if (r < 0) + return r; + + if (!streq(p, from)) + return -EINVAL; + } + + return 0; +} + int mknod_atomic(const char *path, mode_t mode, dev_t dev) { _cleanup_free_ char *t = NULL; int r; |