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