diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-01-12 19:39:56 +0800 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-01-12 19:41:57 +0800 |
commit | 43d03a83766a0d63f535e2afa6aeb6e6acbe83b2 (patch) | |
tree | a1219f615f91717be4090a891cc03642e804cf1c /src/shared/env-util.c | |
parent | d44fdf4954e3611e6fcd9b637763664b2574af6e (diff) |
core: clean up environment block for --user instances a bit
Diffstat (limited to 'src/shared/env-util.c')
-rw-r--r-- | src/shared/env-util.c | 39 |
1 files changed, 38 insertions, 1 deletions
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; |