提交 0b36d6cb 编写于 作者: P Pavel Hrdina

conf: use virXMLPropString for boot parsing

XPath is good for random search of elements, not for accessing
attributes of one node.
Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
上级 8cf6eb46
...@@ -16039,6 +16039,7 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt, ...@@ -16039,6 +16039,7 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
virDomainDefPtr def) virDomainDefPtr def)
{ {
xmlNodePtr *nodes = NULL; xmlNodePtr *nodes = NULL;
xmlNodePtr node;
size_t i; size_t i;
int n; int n;
char *tmp = NULL; char *tmp = NULL;
...@@ -16088,62 +16089,66 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt, ...@@ -16088,62 +16089,66 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
def->os.bootDevs[0] = VIR_DOMAIN_BOOT_DISK; def->os.bootDevs[0] = VIR_DOMAIN_BOOT_DISK;
} }
tmp = virXPathString("string(./os/bootmenu[1]/@enable)", ctxt); if ((node = virXPathNode("./os/bootmenu[1]", ctxt))) {
if (tmp) { tmp = virXMLPropString(node, "enable");
def->os.bootmenu = virTristateBoolTypeFromString(tmp); if (tmp) {
if (def->os.bootmenu <= 0) { def->os.bootmenu = virTristateBoolTypeFromString(tmp);
/* In order not to break misconfigured machines, this if (def->os.bootmenu <= 0) {
* should not emit an error, but rather set the bootmenu /* In order not to break misconfigured machines, this
* to disabled */ * should not emit an error, but rather set the bootmenu
VIR_WARN("disabling bootmenu due to unknown option '%s'", * to disabled */
tmp); VIR_WARN("disabling bootmenu due to unknown option '%s'",
def->os.bootmenu = VIR_TRISTATE_BOOL_NO; tmp);
} def->os.bootmenu = VIR_TRISTATE_BOOL_NO;
VIR_FREE(tmp); }
} VIR_FREE(tmp);
tmp = virXPathString("string(./os/bootmenu[1]/@timeout)", ctxt);
if (tmp && def->os.bootmenu == VIR_TRISTATE_BOOL_YES) {
if (virStrToLong_uip(tmp, NULL, 0, &def->os.bm_timeout) < 0 ||
def->os.bm_timeout > 65535) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("invalid value for boot menu timeout, "
"must be in range [0,65535]"));
goto cleanup;
} }
def->os.bm_timeout_set = true;
}
VIR_FREE(tmp);
tmp = virXPathString("string(./os/bios[1]/@useserial)", ctxt); tmp = virXMLPropString(node, "timeout");
if (tmp) { if (tmp && def->os.bootmenu == VIR_TRISTATE_BOOL_YES) {
if (STREQ(tmp, "yes")) { if (virStrToLong_uip(tmp, NULL, 0, &def->os.bm_timeout) < 0 ||
if (virXPathULong("count(./devices/serial)", def->os.bm_timeout > 65535) {
ctxt, &serialPorts) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("need at least one serial port " _("invalid value for boot menu timeout, "
"for useserial")); "must be in range [0,65535]"));
goto cleanup; goto cleanup;
} }
def->os.bios.useserial = VIR_TRISTATE_BOOL_YES; def->os.bm_timeout_set = true;
} else {
def->os.bios.useserial = VIR_TRISTATE_BOOL_NO;
} }
VIR_FREE(tmp); VIR_FREE(tmp);
} }
tmp = virXPathString("string(./os/bios[1]/@rebootTimeout)", ctxt); if ((node = virXPathNode("./os/bios[1]", ctxt))) {
if (tmp) { tmp = virXMLPropString(node, "useserial");
/* that was really just for the check if it is there */ if (tmp) {
if (STREQ(tmp, "yes")) {
if (virXPathULong("count(./devices/serial)",
ctxt, &serialPorts) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("need at least one serial port "
"for useserial"));
goto cleanup;
}
def->os.bios.useserial = VIR_TRISTATE_BOOL_YES;
} else {
def->os.bios.useserial = VIR_TRISTATE_BOOL_NO;
}
VIR_FREE(tmp);
}
if (virStrToLong_i(tmp, NULL, 0, &def->os.bios.rt_delay) < 0 || tmp = virXMLPropString(node, "rebootTimeout");
def->os.bios.rt_delay < -1 || def->os.bios.rt_delay > 65535) { if (tmp) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", /* that was really just for the check if it is there */
_("invalid value for rebootTimeout, "
"must be in range [-1,65535]")); if (virStrToLong_i(tmp, NULL, 0, &def->os.bios.rt_delay) < 0 ||
goto cleanup; def->os.bios.rt_delay < -1 || def->os.bios.rt_delay > 65535) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("invalid value for rebootTimeout, "
"must be in range [-1,65535]"));
goto cleanup;
}
def->os.bios.rt_set = true;
} }
def->os.bios.rt_set = true;
} }
ret = 0; ret = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册