summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-01-12 19:39:56 +0800
committerLennart Poettering <lennart@poettering.net>2014-01-12 19:41:57 +0800
commit43d03a83766a0d63f535e2afa6aeb6e6acbe83b2 (patch)
treea1219f615f91717be4090a891cc03642e804cf1c
parentd44fdf4954e3611e6fcd9b637763664b2574af6e (diff)
core: clean up environment block for --user instances a bit
-rw-r--r--src/core/manager.c16
-rw-r--r--src/shared/env-util.c39
-rw-r--r--src/shared/env-util.h1
3 files changed, 54 insertions, 2 deletions
diff --git a/src/core/manager.c b/src/core/manager.c
index a80d6a161a..91c3d59d2b 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -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;
diff --git a/src/shared/env-util.c b/src/shared/env-util.c
index 7976881ef6..b2e45531ab 100644
--- a/src/shared/env-util.c
+++ b/src/shared/env-util.c
@@ -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;
diff --git a/src/shared/env-util.h b/src/shared/env-util.h
index 8d2114b64c..c0b1e382af 100644
--- a/src/shared/env-util.h
+++ b/src/shared/env-util.h
@@ -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_;