diff options
author | Michal Vyskocil <mvyskocil@suse.cz> | 2013-01-18 10:05:10 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-01-18 11:06:15 -0500 |
commit | 565d91fdf198b88f7c2d72c67cfc6c30341a3596 (patch) | |
tree | 1d587214b98a89293298dc6fdd0cb0c97b3d1873 /src/shared | |
parent | c3a7cfb7dee251cab01e98a399e7d2a0f787b6b9 (diff) |
util: continuation support for load_env_file
Variable definitions can be written on more than one line - if each ends
with a backslash, then is concatenated with a previous one. Only
backslash and unix end of line (\n) are treated as a continuation.
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=58083
[zj: squashed two patches together; cleaned up grammar; removed
comment about ignoring trailing backslash -- it is not ignored.]
Document continuation support in systemd.exec
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/util.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index f75a81c605..08c0c2be13 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -780,6 +780,8 @@ int load_env_file( char ***rl) { FILE *f; + char *b; + char *c = NULL; char **m = NULL; int r; @@ -790,18 +792,45 @@ int load_env_file( return -errno; while (!feof(f)) { - char l[LINE_MAX], *p, *u; + char l[LINE_MAX], *p, *u, *cs; char **t; if (!fgets(l, sizeof(l), f)) { - if (feof(f)) + if(!feof(f)) { + r = -errno; + goto finish; + } + else if (!c) break; - r = -errno; - goto finish; } - p = strstrip(l); + cs = endswith(l, "\\\n"); + if (cs) { + + *cs = '\0'; + b = strappend(c, l); + if (!b) { + r = log_oom(); + goto finish; + } + free(c); + c = b; + *l = '\0'; + continue; + } + + if (c) { + b = strappend(c, l); + if (!b) { + r = log_oom(); + goto finish; + } + free(c); + c = b; + } + + p = strstrip(c ? c : l); if (!*p) continue; @@ -813,6 +842,8 @@ int load_env_file( r = log_oom(); goto finish; } + free(c); + c = NULL; t = strv_append(m, u); free(u); @@ -835,6 +866,8 @@ finish: if (f) fclose(f); + free(c); + strv_free(m); return r; |