[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