core: clean up environment block for --user instances a bit

This commit is contained in:
Lennart Poettering 2014-01-12 19:39:56 +08:00
parent d44fdf4954
commit 43d03a8376
3 changed files with 54 additions and 2 deletions

View 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;

View 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;

View 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_;