[Libguestfs] [PATCH 5/7] add-domain: Refactor domain XML parsing code.

Matthew Booth mbooth at redhat.com
Thu Feb 28 15:22:45 UTC 2013


On Thu, 2013-02-28 at 10:57 +0000, Richard W.M. Jones wrote:
> From: "Richard W.M. Jones" <rjones at redhat.com>
> 
> This is just code motion.
> ---
>  src/libvirt-domain.c | 71 +++++++++++++++++++++++++---------------------------
>  1 file changed, 34 insertions(+), 37 deletions(-)
> 
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index ab776b3..3f5b1ed 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -40,7 +40,8 @@
>  
>  #if defined(HAVE_LIBVIRT) && defined(HAVE_LIBXML2)
>  
> -static ssize_t for_each_disk (guestfs_h *g, virDomainPtr dom, int (*f) (guestfs_h *g, const char *filename, const char *format, int readonly, void *data), void *data);
> +static xmlDocPtr get_domain_xml (guestfs_h *g, virDomainPtr dom);
> +static ssize_t for_each_disk (guestfs_h *g, xmlDocPtr doc, int (*f) (guestfs_h *g, const char *filename, const char *format, int readonly, void *data), void *data);
>  
>  static void
>  ignore_errors (void *ignore, virErrorPtr ignore2)
> @@ -167,6 +168,7 @@ guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
>    enum readonlydisk readonlydisk = readonlydisk_write;
>    size_t ckp;
>    struct add_disk_data data;
> +  CLEANUP_XMLFREEDOC xmlDocPtr doc = NULL;
>  
>    readonly =
>      optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK
> @@ -228,6 +230,10 @@ guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
>      }
>    }
>  
> +  /* Domain XML. */
> +  if ((doc = get_domain_xml (g, dom)) == NULL)
> +    return -1;
> +
>    /* Add the disks. */
>    data.optargs.bitmask = 0;
>    data.readonly = readonly;
> @@ -241,7 +247,7 @@ guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
>     * all disks are added or none are added.
>     */
>    ckp = guestfs___checkpoint_drives (g);
> -  r = for_each_disk (g, dom, add_disk, &data);
> +  r = for_each_disk (g, doc, add_disk, &data);
>    if (r == -1)
>      guestfs___rollback_drives (g, ckp);
>  
> @@ -303,29 +309,15 @@ static int
>  connect_live (guestfs_h *g, virDomainPtr dom)
>  {
>    int i;
> -  virErrorPtr err;
>    CLEANUP_XMLFREEDOC xmlDocPtr doc = NULL;
>    CLEANUP_XMLXPATHFREECONTEXT xmlXPathContextPtr xpathCtx = NULL;
>    CLEANUP_XMLXPATHFREEOBJECT xmlXPathObjectPtr xpathObj = NULL;
> -  CLEANUP_FREE char *xml = NULL, *path = NULL, *attach_method = NULL;
> +  CLEANUP_FREE char *path = NULL, *attach_method = NULL;
>    xmlNodeSetPtr nodes;
>  
>    /* Domain XML. */
> -  xml = virDomainGetXMLDesc (dom, 0);
> -
> -  if (!xml) {
> -    err = virGetLastError ();
> -    error (g, _("error reading libvirt XML information: %s"),
> -           err->message);
> +  if ((doc = get_domain_xml (g, dom)) == NULL)
>      return -1;
> -  }
> -
> -  /* Parse XML to document. */
> -  doc = xmlParseMemory (xml, strlen (xml));
> -  if (doc == NULL) {
> -    error (g, _("unable to parse XML information returned by libvirt"));
> -    return -1;
> -  }
>  
>    xpathCtx = xmlXPathNewContext (doc);
>    if (xpathCtx == NULL) {
> @@ -388,7 +380,7 @@ connect_live (guestfs_h *g, virDomainPtr dom)
>   */
>  static ssize_t
>  for_each_disk (guestfs_h *g,
> -               virDomainPtr dom,
> +               xmlDocPtr doc,
>                 int (*f) (guestfs_h *g,
>                           const char *filename, const char *format,
>                           int readonly,
> @@ -396,31 +388,13 @@ for_each_disk (guestfs_h *g,
>                 void *data)
>  {
>    size_t i, nr_added = 0, nr_nodes;
> -  virErrorPtr err;
> -  CLEANUP_XMLFREEDOC xmlDocPtr doc = NULL;
>    CLEANUP_XMLXPATHFREECONTEXT xmlXPathContextPtr xpathCtx = NULL;
>    CLEANUP_XMLXPATHFREEOBJECT xmlXPathObjectPtr xpathObj = NULL;
> -  CLEANUP_FREE char *xml = NULL;
>    xmlNodeSetPtr nodes;
>  
> -  /* Domain XML. */
> -  xml = virDomainGetXMLDesc (dom, 0);
> -
> -  if (!xml) {
> -    err = virGetLastError ();
> -    error (g, _("error reading libvirt XML information: %s"), err->message);
> -    return -1;
> -  }
> -
>    /* Now the horrible task of parsing out the fields we need from the XML.
>     * http://www.xmlsoft.org/examples/xpath1.c
>     */
> -  doc = xmlParseMemory (xml, strlen (xml));
> -  if (doc == NULL) {
> -    error (g, _("unable to parse XML information returned by libvirt"));
> -    return -1;
> -  }
> -
>    xpathCtx = xmlXPathNewContext (doc);
>    if (xpathCtx == NULL) {
>      error (g, _("unable to create new XPath context"));
> @@ -533,6 +507,29 @@ for_each_disk (guestfs_h *g,
>    return nr_added;
>  }
>  
> +static xmlDocPtr
> +get_domain_xml (guestfs_h *g, virDomainPtr dom)
> +{
> +  virErrorPtr err;
> +  xmlDocPtr doc;
> +
> +  CLEANUP_FREE char *xml = virDomainGetXMLDesc (dom, 0);
> +  if (!xml) {
> +    err = virGetLastError ();
> +    error (g, _("error reading libvirt XML information: %s"), err->message);
> +    return NULL;
> +  }
> +
> +  /* Parse the domain XML into an XML document. */
> +  doc = xmlParseMemory (xml, strlen (xml));
> +  if (doc == NULL) {
> +    error (g, _("unable to parse XML information returned by libvirt"));
> +    return NULL;
> +  }
> +
> +  return doc;
> +}
> +
>  #else /* no libvirt or libxml2 at compile time */
>  
>  #define NOT_IMPL(r)                                                     \

ACK.

Matt




More information about the Libguestfs mailing list