summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Lundstrom <pekka.lundstrom@jollamobile.com>2013-01-02 13:41:52 +0200
committerLennart Poettering <lennart@poettering.net>2013-01-04 01:11:50 +0100
commit2bef10ab3648db144c421f7765d20dbdf1afe074 (patch)
treeb0d8e41b51248256d21e2af876690ecac16c255c
parent1a0fce458d3b45624c5817006735d59a5689ef83 (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.xml2
-rw-r--r--src/core/execute.c53
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;