This makes the function more consistent with
virDomainLoaderDefParseXML() by preferring the virXMLProp
class of functions to XPath access.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
src/conf/domain_conf.c | 49 ++++++++++++++++++++++++------------------
1 file changed, 28 insertions(+), 21 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d60985cb85..858242b3ae 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -17994,43 +17994,45 @@ virDomainDefMaybeAddHostdevSCSIcontroller(virDomainDef *def)
static int
virDomainLoaderDefParseXMLNvram(virDomainLoaderDef *loader,
+ xmlNodePtr nvramNode,
+ xmlNodePtr nvramSourceNode,
xmlXPathContextPtr ctxt,
virDomainXMLOption *xmlopt,
unsigned int flags,
bool fwAutoSelect)
{
- g_autofree char *nvramType = virXPathString("string(./os/nvram/@type)",
ctxt);
g_autoptr(virStorageSource) src = virStorageSourceNew();
+ int typePresent;
+
+ if (!nvramNode)
+ return 0;
if (!fwAutoSelect)
- loader->nvramTemplate =
virXPathString("string(./os/nvram[1]/@template)", ctxt);
+ loader->nvramTemplate = virXMLPropString(nvramNode, "template");
src->format = VIR_STORAGE_FILE_RAW;
- if (!nvramType) {
- char *nvramPath = NULL;
-
- if (!(nvramPath = virXPathString("string(./os/nvram[1])", ctxt)))
- return 0; /* no nvram */
+ if ((typePresent = virXMLPropEnum(nvramNode, "type",
+ virStorageTypeFromString, VIR_XML_PROP_NONE,
+ &src->type)) < 0)
+ return -1;
- src->path = nvramPath;
- src->type = VIR_STORAGE_TYPE_FILE;
- } else {
- xmlNodePtr sourceNode;
+ if (!typePresent) {
+ g_autofree char *path = NULL;
- if ((src->type = virStorageTypeFromString(nvramType)) <= 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown disk type '%s'"), nvramType);
+ if (!(path = virXMLNodeContentString(nvramNode)))
return -1;
- }
- if (!(sourceNode = virXPathNode("./os/nvram/source[1]", ctxt))) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing source element for nvram"));
+ if (STREQ(path, ""))
+ return 0;
+
+ src->type = VIR_STORAGE_TYPE_FILE;
+ src->path = g_steal_pointer(&path);
+ } else {
+ if (!nvramSourceNode)
return -1;
- }
- if (virDomainStorageSourceParse(sourceNode, ctxt, src, flags, xmlopt) < 0)
+ if (virDomainStorageSourceParse(nvramSourceNode, ctxt, src, flags, xmlopt) <
0)
return -1;
loader->newStyleNVRAM = true;
@@ -18044,6 +18046,8 @@ virDomainLoaderDefParseXMLNvram(virDomainLoaderDef *loader,
static int
virDomainLoaderDefParseXML(virDomainLoaderDef *loader,
xmlNodePtr loaderNode,
+ xmlNodePtr nvramNode,
+ xmlNodePtr nvramSourceNode,
xmlXPathContextPtr ctxt,
virDomainXMLOption *xmlopt,
unsigned int flags,
@@ -18070,6 +18074,7 @@ virDomainLoaderDefParseXML(virDomainLoaderDef *loader,
return -1;
if (virDomainLoaderDefParseXMLNvram(loader,
+ nvramNode, nvramSourceNode,
ctxt, xmlopt, flags,
fwAutoSelect) < 0)
return -1;
@@ -18468,6 +18473,8 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def,
unsigned int flags)
{
xmlNodePtr loaderNode = virXPathNode("./os/loader[1]", ctxt);
+ xmlNodePtr nvramNode = virXPathNode("./os/nvram[1]", ctxt);
+ xmlNodePtr nvramSourceNode = virXPathNode("./os/nvram/source[1]", ctxt);
const bool fwAutoSelect = def->os.firmware != VIR_DOMAIN_OS_DEF_FIRMWARE_NONE;
if (!loaderNode)
@@ -18476,7 +18483,7 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def,
def->os.loader = g_new0(virDomainLoaderDef, 1);
if (virDomainLoaderDefParseXML(def->os.loader,
- loaderNode,
+ loaderNode, nvramNode, nvramSourceNode,
ctxt, xmlopt, flags,
fwAutoSelect) < 0)
return -1;
--
2.35.3