From 4fe3828c587e4324184fbf153606277058dbe33a Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Fri, 27 Apr 2018 18:20:38 +0200 Subject: [PATCH] fs-util: introduce mkfifoat_atomic() helper --- src/basic/fs-util.c | 25 +++++++++++++++++++++++++ src/basic/fs-util.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index aca9921de7..1fbd40ade7 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -435,6 +435,31 @@ int mkfifo_atomic(const char *path, mode_t mode) { return 0; } +int mkfifoat_atomic(int dirfd, const char *path, mode_t mode) { + _cleanup_free_ char *t = NULL; + int r; + + assert(path); + + if (path_is_absolute(path)) + return mkfifo_atomic(path, mode); + + /* We're only interested in the (random) filename. */ + r = tempfn_random_child("", NULL, &t); + if (r < 0) + return r; + + if (mkfifoat(dirfd, t, mode) < 0) + return -errno; + + if (renameat(dirfd, t, dirfd, path) < 0) { + unlink_noerrno(t); + return -errno; + } + + return 0; +} + int get_files_in_directory(const char *path, char ***list) { _cleanup_closedir_ DIR *d = NULL; struct dirent *de; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index 754163defd..b1a366ae49 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -42,6 +42,7 @@ int symlink_idempotent(const char *from, const char *to); int symlink_atomic(const char *from, const char *to); 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); int get_files_in_directory(const char *path, char ***list);