From: Franck Bui Date: Fri, 27 Apr 2018 16:20:38 +0000 (+0200) Subject: fs-util: introduce mkfifoat_atomic() helper X-Git-Tag: v240~864^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4fe3828c587e4324184fbf153606277058dbe33a;p=thirdparty%2Fsystemd.git fs-util: introduce mkfifoat_atomic() helper --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index aca9921de7e..1fbd40ade77 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 754163defd0..b1a366ae491 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);