util: modernization and test for load_env_file

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2013-01-18 10:57:11 -05:00
parent 565d91fdf1
commit b989350563
2 changed files with 79 additions and 41 deletions

View File

@ -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) {

View File

@ -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;
}