chiark / gitweb /
core: clean up environment block for --user instances a bit
authorLennart Poettering <lennart@poettering.net>
Sun, 12 Jan 2014 11:39:56 +0000 (19:39 +0800)
committerLennart Poettering <lennart@poettering.net>
Sun, 12 Jan 2014 11:41:57 +0000 (19:41 +0800)
src/core/manager.c
src/shared/env-util.c
src/shared/env-util.h

index a80d6a161ae58baf33a53066be254a934af3b7af..91c3d59d2b1f75394f119e1b956b85c292fe5f42 100644 (file)
@@ -348,11 +348,25 @@ static int manager_default_environment(Manager *m) {
 
                 /* Import locale variables LC_*= from configuration */
                 locale_setup(&m->environment);
-        } else
+        } else {
                 /* The user manager passes its own environment
                  * along to its children. */
                 m->environment = strv_copy(environ);
 
+                /* Let's remove some environment variables that we
+                 * need ourselves to communicate with our clients */
+                strv_env_unset_many(
+                                m->environment,
+                                "NOTIFY_SOCKET",
+                                "MAINPID",
+                                "MANAGERPID",
+                                "LISTEN_PID",
+                                "LISTEN_FDS",
+                                "WATCHDOG_PID",
+                                "WATCHDOG_USEC",
+                                NULL);
+        }
+
         if (!m->environment)
                 return -ENOMEM;
 
index 7976881ef697acd0217314412cf0a344c8a75d76..b2e45531ab7ec0131e102075bc9b09397dfe0fb1 100644 (file)
@@ -310,7 +310,7 @@ char **strv_env_unset(char **l, const char *p) {
         assert(p);
 
         /* Drops every occurrence of the env var setting p in the
-         * string list. edits in-place. */
+         * string list. Edits in-place. */
 
         for (f = t = l; *f; f++) {
 
@@ -326,6 +326,43 @@ char **strv_env_unset(char **l, const char *p) {
         return l;
 }
 
+char **strv_env_unset_many(char **l, ...) {
+
+        char **f, **t;
+
+        if (!l)
+                return NULL;
+
+        /* Like strv_env_unset() but applies many at once. Edits in-place. */
+
+        for (f = t = l; *f; f++) {
+                bool found = false;
+                const char *p;
+                va_list ap;
+
+                va_start(ap, l);
+
+                while ((p = va_arg(ap, const char*))) {
+                        if (env_match(*f, p)) {
+                                found = true;
+                                break;
+                        }
+                }
+
+                va_end(ap);
+
+                if (found) {
+                        free(*f);
+                        continue;
+                }
+
+                *(t++) = *f;
+        }
+
+        *t = NULL;
+        return l;
+}
+
 char **strv_env_set(char **x, const char *p) {
 
         char **k, **r;
index 8d2114b64c1a4c1b17ebe63b6f91ec4e0a9d3b4d..c0b1e382af6e76bf5cb0a9e8a95e5b7277279405 100644 (file)
@@ -39,6 +39,7 @@ char **strv_env_delete(char **x, unsigned n_lists, ...); /* New copy */
 
 char **strv_env_set(char **x, const char *p); /* New copy ... */
 char **strv_env_unset(char **l, const char *p); /* In place ... */
+char **strv_env_unset_many(char **l, ...) _sentinel_;
 
 char *strv_env_get_n(char **l, const char *name, size_t k) _pure_;
 char *strv_env_get(char **x, const char *n) _pure_;