From: Lennart Poettering Date: Fri, 16 Sep 2022 11:45:02 +0000 (+0100) Subject: fs-util: add mknodat_atomic() X-Git-Tag: v252-rc1~100^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=497ca785aa9bb241873cbcfd8c0a6cb12dcacbf9;p=thirdparty%2Fsystemd.git fs-util: add mknodat_atomic() --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 927bb418af4..6b757bd5705 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -463,7 +463,7 @@ int symlinkat_atomic_full(const char *from, int atfd, const char *to, bool make_ return 0; } -int mknod_atomic(const char *path, mode_t mode, dev_t dev) { +int mknodat_atomic(int atfd, const char *path, mode_t mode, dev_t dev) { _cleanup_free_ char *t = NULL; int r; @@ -473,12 +473,13 @@ int mknod_atomic(const char *path, mode_t mode, dev_t dev) { if (r < 0) return r; - if (mknod(t, mode, dev) < 0) + if (mknodat(atfd, t, mode, dev) < 0) return -errno; - if (rename(t, path) < 0) { - unlink_noerrno(t); - return -errno; + r = RET_NERRNO(renameat(atfd, t, atfd, path)); + if (r < 0) { + (void) unlinkat(atfd, t, 0); + return r; } return 0; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index efa1090d2b6..c4dffc48f3b 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -62,7 +62,12 @@ int symlinkat_atomic_full(const char *from, int atfd, const char *to, bool make_ static inline int symlink_atomic(const char *from, const char *to) { return symlinkat_atomic_full(from, AT_FDCWD, to, false); } -int mknod_atomic(const char *path, mode_t mode, dev_t dev); + +int mknodat_atomic(int atfd, const char *path, mode_t mode, dev_t dev); +static inline int mknod_atomic(const char *path, mode_t mode, dev_t dev) { + return mknodat_atomic(AT_FDCWD, path, mode, dev); +} + int mkfifoat_atomic(int dir_fd, const char *path, mode_t mode); static inline int mkfifo_atomic(const char *path, mode_t mode) { return mkfifoat_atomic(AT_FDCWD, path, mode);