chiark / gitweb /
basic: add new merge_env_file function
authorRay Strode <rstrode@redhat.com>
Thu, 4 Aug 2016 16:00:00 +0000 (12:00 -0400)
committerSven Eden <yamakuzure@gmx.net>
Mon, 17 Jul 2017 15:58:34 +0000 (17:58 +0200)
merge_env_file is a new function, that's like load_env_file, but takes a
pre-existing environment as an input argument. New environment entries are
merged. Variable expansion is performed.

Falling back to the process environment is supported (when a flag is set).
Alternatively this could be implemented as passing an additional fallback
environment array, but later on we're adding another flag to allow braceless
expansion, and the two flags can be combined in one arg, so there's less
stuff to pass around.

src/basic/fileio.c
src/basic/fileio.h

index 4ad2acf3bd7d9f5a404c1b04f89fe378f4a0d6f5..55dda26a6c0c93b4e792e4c8d8160f8110b2251a 100644 (file)
@@ -767,6 +767,34 @@ int load_env_file_pairs(FILE *f, const char *fname, const char *newline, char **
         return 0;
 }
 
         return 0;
 }
 
+static int merge_env_file_push(
+                const char *filename, unsigned line,
+                const char *key, char *value,
+                void *userdata,
+                int *n_pushed) {
+
+        char ***env = userdata;
+        char *expanded_value;
+
+        assert(env);
+
+        expanded_value = replace_env(value, *env, REPLACE_ENV_USE_ENVIRONMENT);
+        if (!expanded_value)
+                return -ENOMEM;
+
+        free_and_replace(value, expanded_value);
+
+        return load_env_file_push(filename, line, key, value, env, n_pushed);
+}
+
+int merge_env_file(
+                char ***env,
+                FILE *f,
+                const char *fname) {
+
+        return parse_env_file_internal(f, fname, NEWLINE, merge_env_file_push, env, NULL);
+}
+
 static void write_env_var(FILE *f, const char *v) {
         const char *p;
 
 static void write_env_var(FILE *f, const char *v) {
         const char *p;
 
index fe9506c3d3717f4b971e8b6d439c45deda81a5c0..6a628086bce173d47a6f38e702e8431e1f1f6011 100644 (file)
@@ -49,6 +49,8 @@ int parse_env_file(const char *fname, const char *separator, ...) _sentinel_;
 int load_env_file(FILE *f, const char *fname, const char *separator, char ***l);
 int load_env_file_pairs(FILE *f, const char *fname, const char *separator, char ***l);
 
 int load_env_file(FILE *f, const char *fname, const char *separator, char ***l);
 int load_env_file_pairs(FILE *f, const char *fname, const char *separator, char ***l);
 
+int merge_env_file(char ***env, FILE *f, const char *fname);
+
 int write_env_file(const char *fname, char **l);
 
 int executable_is_script(const char *path, char **interpreter);
 int write_env_file(const char *fname, char **l);
 
 int executable_is_script(const char *path, char **interpreter);