From: Yu Watanabe Date: Mon, 12 Sep 2022 18:30:34 +0000 (+0900) Subject: fs-util,label: introduce symlink_atomic_full() and symlink_atomic_full_label() X-Git-Tag: v252-rc1~147^2~1 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=590d81002bbce1a1bcce21056d12873fb96ee3a9;p=systemd%2F.git fs-util,label: introduce symlink_atomic_full() and symlink_atomic_full_label() These new functions optionally create symlink of relative path. --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index a0898bf4f5..cbab59b777 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -432,13 +432,21 @@ int symlink_idempotent(const char *from, const char *to, bool make_relative) { return 0; } -int symlink_atomic(const char *from, const char *to) { - _cleanup_free_ char *t = NULL; +int symlink_atomic_full(const char *from, const char *to, bool make_relative) { + _cleanup_free_ char *relpath = NULL, *t = NULL; int r; assert(from); assert(to); + if (make_relative) { + r = path_make_relative_parent(to, from, &relpath); + if (r < 0) + return r; + + from = relpath; + } + r = tempfn_random(to, NULL, &t); if (r < 0) return r; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index 080959d3b9..f2174af15d 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -58,7 +58,10 @@ static inline int touch(const char *path) { int symlink_idempotent(const char *from, const char *to, bool make_relative); -int symlink_atomic(const char *from, const char *to); +int symlink_atomic_full(const char *from, const char *to, bool make_relative); +static inline int symlink_atomic(const char *from, const char *to) { + return symlink_atomic_full(from, to, false); +} int mknod_atomic(const char *path, mode_t mode, dev_t dev); int mkfifo_atomic(const char *path, mode_t mode); int mkfifoat_atomic(int dir_fd, const char *path, mode_t mode); diff --git a/src/shared/label.c b/src/shared/label.c index dde93e1dde..d00158a258 100644 --- a/src/shared/label.c +++ b/src/shared/label.c @@ -61,7 +61,7 @@ int symlink_label(const char *old_path, const char *new_path) { return mac_smack_fix(new_path, 0); } -int symlink_atomic_label(const char *from, const char *to) { +int symlink_atomic_full_label(const char *from, const char *to, bool make_relative) { int r; assert(from); @@ -71,7 +71,7 @@ int symlink_atomic_label(const char *from, const char *to) { if (r < 0) return r; - r = symlink_atomic(from, to); + r = symlink_atomic_full(from, to, make_relative); mac_selinux_create_file_clear(); if (r < 0) diff --git a/src/shared/label.h b/src/shared/label.h index 88aa47b7b8..2f899e2bdd 100644 --- a/src/shared/label.h +++ b/src/shared/label.h @@ -17,7 +17,10 @@ static inline int label_fix(const char *path, LabelFixFlags flags) { } int symlink_label(const char *old_path, const char *new_path); -int symlink_atomic_label(const char *from, const char *to); +int symlink_atomic_full_label(const char *from, const char *to, bool make_relative); +static inline int symlink_atomic_label(const char *from, const char *to) { + return symlink_atomic_full_label(from, to, false); +} int mknod_label(const char *pathname, mode_t mode, dev_t dev); int btrfs_subvol_make_label(const char *path);