diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/shared/util.c | 63 | ||||
-rw-r--r-- | src/test/test-unit-file.c | 57 |
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; } |