util: modernization and test for load_env_file
This commit is contained in:
parent
565d91fdf1
commit
b989350563
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue