summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-18 10:57:11 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-18 11:06:53 -0500
commitb9893505636b77878035b342026e391e10cfbb91 (patch)
tree5ffc451467899a3abce08cc7442d86955cf8cb4e
parent565d91fdf198b88f7c2d72c67cfc6c30341a3596 (diff)
util: modernization and test for load_env_file
-rw-r--r--src/shared/util.c63
-rw-r--r--src/test/test-unit-file.c57
2 files changed, 79 insertions, 41 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index 08c0c2be13..37e383f2ef 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 6636b949ea..de8be3257a 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;
}