[libvirt] [PATCH 1/4] Add APIs for formatting systemd slice/scope names

Richard Weinberger richard.weinberger at gmail.com
Sun Dec 15 18:09:19 UTC 2013


On Fri, Jul 26, 2013 at 5:48 PM, Daniel P. Berrange <berrange at redhat.com> wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> There are some interesting escaping rules to consider when dealing
> with systemd slice/scope names. Thus it is helpful to have APIs
> for formatting names
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/libvirt_private.syms |  2 ++
>  src/util/virsystemd.c    | 91 ++++++++++++++++++++++++++++++++++++++++++++++--
>  src/util/virsystemd.h    |  5 +++
>  tests/virsystemdtest.c   | 48 +++++++++++++++++++++++++
>  4 files changed, 144 insertions(+), 2 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index d9615ea..0247a46 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1935,6 +1935,8 @@ virSysinfoSetup;
>
>  # util/virsystemd.h
>  virSystemdCreateMachine;
> +virSystemdMakeScopeName;
> +virSystemdMakeSliceName;
>
>
>  # util/virthread.h
> diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
> index 11d1153..251b846 100644
> --- a/src/util/virsystemd.c
> +++ b/src/util/virsystemd.c
> @@ -27,9 +27,96 @@
>  #include "viralloc.h"
>  #include "virutil.h"
>  #include "virlog.h"
> +#include "virerror.h"
>
>  #define VIR_FROM_THIS VIR_FROM_SYSTEMD
>
> +
> +static void virSystemdEscapeName(virBufferPtr buf,
> +                                 const char *name)
> +{
> +    static const char hextable[16] = "0123456789abcdef";
> +
> +#define ESCAPE(c)                                                       \
> +    do {                                                                \
> +        virBufferAddChar(buf, '\\');                                    \
> +        virBufferAddChar(buf, 'x');                                     \
> +        virBufferAddChar(buf, hextable[(c >> 4) & 15]);                 \
> +        virBufferAddChar(buf, hextable[c & 15]);                        \
> +    } while (0)
> +
> +#define VALID_CHARS                             \
> +        "0123456789"                            \
> +        "abcdefghijklmnopqrstuvwxyz"            \
> +        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"            \
> +        ":-_.\\"
> +
> +    if (*name == '.') {
> +        ESCAPE(*name);
> +        name++;
> +    }
> +
> +    while (*name) {
> +        if (*name == '/')
> +            virBufferAddChar(buf, '-');
> +        else if (*name == '-' ||
> +                 *name == '\\' ||
> +                 !strchr(VALID_CHARS, *name))
> +            ESCAPE(*name);
> +        else
> +            virBufferAddChar(buf, *name);
> +        name++;
> +    }
> +
> +#undef ESCAPE
> +#undef VALID_CHARS
> +}
> +
> +
> +char *virSystemdMakeScopeName(const char *name,
> +                              const char *drivername,
> +                              const char *partition)
> +{
> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
> +
> +    if (*partition == '/')
> +        partition++;
> +
> +    virSystemdEscapeName(&buf, partition);
> +    virBufferAddChar(&buf, '-');
> +    virSystemdEscapeName(&buf, drivername);
> +    virBufferAddLit(&buf, "\\x2d");

What is the idea behind this?
Now we end up with paths like:
/sys/fs/cgroup/memory/machine.slice/machine-lxc\x2dmyfunnycontainer.scope

-- 
Thanks,
//richard




More information about the libvir-list mailing list