summaryrefslogtreecommitdiff
path: root/src/libnm-systemd-shared/src/basic/env-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-systemd-shared/src/basic/env-file.c')
-rw-r--r--src/libnm-systemd-shared/src/basic/env-file.c59
1 files changed, 39 insertions, 20 deletions
diff --git a/src/libnm-systemd-shared/src/basic/env-file.c b/src/libnm-systemd-shared/src/basic/env-file.c
index a639990726..db270bedce 100644
--- a/src/libnm-systemd-shared/src/basic/env-file.c
+++ b/src/libnm-systemd-shared/src/basic/env-file.c
@@ -332,8 +332,7 @@ static int parse_env_file_push(
if (streq(key, k)) {
va_end(aq);
- free(*v);
- *v = value;
+ free_and_replace(*v, value);
return 1;
}
@@ -361,6 +360,24 @@ int parse_env_filev(
return r;
}
+#if 0 /* NM_IGNORED */
+int parse_env_file_fdv(int fd, const char *fname, va_list ap) {
+ _cleanup_fclose_ FILE *f = NULL;
+ va_list aq;
+ int r;
+
+ assert(fd >= 0);
+
+ r = fdopen_independent(fd, "re", &f);
+ if (r < 0)
+ return r;
+
+ va_copy(aq, ap);
+ r = parse_env_file_internal(f, fname, parse_env_file_push, &aq);
+ va_end(aq);
+ return r;
+}
+
int parse_env_file_sentinel(
FILE *f,
const char *fname,
@@ -378,31 +395,18 @@ int parse_env_file_sentinel(
return r;
}
-#if 0 /* NM_IGNORED */
int parse_env_file_fd_sentinel(
int fd,
const char *fname, /* only used for logging */
...) {
- _cleanup_close_ int fd_ro = -EBADF;
- _cleanup_fclose_ FILE *f = NULL;
va_list ap;
int r;
assert(fd >= 0);
- fd_ro = fd_reopen(fd, O_CLOEXEC | O_RDONLY);
- if (fd_ro < 0)
- return fd_ro;
-
- f = fdopen(fd_ro, "re");
- if (!f)
- return -errno;
-
- TAKE_FD(fd_ro);
-
va_start(ap, fname);
- r = parse_env_filev(f, fname, ap);
+ r = parse_env_file_fdv(fd, fname, ap);
va_end(ap);
return r;
@@ -488,6 +492,7 @@ int load_env_file_pairs(FILE *f, const char *fname, char ***ret) {
int r;
assert(f || fname);
+ assert(ret);
r = parse_env_file_internal(f, fname, load_env_file_push_pairs, &m);
if (r < 0)
@@ -497,6 +502,19 @@ int load_env_file_pairs(FILE *f, const char *fname, char ***ret) {
return 0;
}
+int load_env_file_pairs_fd(int fd, const char *fname, char ***ret) {
+ _cleanup_fclose_ FILE *f = NULL;
+ int r;
+
+ assert(fd >= 0);
+
+ r = fdopen_independent(fd, "re", &f);
+ if (r < 0)
+ return r;
+
+ return load_env_file_pairs(f, fname, ret);
+}
+
static int merge_env_file_push(
const char *filename, unsigned line,
const char *key, char *value,
@@ -581,14 +599,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;
@@ -599,13 +618,13 @@ 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;
}
#endif /* NM_IGNORED */