diff --git a/src/basic/env-file.c b/src/basic/env-file.c index 45b0d901c54..16de727c09c 100644 --- a/src/basic/env-file.c +++ b/src/basic/env-file.c @@ -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; } diff --git a/src/basic/env-file.h b/src/basic/env-file.h index 2448d943cd4..dc38b7a5c9b 100644 --- a/src/basic/env-file.h +++ b/src/basic/env-file.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include #include #include @@ -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); +}