Input devices of VIR_DOMAIN_INPUT_TYPE_EVDEV type are instantiated via
an '-object' rather than a '-device'. Mixing them in one function is a
bad idea as the caller then needs to use the string correctly which is
not the case in 'qemuDomainAttachInputDevice'.
Generate a JSON object for '-object' explicitly.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 43 ++++++++++++++++++++++-------------------
1 file changed, 23 insertions(+), 20 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index dcd6a6e75d..a4d439a0ec 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3887,12 +3887,10 @@ qemuBuildUSBInputDevStr(const virDomainDef *def,
}
-static char *
-qemuBuildObjectInputDevStr(virDomainInputDef *dev,
- virQEMUCaps *qemuCaps)
+static virJSONValue *
+qemuBuildInputEvdevProps(virDomainInputDef *dev)
{
g_autoptr(virJSONValue) props = NULL;
- g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
if (qemuMonitorCreateObjectProps(&props, "input-linux",
dev->info.alias,
"s:evdev", dev->source.evdev,
@@ -3908,10 +3906,7 @@ qemuBuildObjectInputDevStr(virDomainInputDef *dev,
virDomainInputSourceGrabToggleTypeToString(dev->source.grabToggle),
NULL);
- if (qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps) < 0)
- return NULL;
-
- return virBufferContentAndReset(&buf);
+ return g_steal_pointer(&props);
}
@@ -3931,10 +3926,6 @@ qemuBuildInputDevStr(char **devstr,
if (!(*devstr = qemuBuildVirtioInputDevStr(def, input, qemuCaps)))
return -1;
break;
- case VIR_DOMAIN_INPUT_BUS_NONE:
- if (!(*devstr = qemuBuildObjectInputDevStr(input, qemuCaps)))
- return -1;
- break;
}
return 0;
}
@@ -3949,20 +3940,32 @@ qemuBuildInputCommandLine(virCommand *cmd,
for (i = 0; i < def->ninputs; i++) {
virDomainInputDef *input = def->inputs[i];
- g_autofree char *devstr = NULL;
if (qemuCommandAddExtDevice(cmd, &input->info) < 0)
return -1;
- if (qemuBuildInputDevStr(&devstr, def, input, qemuCaps) < 0)
- return -1;
+ if (input->type == VIR_DOMAIN_INPUT_TYPE_EVDEV) {
+ g_autoptr(virJSONValue) props = NULL;
+ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
- if (devstr) {
- if (input->type == VIR_DOMAIN_INPUT_TYPE_EVDEV)
- virCommandAddArg(cmd, "-object");
- else
+ if (!(props = qemuBuildInputEvdevProps(input)))
+ return -1;
+
+ if (qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps) < 0)
+ return -1;
+
+ virCommandAddArg(cmd, "-object");
+ virCommandAddArgBuffer(cmd, &buf);
+ } else {
+ g_autofree char *devstr = NULL;
+
+ if (qemuBuildInputDevStr(&devstr, def, input, qemuCaps) < 0)
+ return -1;
+
+ if (devstr) {
virCommandAddArg(cmd, "-device");
- virCommandAddArg(cmd, devstr);
+ virCommandAddArg(cmd, devstr);
+ }
}
}
--
2.31.1