summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorMichal Vyskocil <mvyskocil@suse.cz>2013-01-18 10:05:10 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-18 11:06:15 -0500
commit565d91fdf198b88f7c2d72c67cfc6c30341a3596 (patch)
tree1d587214b98a89293298dc6fdd0cb0c97b3d1873 /src/shared
parentc3a7cfb7dee251cab01e98a399e7d2a0f787b6b9 (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.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;