[libvirt] [PATCH v2 1/8] cpu: allow include files for CPU definition

Jiri Denemark jdenemar at redhat.com
Fri Aug 24 16:19:44 UTC 2018


On Thu, Aug 16, 2018 at 13:10:24 +0100, Daniel P. Berrangé wrote:
> Allow for syntax
> 
>     <include filename="subdir/fooo.xml"/>
> 
> to reference other files in the CPU database directory
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/cpu/cpu_map.c | 87 +++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 84 insertions(+), 3 deletions(-)
> 
> diff --git a/src/cpu/cpu_map.c b/src/cpu/cpu_map.c
> index d263eb8cdd..bcd3e55417 100644
> --- a/src/cpu/cpu_map.c
> +++ b/src/cpu/cpu_map.c
> @@ -1,7 +1,7 @@
>  /*
>   * cpu_map.c: internal functions for handling CPU mapping configuration
>   *
> - * Copyright (C) 2009-2010 Red Hat, Inc.
> + * Copyright (C) 2009-2018 Red Hat, Inc.
>   *
>   * This library is free software; you can redistribute it and/or
>   * modify it under the terms of the GNU Lesser General Public
> @@ -70,6 +70,84 @@ static int load(xmlXPathContextPtr ctxt,
>      return ret;
>  }
>  
> +static int
> +cpuMapLoadInclude(const char *filename,
> +                  cpuMapLoadCallback cb,
> +                  void *data)
> +{
> +    xmlDocPtr xml = NULL;
> +    xmlXPathContextPtr ctxt = NULL;
> +    int ret = -1;
> +    int element;
> +    char *mapfile;
> +
> +    if (!(mapfile = virFileFindResource(filename,
> +                                        abs_topsrcdir "/src/cpu",
> +                                        PKGDATADIR)))
> +        return -1;
> +
> +    VIR_DEBUG("Loading CPU map include from %s", mapfile);
> +
> +    if (!(xml = virXMLParseFileCtxt(mapfile, &ctxt)))
> +        goto cleanup;
> +
> +    ctxt->node = xmlDocGetRootElement(xml);
> +
> +    for (element = 0; element < CPU_MAP_ELEMENT_LAST; element++) {
> +        if (load(ctxt, element, cb, data) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("cannot parse CPU map '%s'"), mapfile);
> +            goto cleanup;
> +        }
> +    }
> +
> +    ret = 0;
> +
> + cleanup:
> +    xmlXPathFreeContext(ctxt);
> +    xmlFreeDoc(xml);
> +    VIR_FREE(mapfile);
> +
> +    return ret;
> +}
> +
> +
> +static int
> +loadIncludes(xmlXPathContextPtr ctxt,
> +             cpuMapLoadCallback callback,
> +             void *data)
> +{
> +    int ret = -1;
> +    xmlNodePtr ctxt_node;
> +    xmlNodePtr *nodes = NULL;
> +    int n;
> +    size_t i;
> +
> +    ctxt_node = ctxt->node;
> +
> +    n = virXPathNodeSet("include", ctxt, &nodes);
> +    if (n < 0)
> +        goto cleanup;
> +
> +    for (i = 0; i < n; i++) {
> +        char *filename = virXMLPropString(nodes[i], "filename");

Reporting an error if filename is NULL, i.e., when the filename
attribute is missing would be nice.

> +        VIR_DEBUG("Finding CPU map include '%s'", filename);
> +        if (cpuMapLoadInclude(filename, callback, data) < 0) {
> +            VIR_FREE(filename);
> +            goto cleanup;
> +        }
> +        VIR_FREE(filename);
> +    }
> +
> +    ret = 0;
...

With the NULL check
Reviewed-by: Jiri Denemark <jdenemar at redhat.com>




More information about the libvir-list mailing list