summaryrefslogtreecommitdiff
path: root/src/shared/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/util.c')
-rw-r--r--src/shared/util.c43
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;