[libvirt] [PATCH v2 1/4] conf: Make virDomainLoaderDefParseXML parse <nvram/> too

Laszlo Ersek lersek at redhat.com
Tue Jan 13 18:47:48 UTC 2015


On 01/13/15 18:20, Michal Privoznik wrote:
> This is pure code movement without any functional change.
> The code simply reads better this way, that's all.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/conf/domain_conf.c | 23 ++++++++++++++---------
>  1 file changed, 14 insertions(+), 9 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 3cbb93d..ae18255 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -12617,16 +12617,17 @@ virDomainDefMaybeAddHostdevSCSIcontroller(virDomainDefPtr def)
>  }
>  
>  static int
> -virDomainLoaderDefParseXML(xmlNodePtr node,
> +virDomainLoaderDefParseXML(xmlNodePtr loader_node,
> +                           xmlNodePtr nvram_node,
>                             virDomainLoaderDefPtr loader)
>  {
>      int ret = -1;
>      char *readonly_str = NULL;
>      char *type_str = NULL;
>  
> -    readonly_str = virXMLPropString(node, "readonly");
> -    type_str = virXMLPropString(node, "type");
> -    loader->path = (char *) xmlNodeGetContent(node);
> +    readonly_str = virXMLPropString(loader_node, "readonly");
> +    type_str = virXMLPropString(loader_node, "type");
> +    loader->path = (char *) xmlNodeGetContent(loader_node);
>  
>      if (readonly_str &&
>          (loader->readonly = virTristateBoolTypeFromString(readonly_str)) <= 0) {
> @@ -12645,6 +12646,11 @@ virDomainLoaderDefParseXML(xmlNodePtr node,
>          loader->type = type;
>      }
>  
> +    if (nvram_node) {
> +        loader->nvram = (char *)xmlNodeGetContent(nvram_node);
> +        loader->templt = virXMLPropString(nvram_node, "template");
> +    }
> +
>      ret = 0;
>   cleanup:
>      VIR_FREE(readonly_str);
> @@ -13735,7 +13741,7 @@ virDomainDefParseXML(xmlDocPtr xml,
>      if (STREQ(def->os.type, "xen") ||
>          STREQ(def->os.type, "hvm") ||
>          STREQ(def->os.type, "uml")) {
> -        xmlNodePtr loader_node;
> +        xmlNodePtr loader_node, nvram_node;
>  
>          def->os.kernel = virXPathString("string(./os/kernel[1])", ctxt);
>          def->os.initrd = virXPathString("string(./os/initrd[1])", ctxt);
> @@ -13746,11 +13752,10 @@ virDomainDefParseXML(xmlDocPtr xml,
>              if (VIR_ALLOC(def->os.loader) < 0)
>                  goto error;
>  
> -            if (virDomainLoaderDefParseXML(loader_node, def->os.loader) < 0)
> -                goto error;
> +            nvram_node = virXPathNode("./os/nvram[1]", ctxt);
>  
> -            def->os.loader->nvram = virXPathString("string(./os/nvram[1])", ctxt);
> -            def->os.loader->templt = virXPathString("string(./os/nvram[1]/@template)", ctxt);
> +            if (virDomainLoaderDefParseXML(loader_node, nvram_node, def->os.loader) < 0)
> +                goto error;
>          }
>      }
>  
> 

You turned the two invocations of virXPathString() into a call to
xmlNodeGetContent() and another to virXMLPropString(). I tried to verify
if the cases when the former function returns NULL are identical to the
cases when the latter functions return NULL. I'm not 100% sure, but quite.

In particular, virXPathString() returns NULL for an empty XPath string
(see (obj->stringval[0] == 0) in it), which quite explains the string()
conversion inside the XPath expression (pre-patch).

Post-patch, I'm unsure. The nvram_node assignment looks okay I guess.

The other two calls:
- http://xmlsoft.org/html/libxml-tree.html#xmlNodeGetContent
- http://xmlsoft.org/html/libxml-tree.html#xmlGetProp
  (wrapped by virXMLPropString())

are dubious, especially for the template assignment. Pre-patch, an empty
string in the XML stored a NULL, post-patch, I'm unsure if an empty
string in the XML can return "" rather than NULL.

I can ACK this if you clean up my doubts :)

(You can justify the code simply by testing empty content and empty
attribute value too.)

Thanks
Laszlo




More information about the libvir-list mailing list