X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Ffileio.c;h=400a416162639e164cabb3a0c08d184a6f3bc585;hb=f10dda3b82dd493eada52bcc52b790a1cc1094e6;hp=96e23c5bbb69c314bdaa65c7ebdef98b81a2780a;hpb=f73141d7657b3f60b8669bc8386413d8a8a372c6;p=elogind.git diff --git a/src/shared/fileio.c b/src/shared/fileio.c index 96e23c5bb..400a41616 100644 --- a/src/shared/fileio.c +++ b/src/shared/fileio.c @@ -35,9 +35,7 @@ int write_string_file(const char *fn, const char *line) { return -errno; errno = 0; - if (fputs(line, f) < 0) - return errno ? -errno : -EIO; - + fputs(line, f); if (!endswith(line, "\n")) fputc('\n', f); @@ -64,11 +62,7 @@ int write_string_file_atomic(const char *fn, const char *line) { fchmod_umask(fileno(f), 0644); errno = 0; - if (fputs(line, f) < 0) { - r = -errno; - goto finish; - } - + fputs(line, f); if (!endswith(line, "\n")) fputc('\n', f); @@ -83,7 +77,6 @@ int write_string_file_atomic(const char *fn, const char *line) { r = 0; } -finish: if (r < 0) unlink(p); @@ -522,6 +515,37 @@ int load_env_file(const char *fname, const char *newline, char ***rl) { return 0; } +static void write_env_var(FILE *f, const char *v) { + const char *p; + + p = strchr(v, '='); + if (!p) { + /* Fallback */ + fputs(v, f); + fputc('\n', f); + return; + } + + p++; + fwrite(v, 1, p-v, f); + + if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\")) { + fputc('\"', f); + + for (; *p; p++) { + if (strchr("\'\"\\", *p)) + fputc('\\', f); + + fputc(*p, f); + } + + fputc('\"', f); + } else + fputs(p, f); + + fputc('\n', f); +} + int write_env_file(const char *fname, char **l) { char **i; char _cleanup_free_ *p = NULL; @@ -535,19 +559,14 @@ int write_env_file(const char *fname, char **l) { fchmod_umask(fileno(f), 0644); errno = 0; - STRV_FOREACH(i, l) { - fputs(*i, f); - fputc('\n', f); - } + STRV_FOREACH(i, l) + write_env_var(f, *i); fflush(f); - if (ferror(f)) { - if (errno > 0) - r = -errno; - else - r = -EIO; - } else { + if (ferror(f)) + r = errno ? -errno : -EIO; + else { if (rename(p, fname) < 0) r = -errno; else