[PATCH v3 01/14] domain_conf: move boot timeouts check to domain_validate.c

Daniel Henrique Barboza danielhb413 at gmail.com
Tue Dec 8 22:20:17 UTC 2020


This patch creates a new function, virDomainDefBootValidate(), to host
the validation of boot menu timeout and rebootTimeout outside of parse
time. The checks in virDomainDefParseBootXML() were changed to throw
VIR_ERR_XML_ERROR in case of parse error of those values.

In an attempt to alleviate the amount of code being stacked inside
domain_conf.c, let's put this new function in a new domain_validate.c
file that will be used to place these validations.

Suggested-by: Michal Privoznik <mprivozn at redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
---
 po/POTFILES.in             |  1 +
 src/conf/domain_conf.c     | 20 +++++++--------
 src/conf/domain_validate.c | 51 ++++++++++++++++++++++++++++++++++++++
 src/conf/domain_validate.h | 27 ++++++++++++++++++++
 src/conf/meson.build       |  1 +
 tests/qemuxml2argvtest.c   |  3 ++-
 6 files changed, 92 insertions(+), 11 deletions(-)
 create mode 100644 src/conf/domain_validate.c
 create mode 100644 src/conf/domain_validate.h

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9782b2beb4..14636d4b93 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -26,6 +26,7 @@
 @SRCDIR at src/conf/domain_capabilities.c
 @SRCDIR at src/conf/domain_conf.c
 @SRCDIR at src/conf/domain_event.c
+ at SRCDIR@src/conf/domain_validate.c
 @SRCDIR at src/conf/interface_conf.c
 @SRCDIR at src/conf/netdev_bandwidth_conf.c
 @SRCDIR at src/conf/netdev_vlan_conf.c
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 66ee658e7b..4a45c76cf1 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -33,6 +33,7 @@
 #include "datatypes.h"
 #include "domain_addr.h"
 #include "domain_conf.h"
+#include "domain_validate.h"
 #include "snapshot_conf.h"
 #include "viralloc.h"
 #include "virxml.h"
@@ -7344,6 +7345,9 @@ virDomainDefValidateInternal(const virDomainDef *def,
     if (virDomainDefCputuneValidate(def) < 0)
         return -1;
 
+    if (virDomainDefBootValidate(def) < 0)
+        return -1;
+
     if (virDomainNumaDefValidate(def->numa) < 0)
         return -1;
 
@@ -18867,11 +18871,9 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
 
         tmp = virXMLPropString(node, "timeout");
         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]"));
+            if (virStrToLong_uip(tmp, NULL, 0, &def->os.bm_timeout) < 0) {
+                virReportError(VIR_ERR_XML_ERROR, "%s",
+                               _("invalid value for boot menu timeout"));
                 return -1;
             }
             def->os.bm_timeout_set = true;
@@ -18892,11 +18894,9 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
         if (tmp) {
             /* that was really just for the check if it is there */
 
-            if (virStrToLong_i(tmp, NULL, 0, &def->os.bios.rt_delay) < 0 ||
-                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]"));
+            if (virStrToLong_i(tmp, NULL, 0, &def->os.bios.rt_delay) < 0) {
+                virReportError(VIR_ERR_XML_ERROR, "%s",
+                               _("invalid value for rebootTimeout"));
                 return -1;
             }
             def->os.bios.rt_set = true;
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
new file mode 100644
index 0000000000..e4d947c553
--- /dev/null
+++ b/src/conf/domain_validate.c
@@ -0,0 +1,51 @@
+/*
+ * domain_validate.c: domain general validation functions
+ *
+ * Copyright IBM Corp, 2020
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "domain_validate.h"
+#include "domain_conf.h"
+#include "virlog.h"
+#include "virutil.h"
+
+#define VIR_FROM_THIS VIR_FROM_DOMAIN
+
+VIR_LOG_INIT("conf.domain_validate");
+
+int
+virDomainDefBootValidate(const virDomainDef *def)
+{
+    if (def->os.bm_timeout_set && def->os.bm_timeout > 65535) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("invalid value for boot menu timeout, "
+                         "must be in range [0,65535]"));
+        return -1;
+    }
+
+    if (def->os.bios.rt_set &&
+        (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]"));
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h
new file mode 100644
index 0000000000..2b558668a9
--- /dev/null
+++ b/src/conf/domain_validate.h
@@ -0,0 +1,27 @@
+/*
+ * domain_validate.h: domain general validation functions
+ *
+ * Copyright IBM Corp, 2020
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#include "domain_conf.h"
+
+int virDomainDefBootValidate(const virDomainDef *def);
diff --git a/src/conf/meson.build b/src/conf/meson.build
index 03b90aa6f6..8ddcc9968d 100644
--- a/src/conf/meson.build
+++ b/src/conf/meson.build
@@ -14,6 +14,7 @@ domain_conf_sources = [
   'domain_capabilities.c',
   'domain_conf.c',
   'domain_nwfilter.c',
+  'domain_validate.c',
   'moment_conf.c',
   'numa_conf.c',
   'snapshot_conf.c',
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 7c9dc0e641..202fc83ccf 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1006,7 +1006,8 @@ mymain(void)
     DO_TEST("boot-menu-enable-with-timeout",
             QEMU_CAPS_SPLASH_TIMEOUT);
     DO_TEST_PARSE_ERROR("boot-menu-enable-with-timeout", NONE);
-    DO_TEST_PARSE_ERROR("boot-menu-enable-with-timeout-invalid", NONE);
+    DO_TEST_PARSE_ERROR("boot-menu-enable-with-timeout-invalid",
+                        QEMU_CAPS_SPLASH_TIMEOUT);
     DO_TEST("boot-menu-disable", NONE);
     DO_TEST("boot-menu-disable-drive", NONE);
     DO_TEST_PARSE_ERROR("boot-dev+order",
-- 
2.26.2




More information about the libvir-list mailing list