chiark / gitweb /
execute: drop empty assignments from env blocks on execution but keep them around...
authorLennart Poettering <lennart@poettering.net>
Thu, 6 Jan 2011 19:38:02 +0000 (20:38 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 6 Jan 2011 19:38:02 +0000 (20:38 +0100)
src/execute.c
src/load-fragment.c
src/strv.c
src/strv.h
src/test-env-replace.c

index 05abd5aaac3aac964488ba564170307695a20041..8f486e2004a1f43923d77a2b80bd81692e475206 100644 (file)
@@ -1303,6 +1303,8 @@ int exec_spawn(ExecCommand *command,
                         goto fail;
                 }
 
+                final_env = strv_env_clean(final_env);
+
                 execve(command->path, final_argv, final_env);
                 r = EXIT_EXEC;
 
index 334dd68146c175e9121611af9bc4022bd03827db..261180d1555b6b72761f72505baf19d92856cb07 100644 (file)
@@ -1399,7 +1399,7 @@ static int config_parse_env_file(
                         goto finish;
                 }
 
-                t = strv_env_set(*env, u);
+                t = strv_append(*env, u);
                 free(u);
 
                 if (!t) {
index d9aef982246c0dc158b4a190ce8832a340cfc088..d1c7b2c32d89c31b121fc6ef1c0c719a9167c81c 100644 (file)
@@ -380,7 +380,7 @@ static int env_append(char **r, char ***k, char **a) {
 
         /* Add the entries of a to *k unless they already exist in *r
          * in which case they are overriden instead. This assumes
-         * there is enough space in the r */
+         * there is enough space in the r array. */
 
         for (; *a; a++) {
                 char **j;
@@ -556,3 +556,24 @@ char *strv_env_get_with_length(char **l, const char *name, size_t k) {
 char *strv_env_get(char **l, const char *name) {
         return strv_env_get_with_length(l, name, strlen(name));
 }
+
+char **strv_env_clean(char **l) {
+        char **r, **ret;
+
+        for (r = ret = l; *l; l++) {
+                const char *equal;
+
+                equal = strchr(*l, '=');
+
+                if (equal && equal[1] == 0) {
+                        free(*l);
+                        continue;
+                }
+
+                *(r++) = *l;
+        }
+
+        *r = NULL;
+
+        return ret;
+}
index 1103e194c3d6ff363a82d653a6118d589f0e9888..5af84ee41fdb263e31955643364ab0074007aee6 100644 (file)
@@ -63,6 +63,8 @@ char **strv_env_set(char **x, const char *p);
 char *strv_env_get_with_length(char **l, const char *name, size_t k);
 char *strv_env_get(char **x, const char *n);
 
+char **strv_env_clean(char **l);
+
 #define STRV_FOREACH(s, l)                      \
         for ((s) = (l); (s) && *(s); (s)++)
 
index 37dd7ff590a690da1606be6e209913b686da1b21..4188c67ddedee088557305f13d4ec9c05e678c5f 100644 (file)
@@ -47,7 +47,7 @@ int main(int argc, char *argv[]) {
                 NULL
         };
 
-        char **i, **r, *t;
+        char **i, **r, *t, **a, **b;
 
         r = replace_env_argv((char**) line, (char**) env);
 
@@ -96,5 +96,24 @@ int main(int argc, char *argv[]) {
         printf("%s\n", t);
         free(t);
 
+        a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
+        b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
+
+        r = strv_env_merge(2, a, b);
+        strv_free(a);
+        strv_free(b);
+
+        STRV_FOREACH(i, r)
+                printf("%s\n", *i);
+
+        printf("CLEANED UP:\n");
+
+        r = strv_env_clean(r);
+
+        STRV_FOREACH(i, r)
+                printf("%s\n", *i);
+
+        strv_free(r);
+
         return 0;
 }