From 3e18762123bc3b8dff78ab8a031214a8a9af1eaa Mon Sep 17 00:00:00 2001 From: Adrian Vovk Date: Fri, 18 Oct 2024 17:57:42 -0400 Subject: [PATCH] fs-util: Introduce symlinkat_idempotent --- src/basic/fs-util.c | 6 +++--- src/basic/fs-util.h | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 9292e567c8..97f36df8e7 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -416,7 +416,7 @@ int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gi return RET_GATHER(ret, r); } -int symlink_idempotent(const char *from, const char *to, bool make_relative) { +int symlinkat_idempotent(const char *from, int atfd, const char *to, bool make_relative) { _cleanup_free_ char *relpath = NULL; int r; @@ -431,13 +431,13 @@ int symlink_idempotent(const char *from, const char *to, bool make_relative) { from = relpath; } - if (symlink(from, to) < 0) { + if (symlinkat(from, atfd, to) < 0) { _cleanup_free_ char *p = NULL; if (errno != EEXIST) return -errno; - r = readlink_malloc(to, &p); + r = readlinkat_malloc(atfd, to, &p); if (r == -EINVAL) /* Not a symlink? In that case return the original error we encountered: -EEXIST */ return -EEXIST; if (r < 0) /* Any other error? In that case propagate it as is */ diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index 702b6010e2..06c95a3b08 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -60,7 +60,10 @@ static inline 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, bool make_relative); +int symlinkat_idempotent(const char *from, int atfd, const char *to, bool make_relative); +static inline int symlink_idempotent(const char *from, const char *to, bool make_relative) { + return symlinkat_idempotent(from, AT_FDCWD, to, make_relative); +} int symlinkat_atomic_full(const char *from, int atfd, const char *to, bool make_relative); static inline int symlink_atomic(const char *from, const char *to) { -- 2.25.1