]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fs-util,label: introduce symlink_atomic_full() and symlink_atomic_full_label()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 12 Sep 2022 18:30:34 +0000 (03:30 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 13 Sep 2022 21:22:09 +0000 (06:22 +0900)
These new functions optionally create symlink of relative path.

src/basic/fs-util.c
src/basic/fs-util.h
src/shared/label.c
src/shared/label.h

index a0898bf4f5da4e62c02419e6671faefc2c7fdf26..cbab59b777349ba4aa1653c8fca9acfda3048b4f 100644 (file)
@@ -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;
index 080959d3b99b9e221803276ba49bf0cea9518bcb..f2174af15d7f0c47719ac10115e08c16463528d5 100644 (file)
@@ -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);
index dde93e1ddeb27122ed63b1f015fe7ae79c8ac639..d00158a2585e67b285a2c4f28197e8bf811c62a4 100644 (file)
@@ -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)
index 88aa47b7b88730992b5e452da590d2ad78dadb01..2f899e2bddc88ce0a21f0560874dd3eb8171f7b4 100644 (file)
@@ -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);