From 43d03a83766a0d63f535e2afa6aeb6e6acbe83b2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 12 Jan 2014 19:39:56 +0800 Subject: [PATCH] core: clean up environment block for --user instances a bit --- src/core/manager.c | 16 +++++++++++++++- src/shared/env-util.c | 39 ++++++++++++++++++++++++++++++++++++++- src/shared/env-util.h | 1 + 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/core/manager.c b/src/core/manager.c index a80d6a1..91c3d59 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 7976881..b2e4553 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 8d2114b..c0b1e38 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_; -- 2.7.4