]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-file: Add write_env_file_at()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 22 Dec 2022 13:26:29 +0000 (14:26 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 20 Feb 2023 11:43:31 +0000 (12:43 +0100)
src/basic/env-file.c
src/basic/env-file.h

index 45b0d901c54bb2579e8b2730c7bcf82620f0e6ea..16de727c09cd855e3a49adec4509e8e469dbbec9 100644 (file)
@@ -578,14 +578,15 @@ static void write_env_var(FILE *f, const char *v) {
         fputc_unlocked('\n', f);
 }
 
-int write_env_file(const char *fname, char **l) {
+int write_env_file_at(int dir_fd, const char *fname, char **l) {
         _cleanup_fclose_ FILE *f = NULL;
         _cleanup_free_ char *p = NULL;
         int r;
 
+        assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
         assert(fname);
 
-        r = fopen_temporary(fname, &f, &p);
+        r = fopen_temporary_at(dir_fd, fname, &f, &p);
         if (r < 0)
                 return r;
 
@@ -596,12 +597,12 @@ int write_env_file(const char *fname, char **l) {
 
         r = fflush_and_check(f);
         if (r >= 0) {
-                if (rename(p, fname) >= 0)
+                if (renameat(dir_fd, p, dir_fd, fname) >= 0)
                         return 0;
 
                 r = -errno;
         }
 
-        (void) unlink(p);
+        (void) unlinkat(dir_fd, p, 0);
         return r;
 }
index 2448d943cd4e38368bef63f0eba648ca234e8852..dc38b7a5c9b8a7d1592a02671d2049845c838ec5 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include <fcntl.h>
 #include <stdarg.h>
 #include <stdio.h>
 
@@ -16,4 +17,7 @@ int load_env_file_pairs(FILE *f, const char *fname, char ***ret);
 
 int merge_env_file(char ***env, FILE *f, const char *fname);
 
-int write_env_file(const char *fname, char **l);
+int write_env_file_at(int dir_fd, const char *fname, char **l);
+static inline int write_env_file(const char *fname, char **l) {
+        return write_env_file_at(AT_FDCWD, fname, l);
+}