[systemd-devel] [PATCH] Added globbing support to EnvironmentFile

Lennart Poettering lennart at poettering.net
Thu Jan 3 16:13:14 PST 2013


On Wed, 02.01.13 13:41, Pekka Lundstrom (pekka.lundstrom at jollamobile.com) wrote:

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

Thanks! Applied!
> 
> t. Pekka
> ---
> Signed-off-by: Pekka Lundstrom <pekka.lundstrom at jollamobile.com>
> 
> ---
>  man/systemd.exec.xml |    2 +-
>  src/core/execute.c   |   51 ++++++++++++++++++++++++++++++++++++++------------
>  2 files changed, 40 insertions(+), 13 deletions(-)
> 
> 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..bf0458e 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,53 @@ 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 */
> +                pglob.gl_pathc = 0;
> +                pglob.gl_pathv = NULL;
> +                if (glob(fn, 0, NULL, &pglob) != 0) {
> +                        globfree(&pglob);
> +                        if (ignore)
> +                                continue;
>  
> +                        strv_free(r);
> +                        return -EINVAL;
> +                }
> +                if ((count = pglob.gl_pathc) == 0) {
> +                        globfree(&pglob);
>                          if (ignore)
>                                  continue;
>  
>                          strv_free(r);
> -                        return k;
> +                        return -EINVAL;
>                  }
> +                for (n = 0; n < count; n++) {
> +                        if ((k = load_env_file(pglob.gl_pathv[n], &p)) < 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;


Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list