[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