[systemd-devel] tmpfiles.d specifier support on "argument" when operating on files

Lennart Poettering lennart at poettering.net
Tue Mar 10 09:13:44 PDT 2015


On Wed, 18.02.15 18:17, Cristian Rodríguez (crrodriguez at opensuse.org) wrote:

> >From ee8e4f440def745b6f0655b897e65d48321e46c5 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez at opensuse.org>
> Date: Wed, 18 Feb 2015 18:09:16 -0300
> Subject: [PATCH] tmpfiles: implement specifier substitution for file
>  "argument"
> 
> Only for L and C types where it makes sense.
> ---
>  src/tmpfiles/tmpfiles.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
> index 88ba7e4..6de477b 100644
> --- a/src/tmpfiles/tmpfiles.c
> +++ b/src/tmpfiles/tmpfiles.c
> @@ -1568,6 +1568,18 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
>                  }
>          }
>  
> +        if(IN_SET(i.type, CREATE_SYMLINK, COPY_FILES)) {

I figure it makes sense on more than these, for example the ones that
write strings to files. Also, there's a space missing after the "if"
and before the first "(".

> +                if(i.argument) {

Similar here.

> +                        _cleanup_free_ char *resolved_iarg = NULL;
> +                        r = specifier_printf(i.argument, specifier_table, NULL, &resolved_iarg);
> +                        if(r < 0)
> +                                return log_error_errno(r, "[%s:%u] Failed to replace specifiers: %s", fname, line, path);
> +                        r = free_and_strdup(&i.argument, resolved_iarg);
> +                        if(r < 0)
> +                                return log_oom();

No need to duplicate the already allocated string again. Just assign
resolved_iarg to i.argument, and free that before.

Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list