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(a)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