]> xenbits.xensource.com Git - libvirt.git/commitdiff
virDomainDefParseNode: Pass only the XPath context as argument
authorPeter Krempa <pkrempa@redhat.com>
Fri, 23 Sep 2022 12:38:39 +0000 (14:38 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 6 Oct 2022 08:54:25 +0000 (10:54 +0200)
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/checkpoint_conf.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/snapshot_conf.c
src/qemu/qemu_migration_cookie.c
src/test/test_driver.c
tests/qemuxml2argvtest.c

index ea20bfdd14296595b35167bdc67ce921ea802409..665608945727fb7b42e171554bf7278d083637e4 100644 (file)
@@ -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;
index bd882039e77953b386ecc4f9de1a1d61025531cd..bf165d0a64fe485ed337977f6a8f5328a00df260 100644 (file)
@@ -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;
 
index 6eab1056c1625de4959a8c60422ab7514a95b6c4..8f8a54bc41f1aaa5ca88e8d740ceeec78e851c56 100644 (file)
@@ -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);
index afdc11876ddde6a541472118be5c30a91a1f72c6..4b5b908d66ccb0af9962721bf8735e46ce2ba806 100644 (file)
@@ -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;
         }
index a4e018e20493cedc6a09991731e81a22efae7332..95e803b3e18eebab6897972111de9c4990612859 100644 (file)
@@ -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);
 }
 
 
index 9f0517e89e54a4d11e0eb8fa82b19da6905c34eb..373e5f78468c8e38360c80509b7df0f3a317d17a 100644 (file)
@@ -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;
index 4722c79a4f8a41dd051c924fe78e6a20e730a877..f40eac4fe8fe024d2fd080fd1898b16ec96e2d2c 100644 (file)
@@ -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");