[PATCH 1/3] conf: propagate xmlDocPtr and flags into virInterfaceDefParseXML()

Kristina Hanicova khanicov at redhat.com
Fri Aug 6 13:08:14 UTC 2021


We need to know if validation flag is present in order to
validate given XML against schema in virInterfaceDefParseXML().

Signed-off-by: Kristina Hanicova <khanicov at redhat.com>
---
 src/conf/interface_conf.c               | 29 +++++++++++++++----------
 src/conf/interface_conf.h               |  6 +++--
 src/conf/virinterfaceobj.c              |  2 +-
 src/interface/interface_backend_netcf.c |  4 ++--
 src/test/test_driver.c                  |  4 ++--
 tests/interfacexml2xmltest.c            |  2 +-
 6 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index d84ec66def..7b0cfa6562 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -38,7 +38,8 @@ VIR_ENUM_IMPL(virInterface,
 );
 
 static virInterfaceDef *
-virInterfaceDefParseXML(xmlXPathContextPtr ctxt, int parentIfType);
+virInterfaceDefParseXML(xmlXPathContextPtr ctxt, int parentIfType,
+                        xmlDocPtr xml, unsigned int flags);
 
 static int
 virInterfaceDefDevFormat(virBuffer *buf, const virInterfaceDef *def,
@@ -521,7 +522,7 @@ virInterfaceDefParseBridge(virInterfaceDef *def,
 
         for (i = 0; i < nbItf; i++) {
             ctxt->node = interfaces[i];
-            itf = virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_BRIDGE);
+            itf = virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_BRIDGE, NULL, 0);
             if (itf == NULL) {
                 ret = -1;
                 def->data.bridge.nbItf = i;
@@ -565,7 +566,7 @@ virInterfaceDefParseBondItfs(virInterfaceDef *def,
 
     for (i = 0; i < nbItf; i++) {
         ctxt->node = interfaces[i];
-        itf = virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_BOND);
+        itf = virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_BOND, NULL, 0);
         if (itf == NULL) {
             def->data.bond.nbItf = i;
             goto cleanup;
@@ -677,7 +678,9 @@ virInterfaceDefParseVlan(virInterfaceDef *def,
 
 static virInterfaceDef *
 virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
-                        int parentIfType)
+                        int parentIfType,
+                        xmlDocPtr xml G_GNUC_UNUSED,
+                        unsigned int flags)
 {
     virInterfaceDef *def;
     int type;
@@ -685,6 +688,7 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
     xmlNodePtr lnk;
 
+    virCheckFlags(0, NULL);
 
     /* check @type */
     tmp = virXPathString("string(./@type)", ctxt);
@@ -797,7 +801,8 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
 
 virInterfaceDef *
 virInterfaceDefParseNode(xmlDocPtr xml,
-                         xmlNodePtr root)
+                         xmlNodePtr root,
+                         unsigned int flags)
 {
     g_autoptr(xmlXPathContext) ctxt = NULL;
 
@@ -813,19 +818,20 @@ virInterfaceDefParseNode(xmlDocPtr xml,
         return NULL;
 
     ctxt->node = root;
-    return virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_LAST);
+    return virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_LAST, xml, flags);
 }
 
 
 static virInterfaceDef *
 virInterfaceDefParse(const char *xmlStr,
-                     const char *filename)
+                     const char *filename,
+                     unsigned int flags)
 {
     xmlDocPtr xml;
     virInterfaceDef *def = NULL;
 
     if ((xml = virXMLParse(filename, xmlStr, _("(interface_definition)")))) {
-        def = virInterfaceDefParseNode(xml, xmlDocGetRootElement(xml));
+        def = virInterfaceDefParseNode(xml, xmlDocGetRootElement(xml), flags);
         xmlFreeDoc(xml);
     }
 
@@ -834,16 +840,17 @@ virInterfaceDefParse(const char *xmlStr,
 
 
 virInterfaceDef *
-virInterfaceDefParseString(const char *xmlStr)
+virInterfaceDefParseString(const char *xmlStr,
+                           unsigned int flags)
 {
-    return virInterfaceDefParse(xmlStr, NULL);
+    return virInterfaceDefParse(xmlStr, NULL, flags);
 }
 
 
 virInterfaceDef *
 virInterfaceDefParseFile(const char *filename)
 {
-    return virInterfaceDefParse(NULL, filename);
+    return virInterfaceDefParse(NULL, filename, 0);
 }
 
 
diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
index f5e802736b..15819b000f 100644
--- a/src/conf/interface_conf.h
+++ b/src/conf/interface_conf.h
@@ -155,14 +155,16 @@ void
 virInterfaceDefFree(virInterfaceDef *def);
 
 virInterfaceDef *
-virInterfaceDefParseString(const char *xmlStr);
+virInterfaceDefParseString(const char *xmlStr,
+                           unsigned int flags);
 
 virInterfaceDef *
 virInterfaceDefParseFile(const char *filename);
 
 virInterfaceDef *
 virInterfaceDefParseNode(xmlDocPtr xml,
-                         xmlNodePtr root);
+                         xmlNodePtr root,
+                         unsigned int flags);
 
 char *
 virInterfaceDefFormat(const virInterfaceDef *def);
diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
index a73208f1fc..9439bb3d0b 100644
--- a/src/conf/virinterfaceobj.c
+++ b/src/conf/virinterfaceobj.c
@@ -373,7 +373,7 @@ virInterfaceObjListCloneCb(void *payload,
     if (!(xml = virInterfaceDefFormat(srcObj->def)))
         goto error;
 
-    if (!(backup = virInterfaceDefParseString(xml)))
+    if (!(backup = virInterfaceDefParseString(xml, 0)))
         goto error;
     VIR_FREE(xml);
 
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 416e0af36f..9f93cdd657 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -862,7 +862,7 @@ static char *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
         goto cleanup;
     }
 
-    ifacedef = virInterfaceDefParseString(xmlstr);
+    ifacedef = virInterfaceDefParseString(xmlstr, 0);
     if (!ifacedef) {
         /* error was already reported */
         goto cleanup;
@@ -898,7 +898,7 @@ static virInterfacePtr netcfInterfaceDefineXML(virConnectPtr conn,
 
     virObjectLock(driver);
 
-    ifacedef = virInterfaceDefParseString(xml);
+    ifacedef = virInterfaceDefParseString(xml, 0);
     if (!ifacedef) {
         /* error was already reported */
         goto cleanup;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 16d70d9025..149d1afdad 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1113,7 +1113,7 @@ testParseInterfaces(testDriver *privconn,
         if (!node)
             return -1;
 
-        def = virInterfaceDefParseNode(ctxt->doc, node);
+        def = virInterfaceDefParseNode(ctxt->doc, node, 0);
         if (!def)
             return -1;
 
@@ -6074,7 +6074,7 @@ testInterfaceDefineXML(virConnectPtr conn,
     virCheckFlags(0, NULL);
 
     virObjectLock(privconn);
-    if ((def = virInterfaceDefParseString(xmlStr)) == NULL)
+    if ((def = virInterfaceDefParseString(xmlStr, flags)) == NULL)
         goto cleanup;
 
     if ((obj = virInterfaceObjListAssignDef(privconn->ifaces, def)) == NULL)
diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c
index 07d179e3a3..3785467f84 100644
--- a/tests/interfacexml2xmltest.c
+++ b/tests/interfacexml2xmltest.c
@@ -24,7 +24,7 @@ testCompareXMLToXMLFiles(const char *xml)
     if (virTestLoadFile(xml, &xmlData) < 0)
         goto fail;
 
-    if (!(dev = virInterfaceDefParseString(xmlData)))
+    if (!(dev = virInterfaceDefParseString(xmlData, 0)))
         goto fail;
 
     if (!(actual = virInterfaceDefFormat(dev)))
-- 
2.31.1




More information about the libvir-list mailing list