diff options
Diffstat (limited to 'src/shared/util.c')
-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; |