These new functions optionally create symlink of relative path.
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;
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);
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);
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)
}
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);