[libvirt] [PATCH v2 02/18] util: Introduce xattr getter/setter/remover

Daniel P. Berrangé berrange at redhat.com
Thu Dec 6 11:30:44 UTC 2018


On Thu, Nov 29, 2018 at 02:52:17PM +0100, Michal Privoznik wrote:
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/libvirt_private.syms |   3 +
>  src/util/virfile.c       | 121 +++++++++++++++++++++++++++++++++++++++
>  src/util/virfile.h       |  11 ++++
>  3 files changed, 135 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 5018a13e9c..8e5b610ab1 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1827,6 +1827,7 @@ virFileGetACLs;
>  virFileGetHugepageSize;
>  virFileGetMountReverseSubtree;
>  virFileGetMountSubtree;
> +virFileGetXAtrr;

s/Atrr/Attr/

> @@ -1873,6 +1875,7 @@ virFileRewriteStr;
>  virFileSanitizePath;
>  virFileSetACLs;
>  virFileSetupDev;
> +virFileSetXAtrr;

s/Atrr/Attr/


> +#if HAVE_LIBATTR
> +/**
> + * virFileGetXAtrr;
> + * @path: a filename
> + * @name: name of xattr
> + * @value: read value
> + *
> + * Reads xattr with @name for given @path and stores it into
> + * @value. Caller is responsible for freeing @value.
> + *
> + * Returns: 0 on success,
> + *         -1 otherwise (with errno set).
> + */
> +int
> +virFileGetXAtrr(const char *path,
> +                const char *name,
> +                char **value)
> +{
> +    char *buf = NULL;
> +    int ret = -1;
> +
> +    /* We might be racing with somebody who sets the same attribute. */
> +    do {
> +        ssize_t need;
> +        ssize_t got;
> +
> +        /* The first call determines how many bytes we need to allocate. */
> +        if ((need = getxattr(path, name, NULL, 0)) < 0)
> +            goto cleanup;
> +
> +        if (VIR_REALLOC_N_QUIET(buf, need + 1) < 0)
> +            goto cleanup;
> +
> +        if ((got = getxattr(path, name, buf, need)) < 0) {
> +            if (errno == ERANGE)
> +                continue;
> +            goto cleanup;
> +        }
> +
> +        buf[got] = '\0';
> +        break;
> +    } while (1);

Nitpick, I'd expect the while(1) at the top. Only use this style of
loop when the checked loop condition would mistakenly prevent the first
iteration running.

> +
> +    VIR_STEAL_PTR(*value, buf);
> +    ret = 0;
> + cleanup:
> +    VIR_FREE(buf);
> +    return ret;
> +}

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list