[PATCH 05/12] lib: Eliminate use of virTristateSwitchTypeFromString()

Michal Privoznik mprivozn at redhat.com
Fri Jan 21 13:28:12 UTC 2022


There are couple of places (all of them in XML parsing) where
virTristateSwitchTypeFromString() is called. Well, the same
result can be achieved by virXMLPropTristateSwitch() and on fewer
lines.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/conf/cpu_conf.c    |  32 +++++-------
 src/conf/domain_conf.c | 111 ++++++++++++++---------------------------
 src/conf/domain_conf.h |   6 +--
 src/cpu/cpu_x86.c      |  35 ++++++-------
 4 files changed, 66 insertions(+), 118 deletions(-)

diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index fbceac1657..4d61bfd01b 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -323,12 +323,12 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
     xmlNodePtr topology = NULL;
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
     int n;
+    int rv;
     size_t i;
     g_autofree char *cpuMode = NULL;
     g_autofree char *fallback = NULL;
     g_autofree char *vendor_id = NULL;
     g_autofree char *tscScaling = NULL;
-    g_autofree char *migratable = NULL;
     g_autofree virHostCPUTscInfo *tsc = NULL;
 
     *cpu = NULL;
@@ -394,25 +394,17 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
             def->mode = VIR_CPU_MODE_CUSTOM;
     }
 
-    if ((migratable = virXMLPropString(ctxt->node, "migratable"))) {
-        int val;
-
-        if (def->mode != VIR_CPU_MODE_HOST_PASSTHROUGH &&
-            def->mode != VIR_CPU_MODE_MAXIMUM) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("Attribute migratable is only allowed for "
-                             "'host-passthrough' / 'maximum' CPU mode"));
-            return -1;
-        }
-
-        if ((val = virTristateSwitchTypeFromString(migratable)) < 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("Invalid value in migratable attribute: '%s'"),
-                           migratable);
-            return -1;
-        }
-
-        def->migratable = val;
+    if ((rv = virXMLPropTristateSwitch(ctxt->node, "migratable",
+                                       VIR_XML_PROP_NONE,
+                                       &def->migratable)) < 0) {
+        return -1;
+    } else if (rv > 0 &&
+               def->mode != VIR_CPU_MODE_HOST_PASSTHROUGH &&
+               def->mode != VIR_CPU_MODE_MAXIMUM) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("Attribute migratable is only allowed for "
+                         "'host-passthrough' / 'maximum' CPU mode"));
+        return -1;
     }
 
     if (def->type == VIR_CPU_TYPE_GUEST) {
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 393f9d9478..83212f9c10 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7310,8 +7310,6 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
     g_autofree char *rawio = NULL;
     g_autofree char *backendStr = NULL;
     g_autofree char *model = NULL;
-    g_autofree char *display = NULL;
-    g_autofree char *ramfb = NULL;
 
     /* @managed can be read from the xml document - it is always an
      * attribute of the toplevel element, no matter what type of
@@ -7324,8 +7322,6 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
     sgio = virXMLPropString(node, "sgio");
     rawio = virXMLPropString(node, "rawio");
     model = virXMLPropString(node, "model");
-    display = virXMLPropString(node, "display");
-    ramfb = virXMLPropString(node, "ramfb");
 
     /* @type is passed in from the caller rather than read from the
      * xml document, because it is specified in different places for
@@ -7426,23 +7422,15 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
             return -1;
         }
 
-        if (display &&
-            (mdevsrc->display = virTristateSwitchTypeFromString(display)) <= 0) {
-            virReportError(VIR_ERR_XML_ERROR,
-                           _("unknown value '%s' for <hostdev> attribute "
-                             "'display'"),
-                           display);
+        if (virXMLPropTristateSwitch(node, "display",
+                                     VIR_XML_PROP_NONE,
+                                     &mdevsrc->display) < 0)
             return -1;
-        }
 
-        if (ramfb &&
-            (mdevsrc->ramfb = virTristateSwitchTypeFromString(ramfb)) <= 0) {
-            virReportError(VIR_ERR_XML_ERROR,
-                           _("unknown value '%s' for <hostdev> attribute "
-                             "'ramfb'"),
-                           ramfb);
+        if (virXMLPropTristateSwitch(node, "ramfb",
+                                     VIR_XML_PROP_NONE,
+                                     &mdevsrc->ramfb) < 0)
             return -1;
-        }
     }
 
     switch (def->source.subsys.type) {
@@ -9924,11 +9912,10 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
     if (def->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) {
         g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt);
         g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt);
-        g_autofree char *xattr = virXPathString("string(./binary/@xattr)", ctxt);
         g_autofree char *cache = virXPathString("string(./binary/cache/@mode)", ctxt);
         g_autofree char *sandbox = virXPathString("string(./binary/sandbox/@mode)", ctxt);
-        g_autofree char *posix_lock = virXPathString("string(./binary/lock/@posix)", ctxt);
-        g_autofree char *flock = virXPathString("string(./binary/lock/@flock)", ctxt);
+        xmlNodePtr binary_node = virXPathNode("./binary", ctxt);
+        xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
         int val;
 
         if (queue_size && virStrToLong_ull(queue_size, NULL, 10, &def->queue_size) < 0) {
@@ -9941,14 +9928,20 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
         if (binary)
             def->binary = virFileSanitizePath(binary);
 
-        if (xattr) {
-            if ((val = virTristateSwitchTypeFromString(xattr)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown xattr value '%s'"), xattr);
-                goto error;
-            }
-            def->xattr = val;
-        }
+        if (virXMLPropTristateSwitch(binary_node, "xattr",
+                                     VIR_XML_PROP_NONE,
+                                     &def->xattr) < 0)
+            goto error;
+
+        if (virXMLPropTristateSwitch(binary_lock_node, "posix",
+                                     VIR_XML_PROP_NONE,
+                                     &def->posix_lock) < 0)
+            goto error;
+
+        if (virXMLPropTristateSwitch(binary_lock_node, "flock",
+                                     VIR_XML_PROP_NONE,
+                                     &def->flock) < 0)
+            goto error;
 
         if (cache) {
             if ((val = virDomainFSCacheModeTypeFromString(cache)) <= 0) {
@@ -9970,23 +9963,6 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
             def->sandbox = val;
         }
 
-        if (posix_lock) {
-            if ((val = virTristateSwitchTypeFromString(posix_lock)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown posix lock value '%s'"), posix_lock);
-                goto error;
-            }
-            def->posix_lock = val;
-        }
-
-        if (flock) {
-            if ((val = virTristateSwitchTypeFromString(flock)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown flock value '%s'"), flock);
-                goto error;
-            }
-            def->flock = val;
-        }
     }
 
     if (source == NULL && def->type != VIR_DOMAIN_FS_TYPE_RAM
@@ -10309,8 +10285,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
     g_autofree char *model = NULL;
     g_autofree char *backend = NULL;
     g_autofree char *txmode = NULL;
-    g_autofree char *ioeventfd = NULL;
-    g_autofree char *event_idx = NULL;
     g_autofree char *queues = NULL;
     g_autofree char *rx_queue_size = NULL;
     g_autofree char *tx_queue_size = NULL;
@@ -10462,8 +10436,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
 
     backend = virXMLPropString(driver_node, "name");
     txmode = virXMLPropString(driver_node, "txmode");
-    ioeventfd = virXMLPropString(driver_node, "ioeventfd");
-    event_idx = virXMLPropString(driver_node, "event_idx");
     queues = virXMLPropString(driver_node, "queues");
     rx_queue_size = virXMLPropString(driver_node, "rx_queue_size");
     tx_queue_size = virXMLPropString(driver_node, "tx_queue_size");
@@ -10828,24 +10800,17 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
             }
             def->driver.virtio.txmode = val;
         }
-        if (ioeventfd) {
-            if ((val = virTristateSwitchTypeFromString(ioeventfd)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown interface ioeventfd mode '%s'"),
-                               ioeventfd);
-                goto error;
-            }
-            def->driver.virtio.ioeventfd = val;
-        }
-        if (event_idx) {
-            if ((val = virTristateSwitchTypeFromString(event_idx)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown interface event_idx mode '%s'"),
-                               event_idx);
-                goto error;
-            }
-            def->driver.virtio.event_idx = val;
-        }
+
+        if (virXMLPropTristateSwitch(driver_node, "ioeventfd",
+                                     VIR_XML_PROP_NONE,
+                                     &def->driver.virtio.ioeventfd) < 0)
+            goto error;
+
+        if (virXMLPropTristateSwitch(driver_node, "event_idx",
+                                     VIR_XML_PROP_NONE,
+                                     &def->driver.virtio.event_idx) < 0)
+            goto error;
+
         if (queues) {
             unsigned int q;
             if (virStrToLong_uip(queues, NULL, 10, &q) < 0) {
@@ -19112,13 +19077,11 @@ virDomainDefParseMemory(virDomainDef *def,
     }
 
     /* and info about it */
-    if ((tmp = virXPathString("string(./memory[1]/@dumpCore)", ctxt)) &&
-        (def->mem.dump_core = virTristateSwitchTypeFromString(tmp)) <= 0) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("Invalid memory core dump attribute value '%s'"), tmp);
+    if ((node = virXPathNode("./memory[1]", ctxt)) &&
+        virXMLPropTristateSwitch(node, "dumpCore",
+                                 VIR_XML_PROP_NONE,
+                                 &def->mem.dump_core) < 0)
         return -1;
-    }
-    VIR_FREE(tmp);
 
     tmp = virXPathString("string(./memoryBacking/source/@type)", ctxt);
     if (tmp) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e2f35fe20b..dcc8eec5a7 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -272,9 +272,9 @@ struct _virDomainHostdevSubsysSCSI {
 
 struct _virDomainHostdevSubsysMediatedDev {
     int model;                          /* enum virMediatedDeviceModelType */
-    int display; /* virTristateSwitch */
+    virTristateSwitch display;
     char uuidstr[VIR_UUID_STRING_BUFLEN];   /* mediated device's uuid string */
-    int ramfb; /* virTristateSwitch */
+    virTristateSwitch ramfb;
 };
 
 typedef enum {
@@ -2674,7 +2674,7 @@ struct _virDomainMemtune {
 
     bool nosharepages;
     bool locked;
-    int dump_core; /* enum virTristateSwitch */
+    virTristateSwitch dump_core;
     unsigned long long hard_limit; /* in kibibytes, limit at off_t bytes */
     unsigned long long soft_limit; /* in kibibytes, limit at off_t bytes */
     unsigned long long min_guarantee; /* in kibibytes, limit at off_t bytes */
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 5cb9caef8a..f9a076dddf 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -1444,36 +1444,29 @@ static int
 x86ModelParseDecode(virCPUx86Model *model,
                     xmlXPathContextPtr ctxt)
 {
-    g_autofree char *host = NULL;
-    g_autofree char *guest = NULL;
-    int val;
+    xmlNodePtr decode_node = NULL;
+    virTristateSwitch decodeHost;
+    virTristateSwitch decodeGuest;
 
-    if ((host = virXPathString("string(./decode/@host)", ctxt)))
-        val = virTristateSwitchTypeFromString(host);
-    else
-        val = VIR_TRISTATE_SWITCH_ABSENT;
-
-    if (val <= 0) {
+    if (!(decode_node = virXPathNode("./decode", ctxt))) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("invalid or missing decode/host attribute in CPU model %s"),
+                       _("missing decode element in CPU model %s"),
                        model->name);
         return -1;
     }
-    model->decodeHost = val == VIR_TRISTATE_SWITCH_ON;
 
-    if ((guest = virXPathString("string(./decode/@guest)", ctxt)))
-        val = virTristateSwitchTypeFromString(guest);
-    else
-        val = VIR_TRISTATE_SWITCH_ABSENT;
+    if (virXMLPropTristateSwitch(decode_node, "host",
+                                 VIR_XML_PROP_REQUIRED,
+                                 &decodeHost) < 0)
+        return -1;
 
-    if (val <= 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("invalid or missing decode/guest attribute in CPU model %s"),
-                       model->name);
+    if (virXMLPropTristateSwitch(decode_node, "guest",
+                                 VIR_XML_PROP_REQUIRED,
+                                 &decodeGuest) < 0)
         return -1;
-    }
-    model->decodeGuest = val == VIR_TRISTATE_SWITCH_ON;
 
+    virTristateSwitchToBool(decodeHost, &model->decodeHost);
+    virTristateSwitchToBool(decodeGuest, &model->decodeGuest);
     return 0;
 }
 
-- 
2.34.1




More information about the libvir-list mailing list