mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
domain_conf: Refactor virDomainDeviceInfoParseXML to use XPath
Currently, virDomainDeviceInfoParseXML() uses node->children evaluation which is too verbose. Use XPath evaluation which is nicer. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
df3359fb18
commit
e6c6efc208
@ -6637,77 +6637,51 @@ virDomainDeviceAliasIsUserAlias(const char *aliasStr)
|
|||||||
static int
|
static int
|
||||||
virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
|
virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
|
||||||
xmlNodePtr node,
|
xmlNodePtr node,
|
||||||
xmlXPathContextPtr ctxt G_GNUC_UNUSED,
|
xmlXPathContextPtr ctxt,
|
||||||
virDomainDeviceInfoPtr info,
|
virDomainDeviceInfoPtr info,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
xmlNodePtr cur;
|
|
||||||
xmlNodePtr address = NULL;
|
xmlNodePtr address = NULL;
|
||||||
xmlNodePtr master = NULL;
|
xmlNodePtr master = NULL;
|
||||||
xmlNodePtr alias = NULL;
|
|
||||||
xmlNodePtr boot = NULL;
|
xmlNodePtr boot = NULL;
|
||||||
xmlNodePtr rom = NULL;
|
xmlNodePtr rom = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
g_autofree char *romenabled = NULL;
|
g_autofree char *romenabled = NULL;
|
||||||
g_autofree char *rombar = NULL;
|
g_autofree char *rombar = NULL;
|
||||||
g_autofree char *aliasStr = NULL;
|
g_autofree char *aliasStr = NULL;
|
||||||
|
VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
||||||
|
|
||||||
virDomainDeviceInfoClear(info);
|
virDomainDeviceInfoClear(info);
|
||||||
|
ctxt->node = node;
|
||||||
|
|
||||||
cur = node->children;
|
if ((aliasStr = virXPathString("string(./alias/@name)", ctxt)))
|
||||||
while (cur != NULL) {
|
|
||||||
if (cur->type == XML_ELEMENT_NODE) {
|
|
||||||
if (alias == NULL &&
|
|
||||||
virXMLNodeNameEqual(cur, "alias")) {
|
|
||||||
alias = cur;
|
|
||||||
} else if (address == NULL &&
|
|
||||||
virXMLNodeNameEqual(cur, "address")) {
|
|
||||||
address = cur;
|
|
||||||
} else if (master == NULL &&
|
|
||||||
virXMLNodeNameEqual(cur, "master")) {
|
|
||||||
master = cur;
|
|
||||||
} else if (boot == NULL &&
|
|
||||||
(flags & VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT) &&
|
|
||||||
virXMLNodeNameEqual(cur, "boot")) {
|
|
||||||
boot = cur;
|
|
||||||
} else if (rom == NULL &&
|
|
||||||
(flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
|
|
||||||
virXMLNodeNameEqual(cur, "rom")) {
|
|
||||||
rom = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cur = cur->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (alias) {
|
|
||||||
aliasStr = virXMLPropString(alias, "name");
|
|
||||||
|
|
||||||
if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) ||
|
if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) ||
|
||||||
(xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_USER_ALIAS &&
|
(xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_USER_ALIAS &&
|
||||||
virDomainDeviceAliasIsUserAlias(aliasStr) &&
|
virDomainDeviceAliasIsUserAlias(aliasStr) &&
|
||||||
strspn(aliasStr, USER_ALIAS_CHARS) == strlen(aliasStr)))
|
strspn(aliasStr, USER_ALIAS_CHARS) == strlen(aliasStr)))
|
||||||
info->alias = g_steal_pointer(&aliasStr);
|
info->alias = g_steal_pointer(&aliasStr);
|
||||||
}
|
|
||||||
|
|
||||||
if (master) {
|
if ((master = virXPathNode("./master", ctxt))) {
|
||||||
info->mastertype = VIR_DOMAIN_CONTROLLER_MASTER_USB;
|
info->mastertype = VIR_DOMAIN_CONTROLLER_MASTER_USB;
|
||||||
if (virDomainDeviceUSBMasterParseXML(master, &info->master.usb) < 0)
|
if (virDomainDeviceUSBMasterParseXML(master, &info->master.usb) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boot) {
|
if (flags & VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT &&
|
||||||
|
(boot = virXPathNode("./boot", ctxt))) {
|
||||||
if (virDomainDeviceBootParseXML(boot, info))
|
if (virDomainDeviceBootParseXML(boot, info))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rom) {
|
if ((flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
|
||||||
if ((romenabled = virXMLPropString(rom, "enabled")) &&
|
(rom = virXPathNode("./rom", ctxt))) {
|
||||||
|
if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt)) &&
|
||||||
((info->romenabled = virTristateBoolTypeFromString(romenabled)) <= 0)) {
|
((info->romenabled = virTristateBoolTypeFromString(romenabled)) <= 0)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("unknown rom enabled value '%s'"), romenabled);
|
_("unknown rom enabled value '%s'"), romenabled);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if ((rombar = virXMLPropString(rom, "bar")) &&
|
if ((rombar = virXPathString("string(./rom/@bar)", ctxt)) &&
|
||||||
((info->rombar = virTristateSwitchTypeFromString(rombar)) <= 0)) {
|
((info->rombar = virTristateSwitchTypeFromString(rombar)) <= 0)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("unknown rom bar value '%s'"), rombar);
|
_("unknown rom bar value '%s'"), rombar);
|
||||||
@ -6723,7 +6697,7 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (address &&
|
if ((address = virXPathNode("./address", ctxt)) &&
|
||||||
virDomainDeviceAddressParseXML(address, info) < 0)
|
virDomainDeviceAddressParseXML(address, info) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user