From 4a8319225ce17cb8a34422f3d5103e905b672dbd Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 5 Oct 2021 13:46:03 +0200 Subject: [PATCH] qemuBuildUSBControllerDevStr: Format via JSON properties. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Internally format the PCI controller properties into JSON, but convert it back to a string as preparation for upcoming refactors. The following types are declared for the properties we use by QEMU: 'nec-usb-xhci' p2= - (default: 4) p3= - (default: 4) 'ich9-usb-uhci6' masterbus= firstport= - (default: 0) Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_command.c | 64 ++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 63ce58ff2b..b46982a842 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2836,37 +2836,51 @@ qemuBuildUSBControllerFindMasterAlias(const virDomainDef *domainDef, } -static int -qemuBuildUSBControllerDevStr(const virDomainDef *domainDef, - virDomainControllerDef *def, - virQEMUCaps *qemuCaps, - virBuffer *buf) +static virJSONValue * +qemuBuildUSBControllerDevProps(const virDomainDef *domainDef, + virDomainControllerDef *def, + virQEMUCaps *qemuCaps) { + g_autoptr(virJSONValue) props = NULL; + if (qemuValidateDomainDeviceDefControllerUSB(def, qemuCaps) < 0) - return -1; + return NULL; - virBufferAsprintf(buf, "%s", qemuControllerModelUSBTypeToString(def->model)); - - if (def->opts.usbopts.ports != -1) { - virBufferAsprintf(buf, ",p2=%d,p3=%d", - def->opts.usbopts.ports, def->opts.usbopts.ports); - } + if (virJSONValueObjectCreate(&props, + "s:driver", qemuControllerModelUSBTypeToString(def->model), + "k:p2", def->opts.usbopts.ports, + "k:p3", def->opts.usbopts.ports, + NULL) < 0) + return NULL; if (def->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_USB) { - const char *masterbus; + g_autofree char *masterbus = NULL; + const char *alias; - if (!(masterbus = qemuBuildUSBControllerFindMasterAlias(domainDef, def))) { + if (!(alias = qemuBuildUSBControllerFindMasterAlias(domainDef, def))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("masterbus not found")); - return -1; + return NULL; } - virBufferAsprintf(buf, ",masterbus=%s.0,firstport=%d", - masterbus, def->info.master.usb.startport); + + masterbus = g_strdup_printf("%s.0", alias); + + if (virJSONValueObjectAdd(props, + "s:masterbus", masterbus, + "i:firstport", def->info.master.usb.startport, + NULL) < 0) + return NULL; } else { - virBufferAsprintf(buf, ",id=%s", def->info.alias); + if (virJSONValueObjectAdd(props, + "s:id", def->info.alias, + NULL) < 0) + return NULL; } - return 0; + if (qemuBuildDeviceAddressProps(props, domainDef, &def->info) < 0) + return NULL; + + return g_steal_pointer(&props); } @@ -3133,9 +3147,19 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, break; case VIR_DOMAIN_CONTROLLER_TYPE_USB: - if (qemuBuildUSBControllerDevStr(domainDef, def, qemuCaps, &buf) == -1) + if (!(props = qemuBuildUSBControllerDevProps(domainDef, def, qemuCaps))) return -1; + driver = virJSONValueObjectGetString(props, "driver"); + + virBufferAsprintf(&buf, "%s,", driver); + + if (virQEMUBuildCommandLineJSON(props, &buf, "driver", NULL) < 0) + return -1; + + *devstr = virBufferContentAndReset(&buf); + + return 0; break; case VIR_DOMAIN_CONTROLLER_TYPE_PCI: