]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildUSBControllerDevStr: Format via JSON properties.
authorPeter Krempa <pkrempa@redhat.com>
Tue, 5 Oct 2021 11:46:03 +0000 (13:46 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 Oct 2021 09:10:44 +0000 (11:10 +0200)
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=<uint32>            -  (default: 4)
  p3=<uint32>            -  (default: 4)

'ich9-usb-uhci6'
  masterbus=<str>
  firstport=<uint32>     -  (default: 0)

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c

index 63ce58ff2be682c708e54e5e29f11dec8eaec8ce..b46982a842e941b804ebb1801ce63e10d030b9ec 100644 (file)
@@ -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)
 {
-    if (qemuValidateDomainDeviceDefControllerUSB(def, qemuCaps) < 0)
-        return -1;
+    g_autoptr(virJSONValue) props = NULL;
 
-    virBufferAsprintf(buf, "%s", qemuControllerModelUSBTypeToString(def->model));
+    if (qemuValidateDomainDeviceDefControllerUSB(def, qemuCaps) < 0)
+        return NULL;
 
-    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: