virNWFilterBindingObjParse: Refactor XML parsing code

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

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-09-22 15:06:40 +02:00
parent f8d36b3f97
commit 2597e16e29
4 changed files with 14 additions and 57 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -1377,7 +1377,7 @@ virNWFilterBindingObjFormat;
virNWFilterBindingObjGetDef;
virNWFilterBindingObjGetRemoving;
virNWFilterBindingObjNew;
virNWFilterBindingObjParseFile;
virNWFilterBindingObjParse;
virNWFilterBindingObjSave;
virNWFilterBindingObjSetDef;
virNWFilterBindingObjSetRemoving;