diff options
author | Michal Sekletar <msekleta@redhat.com> | 2014-09-22 09:38:38 +0200 |
---|---|---|
committer | Michal Sekletar <msekleta@redhat.com> | 2014-09-25 09:19:56 +0200 |
commit | a5f6c30da3ac58081108221bf8a0f6f1d84b33a9 (patch) | |
tree | 63d30290083d307398b09c7c0684933c0430e8c3 | |
parent | 078ef7b85ad77ba999588f72b31a50ced5907692 (diff) |
fileio: make parse_env_file() return number of parsed items
This commit introduces possibility to call parse_env_file_internal() and hand
over extra argument where we will accumulate how many items were successfully
parsed and pushed by callback. We make use of this in parse_env_file() and
return number of parsed items on success instead of always returning zero.
As a side-effect this commit should fix bug that locale settings in
/etc/locale.conf are not overriden by options passed via kernel command line.
-rw-r--r-- | src/shared/fileio.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/src/shared/fileio.c b/src/shared/fileio.c index 18960abf02..38028b972e 100644 --- a/src/shared/fileio.c +++ b/src/shared/fileio.c @@ -296,8 +296,9 @@ static int parse_env_file_internal( const char *fname, const char *newline, int (*push) (const char *filename, unsigned line, - const char *key, char *value, void *userdata), - void *userdata) { + const char *key, char *value, void *userdata, int *n_pushed), + void *userdata, + int *n_pushed) { _cleanup_free_ char *contents = NULL, *key = NULL; size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = (size_t) -1, last_key_whitespace = (size_t) -1; @@ -386,7 +387,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, key, value, userdata, n_pushed); if (r < 0) goto fail; @@ -431,7 +432,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, key, value, userdata, n_pushed); if (r < 0) goto fail; @@ -566,7 +567,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, key, value, userdata, n_pushed); if (r < 0) goto fail; } @@ -581,7 +582,8 @@ fail: static int parse_env_file_push( const char *filename, unsigned line, const char *key, char *value, - void *userdata) { + void *userdata, + int *n_pushed) { const char *k; va_list aq, *ap = userdata; @@ -613,6 +615,10 @@ static int parse_env_file_push( va_end(aq); free(*v); *v = value; + + if (n_pushed) + (*n_pushed)++; + return 1; } } @@ -628,22 +634,23 @@ 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(NULL, fname, newline, parse_env_file_push, &ap); + r = parse_env_file_internal(NULL, fname, newline, parse_env_file_push, &ap, &n_pushed); va_end(ap); - return r; + return r < 0 ? r : n_pushed; } static int load_env_file_push( const char *filename, unsigned line, const char *key, char *value, - void *userdata) { + void *userdata, + int *n_pushed) { char ***m = userdata; char *p; int r; @@ -670,6 +677,9 @@ static int load_env_file_push( if (r < 0) return r; + if (n_pushed) + (*n_pushed)++; + free(value); return 0; } @@ -681,7 +691,7 @@ int load_env_file(FILE *f, const char *fname, const char *newline, char ***rl) { if (!newline) newline = NEWLINE; - r = parse_env_file_internal(f, fname, newline, load_env_file_push, &m); + r = parse_env_file_internal(f, fname, newline, load_env_file_push, &m, NULL); if (r < 0) { strv_free(m); return r; @@ -694,7 +704,8 @@ int load_env_file(FILE *f, const char *fname, const char *newline, char ***rl) { static int load_env_file_push_pairs( const char *filename, unsigned line, const char *key, char *value, - void *userdata) { + void *userdata, + int *n_pushed) { char ***m = userdata; int r; @@ -726,6 +737,9 @@ static int load_env_file_push_pairs( return r; } + if (n_pushed) + (*n_pushed)++; + return 0; } @@ -736,7 +750,7 @@ int load_env_file_pairs(FILE *f, const char *fname, const char *newline, char ** if (!newline) newline = NEWLINE; - r = parse_env_file_internal(f, fname, newline, load_env_file_push_pairs, &m); + r = parse_env_file_internal(f, fname, newline, load_env_file_push_pairs, &m, NULL); if (r < 0) { strv_free(m); return r; |