[systemd-commits] 2 commits - man/systemd.exec.xml src/shared src/test
Zbigniew JÄdrzejewski-Szmek
zbyszek at kemper.freedesktop.org
Fri Jan 18 08:07:47 PST 2013
man/systemd.exec.xml | 8 +++--
src/shared/util.c | 72 +++++++++++++++++++++++++++-------------------
src/test/test-unit-file.c | 57 ++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+), 32 deletions(-)
New commits:
commit b9893505636b77878035b342026e391e10cfbb91
Author: Zbigniew JÄdrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Fri Jan 18 10:57:11 2013 -0500
util: modernization and test for load_env_file
diff --git a/src/shared/util.c b/src/shared/util.c
index 08c0c2b..37e383f 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -775,20 +775,19 @@ fail:
return r;
}
-int load_env_file(
- const char *fname,
- char ***rl) {
+int load_env_file(const char *fname,
+ char ***rl) {
- FILE *f;
+ FILE _cleanup_fclose_ *f;
char *b;
- char *c = NULL;
- char **m = NULL;
- int r;
+ char _cleanup_free_ *c = NULL;
+ char _cleanup_strv_free_ **m = NULL;
assert(fname);
assert(rl);
- if (!(f = fopen(fname, "re")))
+ f = fopen(fname, "re");
+ if (!f)
return -errno;
while (!feof(f)) {
@@ -796,24 +795,19 @@ int load_env_file(
char **t;
if (!fgets(l, sizeof(l), f)) {
- if(!feof(f)) {
- r = -errno;
- goto finish;
- }
+ if (!feof(f))
+ return -errno;
else if (!c)
break;
-
}
cs = endswith(l, "\\\n");
if (cs) {
-
*cs = '\0';
b = strappend(c, l);
- if (!b) {
- r = log_oom();
- goto finish;
- }
+ if (!b)
+ return log_oom();
+
free(c);
c = b;
*l = '\0';
@@ -822,10 +816,9 @@ int load_env_file(
if (c) {
b = strappend(c, l);
- if (!b) {
- r = log_oom();
- goto finish;
- }
+ if (!b)
+ return log_oom();
+
free(c);
c = b;
}
@@ -838,39 +831,27 @@ int load_env_file(
if (strchr(COMMENTS, *p))
continue;
- if (!(u = normalize_env_assignment(p))) {
- r = log_oom();
- goto finish;
- }
+ u = normalize_env_assignment(p);
+ if (!u)
+ return log_oom();
+
free(c);
c = NULL;
t = strv_append(m, u);
free(u);
- if (!t) {
- r = log_oom();
- goto finish;
- }
+ if (!t)
+ return log_oom();
strv_free(m);
m = t;
}
- r = 0;
-
*rl = m;
m = NULL;
-finish:
- if (f)
- fclose(f);
-
- free(c);
-
- strv_free(m);
-
- return r;
+ return 0;
}
int write_env_file(const char *fname, char **l) {
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index 6636b94..de8be32 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -4,6 +4,7 @@
This file is part of systemd.
Copyright 2012 Lennart Poettering
+ Copyright 2013 Zbigniew JÄdrzejewski-Szmek
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
@@ -23,12 +24,14 @@
#include <stdio.h>
#include <stddef.h>
#include <string.h>
+#include <unistd.h>
#include "install.h"
#include "util.h"
#include "macro.h"
#include "hashmap.h"
#include "load-fragment.h"
+#include "strv.h"
static void test_unit_file_get_set(void) {
int r;
@@ -174,10 +177,64 @@ static void test_config_parse_exec(void) {
exec_command_free_list(c);
}
+#define env_file_1 \
+ "a\n" \
+ "b\\\n" \
+ "c\n" \
+ "d\\\n" \
+ "e\\\n" \
+ "f\n" \
+ "g\\ \n" \
+ "h\n" \
+ "i\\"
+
+#define env_file_2 \
+ "a\\\n"
+
+static void test_load_env_file_1(void) {
+ char _cleanup_strv_free_ **data = NULL;
+ int r;
+
+ char name[] = "/tmp/test-load-env-file.XXXXXX";
+ int _cleanup_close_ fd = mkstemp(name);
+ assert(fd >= 0);
+ assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1));
+
+ r = load_env_file(name, &data);
+ assert(r == 0);
+ assert(streq(data[0], "a"));
+ assert(streq(data[1], "bc"));
+ assert(streq(data[2], "def"));
+ assert(streq(data[3], "g\\"));
+ assert(streq(data[4], "h"));
+ assert(streq(data[5], "i\\"));
+ assert(data[6] == NULL);
+ unlink(name);
+}
+
+static void test_load_env_file_2(void) {
+ char _cleanup_strv_free_ **data = NULL;
+ int r;
+
+ char name[] = "/tmp/test-load-env-file.XXXXXX";
+ int _cleanup_close_ fd = mkstemp(name);
+ assert(fd >= 0);
+ assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2));
+
+ r = load_env_file(name, &data);
+ assert(r == 0);
+ assert(streq(data[0], "a"));
+ assert(data[1] == NULL);
+ unlink(name);
+}
+
+
int main(int argc, char *argv[]) {
test_unit_file_get_set();
test_config_parse_exec();
+ test_load_env_file_1();
+ test_load_env_file_2();
return 0;
}
commit 565d91fdf198b88f7c2d72c67cfc6c30341a3596
Author: Michal Vyskocil <mvyskocil at suse.cz>
Date: Fri Jan 18 10:05:10 2013 +0100
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
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 71472b4..8a22ac0 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 f75a81c..08c0c2b 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;
More information about the systemd-commits
mailing list