]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fs-util: add mknodat_atomic()
authorLennart Poettering <lennart@poettering.net>
Fri, 16 Sep 2022 11:45:02 +0000 (12:45 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 23 Sep 2022 07:25:33 +0000 (09:25 +0200)
src/basic/fs-util.c
src/basic/fs-util.h

index 927bb418af47611335eca0f5c89e17f8cbf7ad49..6b757bd5705b182343ec357e18a4ed42feb090fe 100644 (file)
@@ -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;
index efa1090d2b68b5ff6ea1c39812a07f80e4246c45..c4dffc48f3bcc0b41b7f99ecc771307fad2e45e6 100644 (file)
@@ -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);