[PATCH 34/43] virDomainDefParseNode: Pass only the XPath context as argument

Peter Krempa pkrempa at redhat.com
Tue Oct 4 08:33:08 UTC 2022


Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/conf/checkpoint_conf.c       |  6 ++++--
 src/conf/domain_conf.c           | 11 ++---------
 src/conf/domain_conf.h           |  3 +--
 src/conf/snapshot_conf.c         | 16 ++++++++++------
 src/qemu/qemu_migration_cookie.c | 10 ++++++----
 src/test/test_driver.c           |  8 ++++----
 tests/qemuxml2argvtest.c         |  3 +--
 7 files changed, 28 insertions(+), 29 deletions(-)

diff --git a/src/conf/checkpoint_conf.c b/src/conf/checkpoint_conf.c
index ea20bfdd14..6656089457 100644
--- a/src/conf/checkpoint_conf.c
+++ b/src/conf/checkpoint_conf.c
@@ -153,11 +153,13 @@ virDomainCheckpointDefParse(xmlXPathContextPtr ctxt,
         def->parent.parent_name = virXPathString("string(./parent/name)", ctxt);

         if ((domainNode = virXPathNode("./domain", ctxt))) {
+            VIR_XPATH_NODE_AUTORESTORE(ctxt)
             unsigned int domainParseFlags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
                                             VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE;

-            def->parent.dom = virDomainDefParseNode(ctxt->node->doc, domainNode,
-                                                    xmlopt, parseOpaque,
+            ctxt->node = domainNode;
+
+            def->parent.dom = virDomainDefParseNode(ctxt, xmlopt, parseOpaque,
                                                     domainParseFlags);
             if (!def->parent.dom)
                 return NULL;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bd882039e7..bf165d0a64 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -19092,7 +19092,7 @@ virDomainDefParse(const char *xmlStr,
     if (!xml)
         return NULL;

-    return virDomainDefParseNode(xml, ctxt->node, xmlopt, parseOpaque, flags);
+    return virDomainDefParseNode(ctxt, xmlopt, parseOpaque, flags);
 }

 virDomainDef *
@@ -19115,20 +19115,13 @@ virDomainDefParseFile(const char *filename,


 virDomainDef *
-virDomainDefParseNode(xmlDocPtr xml,
-                      xmlNodePtr root,
+virDomainDefParseNode(xmlXPathContext *ctxt,
                       virDomainXMLOption *xmlopt,
                       void *parseOpaque,
                       unsigned int flags)
 {
-    g_autoptr(xmlXPathContext) ctxt = NULL;
     g_autoptr(virDomainDef) def = NULL;

-    if (!(ctxt = virXMLXPathContextNew(xml)))
-        return NULL;
-
-    ctxt->node = root;
-
     if (!(def = virDomainDefParseXML(ctxt, xmlopt, flags)))
         return NULL;

diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6eab1056c1..8f8a54bc41 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3612,8 +3612,7 @@ virDomainDef *virDomainDefParseFile(const char *filename,
                                     virDomainXMLOption *xmlopt,
                                     void *parseOpaque,
                                     unsigned int flags);
-virDomainDef *virDomainDefParseNode(xmlDocPtr doc,
-                                    xmlNodePtr root,
+virDomainDef *virDomainDefParseNode(xmlXPathContext *ctxt,
                                     virDomainXMLOption *xmlopt,
                                     void *parseOpaque,
                                     unsigned int flags);
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index afdc11876d..4b5b908d66 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -266,15 +266,15 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
          * clients will have to decide between best effort
          * initialization or outright failure.  */
         if ((domtype = virXPathString("string(./domain/@type)", ctxt))) {
-            xmlNodePtr domainNode = virXPathNode("./domain", ctxt);
+            VIR_XPATH_NODE_AUTORESTORE(ctxt)

-            if (!domainNode) {
+            if (!(ctxt->node = virXPathNode("./domain", ctxt))) {
                 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                                _("missing domain in snapshot"));
                 return NULL;
             }
-            def->parent.dom = virDomainDefParseNode(ctxt->node->doc, domainNode,
-                                                    xmlopt, parseOpaque,
+
+            def->parent.dom = virDomainDefParseNode(ctxt, xmlopt, parseOpaque,
                                                     domainflags);
             if (!def->parent.dom)
                 return NULL;
@@ -286,8 +286,12 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
          * VM. In case of absent, leave parent.inactiveDom NULL and use
          * parent.dom for config and live XML. */
         if ((inactiveDomNode = virXPathNode("./inactiveDomain", ctxt))) {
-            def->parent.inactiveDom = virDomainDefParseNode(ctxt->node->doc, inactiveDomNode,
-                                                            xmlopt, NULL, domainflags);
+            VIR_XPATH_NODE_AUTORESTORE(ctxt)
+
+            ctxt->node = inactiveDomNode;
+
+            def->parent.inactiveDom = virDomainDefParseNode(ctxt, xmlopt, NULL,
+                                                            domainflags);
             if (!def->parent.inactiveDom)
                 return NULL;
         }
diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
index a4e018e204..95e803b3e1 100644
--- a/src/qemu/qemu_migration_cookie.c
+++ b/src/qemu/qemu_migration_cookie.c
@@ -1261,7 +1261,6 @@ static int
 qemuMigrationCookieXMLParse(qemuMigrationCookie *mig,
                             virQEMUDriver *driver,
                             virQEMUCaps *qemuCaps,
-                            xmlDocPtr doc,
                             xmlXPathContextPtr ctxt,
                             unsigned int flags)
 {
@@ -1356,6 +1355,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookie *mig,

     if ((flags & QEMU_MIGRATION_COOKIE_PERSISTENT) &&
         virXPathBoolean("count(./domain) > 0", ctxt)) {
+        VIR_XPATH_NODE_AUTORESTORE(ctxt)
         g_autofree xmlNodePtr *nodes = NULL;

         if ((virXPathNodeSet("./domain", ctxt, &nodes)) != 1) {
@@ -1363,8 +1363,10 @@ qemuMigrationCookieXMLParse(qemuMigrationCookie *mig,
                            _("Too many domain elements in migration cookie"));
             return -1;
         }
-        mig->persistent = virDomainDefParseNode(doc, nodes[0],
-                                                driver->xmlopt, qemuCaps,
+
+        ctxt->node = nodes[0];
+
+        mig->persistent = virDomainDefParseNode(ctxt, driver->xmlopt, qemuCaps,
                                                 VIR_DOMAIN_DEF_PARSE_INACTIVE |
                                                 VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION |
                                                 VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
@@ -1420,7 +1422,7 @@ qemuMigrationCookieXMLParseStr(qemuMigrationCookie *mig,
     if (!(doc = virXMLParseStringCtxt(xml, _("(qemu_migration_cookie)"), &ctxt)))
         return -1;

-    return qemuMigrationCookieXMLParse(mig, driver, qemuCaps, doc, ctxt, flags);
+    return qemuMigrationCookieXMLParse(mig, driver, qemuCaps, ctxt, flags);
 }


diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 9f0517e89e..373e5f7846 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1019,14 +1019,14 @@ testParseDomains(testDriver *privconn,
         return -1;

     for (i = 0; i < num; i++) {
+        VIR_XPATH_NODE_AUTORESTORE(ctxt)
         g_autoptr(virDomainDef) def = NULL;
         testDomainNamespaceDef *nsdata;
-        xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file);
-        if (!node)
+
+        if (!(ctxt->node = testParseXMLDocFromFile(nodes[i], file)))
             goto error;

-        def = virDomainDefParseNode(ctxt->doc, node,
-                                    privconn->xmlopt, NULL,
+        def = virDomainDefParseNode(ctxt, privconn->xmlopt, NULL,
                                     VIR_DOMAIN_DEF_PARSE_INACTIVE);
         if (!def)
             goto error;
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 8785c96ce1..cad4c1abd5 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -709,8 +709,7 @@ testCompareXMLToArgv(const void *data)

     parseFlags |= VIR_DOMAIN_DEF_PARSE_INACTIVE;

-    if (!(vm->def = virDomainDefParseNode(xml, ctxt->node, driver.xmlopt, NULL,
-                                          parseFlags))) {
+    if (!(vm->def = virDomainDefParseNode(ctxt, driver.xmlopt, NULL, parseFlags))) {
         err = virGetLastError();
         if (!err) {
             VIR_TEST_DEBUG("no error was reported for expected parse error");
-- 
2.37.3



More information about the libvir-list mailing list