chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
escape: beef up new systemd-escape tool
[elogind.git]
/
src
/
shared
/
fileio.c
diff --git
a/src/shared/fileio.c
b/src/shared/fileio.c
index fb1c1bcf9f8c05ba245bddb30e28d4c83922f5fc..b0ab780d771b63e076cb8dabc159b95c55582bb6 100644
(file)
--- a/
src/shared/fileio.c
+++ b/
src/shared/fileio.c
@@
-738,7
+738,7
@@
static void write_env_var(FILE *f, const char *v) {
p++;
fwrite(v, 1, p-v, f);
p++;
fwrite(v, 1, p-v, f);
- if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
+ if (string_has_cc(p
, NULL
) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
fputc('\"', f);
for (; *p; p++) {
fputc('\"', f);
for (; *p; p++) {
@@
-756,35
+756,31
@@
static void write_env_var(FILE *f, const char *v) {
}
int write_env_file(const char *fname, char **l) {
}
int write_env_file(const char *fname, char **l) {
- char **i;
- _cleanup_free_ char *p = NULL;
_cleanup_fclose_ FILE *f = NULL;
_cleanup_fclose_ FILE *f = NULL;
+ _cleanup_free_ char *p = NULL;
+ char **i;
int r;
int r;
+ assert(fname);
+
r = fopen_temporary(fname, &f, &p);
if (r < 0)
return r;
fchmod_umask(fileno(f), 0644);
r = fopen_temporary(fname, &f, &p);
if (r < 0)
return r;
fchmod_umask(fileno(f), 0644);
- errno = 0;
STRV_FOREACH(i, l)
write_env_var(f, *i);
STRV_FOREACH(i, l)
write_env_var(f, *i);
- fflush(f);
+ r = fflush_and_check(f);
+ if (r >= 0) {
+ if (rename(p, fname) >= 0)
+ return 0;
- if (ferror(f))
- r = errno ? -errno : -EIO;
- else {
- if (rename(p, fname) < 0)
- r = -errno;
- else
- r = 0;
+ r = -errno;
}
}
- if (r < 0)
- unlink(p);
-
+ unlink(p);
return r;
}
return r;
}