X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=9b67dd8296fde6fab7ae3b862bf7ce63fc21e015;hp=b885a46e439fb3a5a197007b4ff90690fa0c074e;hb=f0b159f2e7b4ac8a75997834d240459f5436d36e;hpb=15658a4bc930a9b4b9511256431c2e2383dad0f5 diff --git a/src/shared/util.c b/src/shared/util.c index b885a46e4..9b67dd829 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -2766,6 +2766,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;