[systemd-devel] [PATCH] fileio: make parse_env_file() return number of parsed items
Michal Sekletar
msekleta at redhat.com
Mon Jun 2 09:03:27 PDT 2014
This should make logic in locale_setup() work as intended, hence don't
parse /etc/locale.conf if admin passed to us explicit locale settings on
kernel cmdline.
---
src/shared/fileio.c | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/src/shared/fileio.c b/src/shared/fileio.c
index c7b2cd8..c77afd9 100644
--- a/src/shared/fileio.c
+++ b/src/shared/fileio.c
@@ -251,7 +251,8 @@ int read_full_file(const char *fn, char **contents, size_t *size) {
static int parse_env_file_internal(
const char *fname,
const char *newline,
- int (*push) (const char *filename, unsigned line,
+ int *n_pushed,
+ int (*push) (const char *filename, unsigned line, int *n_pushed,
const char *key, char *value, void *userdata),
void *userdata) {
@@ -340,7 +341,7 @@ static int parse_env_file_internal(
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, n_pushed, key, value, userdata);
if (r < 0)
goto fail;
@@ -385,7 +386,7 @@ static int parse_env_file_internal(
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, n_pushed, key, value, userdata);
if (r < 0)
goto fail;
@@ -520,7 +521,7 @@ static int parse_env_file_internal(
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, n_pushed, key, value, userdata);
if (r < 0)
goto fail;
}
@@ -532,7 +533,7 @@ fail:
return r;
}
-static int parse_env_file_push(const char *filename, unsigned line,
+static int parse_env_file_push(const char *filename, unsigned line, int *n_pushed,
const char *key, char *value, void *userdata) {
const char *k;
@@ -565,6 +566,10 @@ static int parse_env_file_push(const char *filename, unsigned line,
va_end(aq);
free(*v);
*v = value;
+
+ if (n_pushed)
+ (*n_pushed)++;
+
return 1;
}
}
@@ -579,19 +584,19 @@ int parse_env_file(
const char *newline, ...) {
va_list ap;
- int r;
+ int r, n_pushed = 0;
if (!newline)
newline = NEWLINE;
va_start(ap, newline);
- r = parse_env_file_internal(fname, newline, parse_env_file_push, &ap);
+ r = parse_env_file_internal(fname, newline, &n_pushed, parse_env_file_push, &ap);
va_end(ap);
- return r;
+ return r < 0 ? r : n_pushed;
}
-static int load_env_file_push(const char *filename, unsigned line,
+static int load_env_file_push(const char *filename, unsigned line, int *n_pushed,
const char *key, char *value, void *userdata) {
char ***m = userdata;
char *p;
@@ -621,6 +626,9 @@ static int load_env_file_push(const char *filename, unsigned line,
if (r < 0)
return r;
+ if (n_pushed)
+ (*n_pushed)++;
+
free(value);
return 0;
}
@@ -632,7 +640,7 @@ int load_env_file(const char *fname, const char *newline, char ***rl) {
if (!newline)
newline = NEWLINE;
- r = parse_env_file_internal(fname, newline, load_env_file_push, &m);
+ r = parse_env_file_internal(fname, newline, NULL, load_env_file_push, &m);
if (r < 0) {
strv_free(m);
return r;
--
1.9.0
More information about the systemd-devel
mailing list