The virDomainInputDefParseXML() function uses old style of
parsing XML (virXMLPropString + str2enum conversion). Use
virXMLPropEnumDefault() which encapsulates those steps.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/conf/domain_audit.c | 2 +-
src/conf/domain_conf.c | 86 +++++++++++++-------------------
src/conf/domain_conf.h | 6 +--
src/conf/domain_validate.c | 2 +-
src/libxl/libxl_conf.c | 4 ++
src/libxl/xen_xl.c | 3 ++
src/libxl/xen_xm.c | 3 ++
src/qemu/qemu_cgroup.c | 12 +++++
src/qemu/qemu_command.c | 10 ++--
src/qemu/qemu_domain_address.c | 4 +-
src/qemu/qemu_hotplug.c | 4 +-
src/qemu/qemu_validate.c | 4 +-
src/security/security_apparmor.c | 2 +-
src/security/security_dac.c | 4 +-
src/security/security_selinux.c | 4 +-
15 files changed, 80 insertions(+), 70 deletions(-)
diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index 17a01c51ba..9ce14de80b 100644
--- a/src/conf/domain_audit.c
+++ b/src/conf/domain_audit.c
@@ -949,7 +949,7 @@ virDomainAuditInput(virDomainObj *vm,
if (!(vmname = virAuditEncode("vm", vm->def->name)))
return;
- switch ((virDomainInputType) input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
case VIR_DOMAIN_INPUT_TYPE_TABLET:
case VIR_DOMAIN_INPUT_TYPE_KBD:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 678b9265c7..0cb8de8b1f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1932,7 +1932,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDef *def)
const char *virDomainInputDefGetPath(virDomainInputDef *input)
{
- switch ((virDomainInputType) input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
case VIR_DOMAIN_INPUT_TYPE_TABLET:
case VIR_DOMAIN_INPUT_TYPE_KBD:
@@ -11785,70 +11785,54 @@ virDomainInputDefParseXML(virDomainXMLOption *xmlopt,
{
VIR_XPATH_NODE_AUTORESTORE(ctxt)
virDomainInputDef *def;
- g_autofree char *type = NULL;
- g_autofree char *bus = NULL;
- g_autofree char *model = NULL;
+ virDomainInputBus bus = VIR_DOMAIN_INPUT_BUS_PS2;
xmlNodePtr source = NULL;
def = g_new0(virDomainInputDef, 1);
ctxt->node = node;
- type = virXMLPropString(node, "type");
- bus = virXMLPropString(node, "bus");
- model = virXMLPropString(node, "model");
-
- if (!type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("missing input device type"));
- goto error;
- }
-
- if ((def->type = virDomainInputTypeFromString(type)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown input device type '%s'"), type);
+ if (virXMLPropEnum(node, "type",
+ virDomainInputTypeFromString,
+ VIR_XML_PROP_REQUIRED,
+ &def->type) < 0)
goto error;
- }
- if (model &&
- ((def->model = virDomainInputModelTypeFromString(model)) < 0 ||
- def->model == VIR_DOMAIN_INPUT_MODEL_DEFAULT)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown input model '%s'"), model);
+ if (virXMLPropEnum(node, "model",
+ virDomainInputModelTypeFromString,
+ VIR_XML_PROP_NONZERO,
+ &def->model) < 0)
goto error;
- }
-
- if (bus) {
- if ((def->bus = virDomainInputBusTypeFromString(bus)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown input bus type '%s'"), bus);
- goto error;
- }
- } else {
- if (dom->os.type == VIR_DOMAIN_OSTYPE_HVM) {
- if ((def->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
- def->type == VIR_DOMAIN_INPUT_TYPE_KBD) &&
- (ARCH_IS_X86(dom->os.arch) || dom->os.arch == VIR_ARCH_NONE)) {
- def->bus = VIR_DOMAIN_INPUT_BUS_PS2;
- } else if (ARCH_IS_S390(dom->os.arch) ||
- def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH) {
- def->bus = VIR_DOMAIN_INPUT_BUS_VIRTIO;
- } else if (def->type == VIR_DOMAIN_INPUT_TYPE_EVDEV) {
- def->bus = VIR_DOMAIN_INPUT_BUS_NONE;
- } else {
- def->bus = VIR_DOMAIN_INPUT_BUS_USB;
- }
- } else if (dom->os.type == VIR_DOMAIN_OSTYPE_XEN ||
- dom->os.type == VIR_DOMAIN_OSTYPE_XENPVH) {
- def->bus = VIR_DOMAIN_INPUT_BUS_XEN;
+ if (dom->os.type == VIR_DOMAIN_OSTYPE_HVM) {
+ if ((def->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+ def->type == VIR_DOMAIN_INPUT_TYPE_KBD) &&
+ (ARCH_IS_X86(dom->os.arch) || dom->os.arch == VIR_ARCH_NONE)) {
+ bus = VIR_DOMAIN_INPUT_BUS_PS2;
+ } else if (ARCH_IS_S390(dom->os.arch) ||
+ def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH) {
+ bus = VIR_DOMAIN_INPUT_BUS_VIRTIO;
+ } else if (def->type == VIR_DOMAIN_INPUT_TYPE_EVDEV) {
+ bus = VIR_DOMAIN_INPUT_BUS_NONE;
} else {
- if ((dom->virtType == VIR_DOMAIN_VIRT_VZ ||
- dom->virtType == VIR_DOMAIN_VIRT_PARALLELS))
- def->bus = VIR_DOMAIN_INPUT_BUS_PARALLELS;
+ bus = VIR_DOMAIN_INPUT_BUS_USB;
}
+ } else if (dom->os.type == VIR_DOMAIN_OSTYPE_XEN ||
+ dom->os.type == VIR_DOMAIN_OSTYPE_XENPVH) {
+ bus = VIR_DOMAIN_INPUT_BUS_XEN;
+ } else {
+ if ((dom->virtType == VIR_DOMAIN_VIRT_VZ ||
+ dom->virtType == VIR_DOMAIN_VIRT_PARALLELS))
+ bus = VIR_DOMAIN_INPUT_BUS_PARALLELS;
}
+ if (virXMLPropEnumDefault(node, "bus",
+ virDomainInputBusTypeFromString,
+ VIR_XML_PROP_NONE,
+ &def->bus, bus) < 0)
+ goto error;
+
+
if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags) <
0)
goto error;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 9a0b962ec8..836f518f9c 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1477,9 +1477,9 @@ typedef enum {
} virDomainInputSourceGrabToggle;
struct _virDomainInputDef {
- int type;
- int bus;
- int model; /* virDomainInputModel */
+ virDomainInputType type;
+ virDomainInputBus bus;
+ virDomainInputModel model;
struct {
char *evdev;
virDomainInputSourceGrab grab;
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 9e64a96eb9..fd04add5d2 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -2177,7 +2177,7 @@ virDomainInputDefValidate(const virDomainInputDef *input,
}
}
- switch ((virDomainInputType) input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
case VIR_DOMAIN_INPUT_TYPE_TABLET:
case VIR_DOMAIN_INPUT_TYPE_KBD:
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 7a733cf30d..e3924e8b43 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -722,6 +722,10 @@ libxlMakeDomBuildInfo(virDomainDef *def,
VIR_FREE(*usbdevice);
*usbdevice = g_strdup("tablet");
break;
+ case VIR_DOMAIN_INPUT_TYPE_KBD:
+ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Unknown input device type"));
diff --git a/src/libxl/xen_xl.c b/src/libxl/xen_xl.c
index c0edceeac7..36d6e1156d 100644
--- a/src/libxl/xen_xl.c
+++ b/src/libxl/xen_xl.c
@@ -1759,6 +1759,9 @@ xenFormatXLInputDevs(virConf *conf, virDomainDef *def)
case VIR_DOMAIN_INPUT_TYPE_KBD:
devtype = "keyboard";
break;
+ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
default:
continue;
}
diff --git a/src/libxl/xen_xm.c b/src/libxl/xen_xm.c
index a962da9cad..31d2d2e6a1 100644
--- a/src/libxl/xen_xm.c
+++ b/src/libxl/xen_xm.c
@@ -521,6 +521,9 @@ xenFormatXMInputDevs(virConf *conf, virDomainDef *def)
case VIR_DOMAIN_INPUT_TYPE_KBD:
devtype = "keyboard";
break;
+ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
default:
continue;
}
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index aa0c927578..7c24e187c9 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -384,6 +384,12 @@ qemuSetupInputCgroup(virDomainObj *vm,
return qemuCgroupAllowDevicePath(vm, dev->source.evdev,
VIR_CGROUP_DEVICE_RW, false);
break;
+
+ case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+ case VIR_DOMAIN_INPUT_TYPE_TABLET:
+ case VIR_DOMAIN_INPUT_TYPE_KBD:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
+ break;
}
return ret;
@@ -405,6 +411,12 @@ qemuTeardownInputCgroup(virDomainObj *vm,
return qemuCgroupDenyDevicePath(vm, dev->source.evdev,
VIR_CGROUP_DEVICE_RWM, false);
break;
+
+ case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+ case VIR_DOMAIN_INPUT_TYPE_TABLET:
+ case VIR_DOMAIN_INPUT_TYPE_KBD:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
+ break;
}
return 0;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 72bca45dc4..5cfcdc3699 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -872,7 +872,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef *device,
case VIR_DOMAIN_DEVICE_INPUT:
*virtioOptions = device->data.input->virtio;
- switch ((virDomainInputType) device->data.input->type) {
+ switch (device->data.input->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
*baseName = "virtio-mouse";
break;
@@ -4515,7 +4515,7 @@ qemuBuildInputVirtioDevProps(const virDomainDef *def,
g_autoptr(virJSONValue) props = NULL;
const char *evdev = NULL;
- switch ((virDomainInputType)dev->type) {
+ switch (dev->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
case VIR_DOMAIN_INPUT_TYPE_TABLET:
case VIR_DOMAIN_INPUT_TYPE_KBD:
@@ -4564,6 +4564,10 @@ qemuBuildInputUSBDevProps(const virDomainDef *def,
case VIR_DOMAIN_INPUT_TYPE_KBD:
driver = "usb-kbd";
break;
+ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_LAST:
+ break;
}
if (virJSONValueObjectAdd(&props,
@@ -4628,7 +4632,7 @@ qemuBuildInputCommandLine(virCommand *cmd,
} else {
g_autoptr(virJSONValue) props = NULL;
- switch ((virDomainInputBus) input->bus) {
+ switch (input->bus) {
case VIR_DOMAIN_INPUT_BUS_USB:
if (!(props = qemuBuildInputUSBDevProps(def, input)))
return -1;
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 753733d1b9..3b1139d975 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -960,9 +960,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
return pciFlags;
case VIR_DOMAIN_DEVICE_INPUT:
- switch ((virDomainInputBus) dev->data.input->bus) {
+ switch (dev->data.input->bus) {
case VIR_DOMAIN_INPUT_BUS_VIRTIO:
- switch ((virDomainInputModel) dev->data.input->model) {
+ switch (dev->data.input->model) {
case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL:
/* Transitional devices only work in conventional PCI slots */
return pciFlags;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 274f47c25d..bc38ee0a11 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3236,7 +3236,7 @@ qemuDomainAttachInputDevice(virQEMUDriver *driver,
qemuAssignDeviceInputAlias(vm->def, input, -1);
- switch ((virDomainInputBus) input->bus) {
+ switch (input->bus) {
case VIR_DOMAIN_INPUT_BUS_USB:
if (virDomainUSBAddressEnsure(priv->usbaddrs, &input->info) < 0)
return -1;
@@ -5978,7 +5978,7 @@ qemuDomainDetachPrepInput(virDomainObj *vm,
}
*detach = input = vm->def->inputs[idx];
- switch ((virDomainInputBus) input->bus) {
+ switch (input->bus) {
case VIR_DOMAIN_INPUT_BUS_PS2:
case VIR_DOMAIN_INPUT_BUS_XEN:
case VIR_DOMAIN_INPUT_BUS_PARALLELS:
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index d4f0ea03e8..65b5fe7bc6 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -4734,7 +4734,7 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input,
return 0;
/* model=virtio-(non-)transitional is unsupported */
- switch ((virDomainInputModel)input->model) {
+ switch (input->model) {
case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL:
case VIR_DOMAIN_INPUT_MODEL_VIRTIO_NON_TRANSITIONAL:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -4752,7 +4752,7 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input,
return -1;
}
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
baseName = "virtio-mouse";
cap = QEMU_CAPS_VIRTIO_MOUSE;
diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
index 957c1a6357..e74045f563 100644
--- a/src/security/security_apparmor.c
+++ b/src/security/security_apparmor.c
@@ -712,7 +712,7 @@ AppArmorSetInputLabel(virSecurityManager *mgr,
if (input == NULL)
return 0;
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
if (input->source.evdev == NULL) {
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index 183f291cc6..e2ff861fd5 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -1788,7 +1788,7 @@ virSecurityDACSetInputLabel(virSecurityManager *mgr,
if (seclabel && !seclabel->relabel)
return 0;
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) <
0)
@@ -1817,7 +1817,7 @@ virSecurityDACRestoreInputLabel(virSecurityManager *mgr,
{
int ret = -1;
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
ret = virSecurityDACRestoreFileLabel(mgr, input->source.evdev);
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 099306b522..6cdbd963e7 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1512,7 +1512,7 @@ virSecuritySELinuxSetInputLabel(virSecurityManager *mgr,
if (seclabel == NULL)
return 0;
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
if (virSecuritySELinuxSetFilecon(mgr, input->source.evdev,
@@ -1543,7 +1543,7 @@ virSecuritySELinuxRestoreInputLabel(virSecurityManager *mgr,
if (seclabel == NULL)
return 0;
- switch ((virDomainInputType)input->type) {
+ switch (input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
rc = virSecuritySELinuxRestoreFileLabel(mgr, input->source.evdev, true);
--
2.35.1