return -errno;
errno = 0;
- if (fputs(line, f) < 0)
- return errno ? -errno : -EIO;
-
+ fputs(line, f);
if (!endswith(line, "\n"))
fputc('\n', f);
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);
r = 0;
}
-finish:
if (r < 0)
unlink(p);
switch (state) {
case PRE_KEY:
- if (strchr(COMMENTS, c))
+ if (startswith(p, "export "))
+ p+=6;
+ else if (strchr(COMMENTS, c))
state = COMMENT;
else if (!strchr(WHITESPACE, c)) {
state = KEY;
break;
case PRE_VALUE:
- if (strchr(newline, c)) {
+ if (strchr(newline, c) || strchr(COMMENTS, c)) {
state = PRE_KEY;
key[n_key] = 0;
p++;
fwrite(v, 1, p-v, f);
- if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\")) {
+ if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
fputc('\"', f);
for (; *p; p++) {
- if (strchr("\'\"\\", *p))
+ if (strchr("\'\"\\`$", *p))
fputc('\\', f);
fputc(*p, f);
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