diff options
author | Pekka Lundstrom <pekka.lundstrom@jollamobile.com> | 2013-01-02 13:41:52 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-01-04 01:11:50 +0100 |
commit | 2bef10ab3648db144c421f7765d20dbdf1afe074 (patch) | |
tree | b0d8e41b51248256d21e2af876690ecac16c255c | |
parent | 1a0fce458d3b45624c5817006735d59a5689ef83 (diff) |
Added globbing support to EnvironmentFile
This patch allows globbing to be used with EnvironmentFile option.
Example:
EnvironmentFile=/etc/foo.d/*.conf
t. Pekka
-rw-r--r-- | man/systemd.exec.xml | 2 | ||||
-rw-r--r-- | src/core/execute.c | 53 |
2 files changed, 42 insertions, 13 deletions
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 6ca7405687..302ac43407 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -291,7 +291,7 @@ double quotes ("). The argument passed should be an absolute - file name, optionally prefixed with + file name or wildcard expression, optionally prefixed with "-", which indicates that if the file does not exist it won't be read and no error or warning message is diff --git a/src/core/execute.c b/src/core/execute.c index 76284700d7..7dc15044b4 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -39,6 +39,7 @@ #include <linux/oom.h> #include <sys/poll.h> #include <linux/seccomp-bpf.h> +#include <glob.h> #ifdef HAVE_PAM #include <security/pam_appl.h> @@ -1657,6 +1658,8 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { int k; bool ignore = false; char **p; + glob_t pglob; + int count, n; fn = *i; @@ -1674,29 +1677,55 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { return -EINVAL; } - if ((k = load_env_file(fn, &p)) < 0) { + /* Filename supports globbing, take all matching files */ + zero(pglob); + errno = 0; + if (glob(fn, 0, NULL, &pglob) != 0) { + globfree(&pglob); + if (ignore) + continue; + strv_free(r); + return errno ? -errno : -EINVAL; + } + count = pglob.gl_pathc; + if (count == 0) { + globfree(&pglob); if (ignore) continue; strv_free(r); - return k; + return -EINVAL; } + for (n = 0; n < count; n++) { + k = load_env_file(pglob.gl_pathv[n], &p); + if (k < 0) { + if (ignore) + continue; - if (r == NULL) - r = p; - else { - char **m; + strv_free(r); + globfree(&pglob); + return k; + } - m = strv_env_merge(2, r, p); - strv_free(r); - strv_free(p); + if (r == NULL) + r = p; + else { + char **m; - if (!m) - return -ENOMEM; + m = strv_env_merge(2, r, p); + strv_free(r); + strv_free(p); - r = m; + if (!m) { + globfree(&pglob); + return -ENOMEM; + } + + r = m; + } } + globfree(&pglob); } *l = r; |