[PATCH 03/43] virNWFilterBindingObjParse: Refactor XML parsing code

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


Remove the redundant root node checking and XPath context creation by
using virXMLParse properly.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/conf/virnwfilterbindingobj.c     | 65 +++++-----------------------
 src/conf/virnwfilterbindingobj.h     |  2 +-
 src/conf/virnwfilterbindingobjlist.c |  2 +-
 src/libvirt_private.syms             |  2 +-
 4 files changed, 14 insertions(+), 57 deletions(-)

diff --git a/src/conf/virnwfilterbindingobj.c b/src/conf/virnwfilterbindingobj.c
index cc6009d1f2..5ff53f7380 100644
--- a/src/conf/virnwfilterbindingobj.c
+++ b/src/conf/virnwfilterbindingobj.c
@@ -202,74 +202,31 @@ virNWFilterBindingObjDelete(const virNWFilterBindingObj *obj,
 }


-static virNWFilterBindingObj *
-virNWFilterBindingObjParseXML(xmlDocPtr doc,
-                              xmlXPathContextPtr ctxt)
+virNWFilterBindingObj *
+virNWFilterBindingObjParse(const char *filename)
 {
-    virNWFilterBindingObj *ret;
+    g_autoptr(virNWFilterBindingObj) ret = NULL;
+    g_autoptr(xmlDoc) xml = NULL;
+    g_autoptr(xmlXPathContext) ctxt = NULL;
     xmlNodePtr node;

+    if (!(xml = virXMLParse(filename, NULL, _("(nwfilterbinding_status)"),
+                            "filterbindingstatus", &ctxt, NULL, false)))
+        return NULL;
+
     if (!(ret = virNWFilterBindingObjNew()))
         return NULL;

     if (!(node = virXPathNode("./filterbinding", ctxt))) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("filter binding status missing content"));
-        goto cleanup;
-    }
-
-    if (!(ret->def = virNWFilterBindingDefParseNode(doc, node)))
-        goto cleanup;
-
-    return ret;
-
- cleanup:
-    virObjectUnref(ret);
-    return NULL;
-}
-
-
-static virNWFilterBindingObj *
-virNWFilterBindingObjParseNode(xmlDocPtr doc,
-                               xmlNodePtr root)
-{
-    g_autoptr(xmlXPathContext) ctxt = NULL;
-
-    if (STRNEQ((const char *)root->name, "filterbindingstatus")) {
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("unknown root element '%s' for filter binding"),
-                       root->name);
         return NULL;
     }

-    if (!(ctxt = virXMLXPathContextNew(doc)))
+    if (!(ret->def = virNWFilterBindingDefParseNode(xml, node)))
         return NULL;

-    ctxt->node = root;
-    return virNWFilterBindingObjParseXML(doc, ctxt);
-}
-
-
-static virNWFilterBindingObj *
-virNWFilterBindingObjParse(const char *xmlStr,
-                           const char *filename)
-{
-    virNWFilterBindingObj *obj = NULL;
-    g_autoptr(xmlDoc) xml = NULL;
-
-    if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_status)"),
-                           NULL, NULL, NULL, false))) {
-        obj = virNWFilterBindingObjParseNode(xml, xmlDocGetRootElement(xml));
-    }
-
-    return obj;
-}
-
-
-virNWFilterBindingObj *
-virNWFilterBindingObjParseFile(const char *filename)
-{
-    return virNWFilterBindingObjParse(NULL, filename);
+    return g_steal_pointer(&ret);
 }


diff --git a/src/conf/virnwfilterbindingobj.h b/src/conf/virnwfilterbindingobj.h
index 17f855bda1..33aa575436 100644
--- a/src/conf/virnwfilterbindingobj.h
+++ b/src/conf/virnwfilterbindingobj.h
@@ -64,7 +64,7 @@ virNWFilterBindingObjDelete(const virNWFilterBindingObj *obj,
                             const char *statusDir);

 virNWFilterBindingObj *
-virNWFilterBindingObjParseFile(const char *filename);
+virNWFilterBindingObjParse(const char *filename);

 char *
 virNWFilterBindingObjFormat(const virNWFilterBindingObj *obj);
diff --git a/src/conf/virnwfilterbindingobjlist.c b/src/conf/virnwfilterbindingobjlist.c
index 9a46fa06b9..a349f5c195 100644
--- a/src/conf/virnwfilterbindingobjlist.c
+++ b/src/conf/virnwfilterbindingobjlist.c
@@ -266,7 +266,7 @@ virNWFilterBindingObjListLoadStatus(virNWFilterBindingObjList *bindings,
     if ((statusFile = virNWFilterBindingObjConfigFile(statusDir, name)) == NULL)
         goto error;

-    if (!(obj = virNWFilterBindingObjParseFile(statusFile)))
+    if (!(obj = virNWFilterBindingObjParse(statusFile)))
         goto error;

     def = virNWFilterBindingObjGetDef(obj);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5be40dbefe..11862bb1a9 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1377,7 +1377,7 @@ virNWFilterBindingObjFormat;
 virNWFilterBindingObjGetDef;
 virNWFilterBindingObjGetRemoving;
 virNWFilterBindingObjNew;
-virNWFilterBindingObjParseFile;
+virNWFilterBindingObjParse;
 virNWFilterBindingObjSave;
 virNWFilterBindingObjSetDef;
 virNWFilterBindingObjSetRemoving;
-- 
2.37.3



More information about the libvir-list mailing list