diff options
-rw-r--r-- | man/systemd.exec.xml | 8 | ||||
-rw-r--r-- | src/shared/util.c | 43 |
2 files changed, 43 insertions, 8 deletions
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 71472b4f5d..8a22ac0138 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -299,9 +299,11 @@ contain new-line separated variable assignments. Empty lines and lines starting with ; or # will be ignored, - which may be used for commenting. The - parser strips leading and - trailing whitespace from the values + which may be used for commenting. A line + ending with a backslash will be concatenated + with the following one, allowing multiline variable + definitions. The parser strips leading + and trailing whitespace from the values of assignments, unless you use double quotes (").</para> 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; |