[systemd-commits] man/systemd.exec.xml src/core

Lennart Poettering lennart at kemper.freedesktop.org
Thu Jan 3 16:13:08 PST 2013


 man/systemd.exec.xml |    2 -
 src/core/execute.c   |   53 +++++++++++++++++++++++++++++++++++++++------------
 2 files changed, 42 insertions(+), 13 deletions(-)

New commits:
commit 2bef10ab3648db144c421f7765d20dbdf1afe074
Author: Pekka Lundstrom <pekka.lundstrom at jollamobile.com>
Date:   Wed Jan 2 13:41:52 2013 +0200

    Added globbing support to EnvironmentFile
    
    This patch allows globbing to be used with EnvironmentFile option.
    Example:
    EnvironmentFile=/etc/foo.d/*.conf
    
    t. Pekka

diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 6ca7405..302ac43 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 7628470..7dc1504 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;



More information about the systemd-commits mailing list