]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildRedirdevCommandLine: Generate via JSON
authorPeter Krempa <pkrempa@redhat.com>
Fri, 1 Oct 2021 10:58:40 +0000 (12:58 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 Oct 2021 08:26:03 +0000 (10:26 +0200)
The 'usb-redir' device has the following types according to QEMU for
properties we control:

  chardev=<str>          - ID of a chardev to use as a backend
  filter=<str>
  bootindex=<int32>

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

index fcb1e3944f7dac0c791e85744ea2720dee2fdb84..7dad06a6ee346c6fbfce3a472817e6e1f9e190cd 100644 (file)
@@ -9740,20 +9740,18 @@ qemuBuildConsoleCommandLine(virLogManager *logManager,
 }
 
 
-char *
-qemuBuildRedirdevDevStr(const virDomainDef *def,
-                        virDomainRedirdevDef *dev,
-                        virQEMUCaps *qemuCaps G_GNUC_UNUSED)
+virJSONValue *
+qemuBuildRedirdevDevProps(const virDomainDef *def,
+                          virDomainRedirdevDef *dev)
 {
-    size_t i;
-    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+    g_autoptr(virJSONValue) props = NULL;
     virDomainRedirFilterDef *redirfilter = def->redirfilter;
+    g_autofree char *chardev = g_strdup_printf("char%s", dev->info.alias);
+    g_autofree char *filter = NULL;
 
-    virBufferAsprintf(&buf, "usb-redir,chardev=char%s,id=%s",
-                      dev->info.alias, dev->info.alias);
-
-    if (redirfilter && redirfilter->nusbdevs) {
-        virBufferAddLit(&buf, ",filter=");
+    if (redirfilter) {
+        g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+        size_t i;
 
         for (i = 0; i < redirfilter->nusbdevs; i++) {
             virDomainRedirFilterUSBDevDef *usbdev = redirfilter->usbdevs[i];
@@ -9777,19 +9775,26 @@ qemuBuildRedirdevDevStr(const virDomainDef *def,
             else
                 virBufferAddLit(&buf, "-1:");
 
-            virBufferAsprintf(&buf, "%u", usbdev->allow);
-            if (i < redirfilter->nusbdevs -1)
-                virBufferAddLit(&buf, "|");
+            virBufferAsprintf(&buf, "%u|", usbdev->allow);
         }
+        virBufferTrim(&buf, "|");
+
+        filter = virBufferContentAndReset(&buf);
     }
 
-    if (dev->info.bootIndex)
-        virBufferAsprintf(&buf, ",bootindex=%u", dev->info.bootIndex);
+    if (virJSONValueObjectCreate(&props,
+                                 "s:driver", "usb-redir",
+                                 "s:chardev", chardev,
+                                 "s:id", dev->info.alias,
+                                 "S:filter", filter,
+                                 "p:bootindex", dev->info.bootIndex,
+                                 NULL) < 0)
+        return NULL;
 
-    if (qemuBuildDeviceAddressStr(&buf, def, &dev->info) < 0)
+    if (qemuBuildDeviceAddressProps(props, def, &dev->info) < 0)
         return NULL;
 
-    return virBufferContentAndReset(&buf);
+    return g_steal_pointer(&props);
 }
 
 
@@ -9810,6 +9815,7 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager,
 
     for (i = 0; i < def->nredirdevs; i++) {
         virDomainRedirdevDef *redirdev = def->redirdevs[i];
+        g_autoptr(virJSONValue) devprops = NULL;
         char *devstr;
 
         if (!(devstr = qemuBuildChrChardevStr(logManager, secManager,
@@ -9824,11 +9830,11 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager,
         virCommandAddArg(cmd, devstr);
         VIR_FREE(devstr);
 
-        virCommandAddArg(cmd, "-device");
-        if (!(devstr = qemuBuildRedirdevDevStr(def, redirdev, qemuCaps)))
+        if (!(devprops = qemuBuildRedirdevDevProps(def, redirdev)))
+            return -1;
+
+        if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
             return -1;
-        virCommandAddArg(cmd, devstr);
-        VIR_FREE(devstr);
     }
 
     return 0;
index 6995780f8387e48d8fa403ef0c2b56829b20a548..f96512527722b126b73065e3027d0de832282a3b 100644 (file)
@@ -204,9 +204,9 @@ virJSONValue *
 qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
                                  virDomainHostdevDef *dev);
 
-char *qemuBuildRedirdevDevStr(const virDomainDef *def,
-                              virDomainRedirdevDef *dev,
-                              virQEMUCaps *qemuCaps);
+virJSONValue *
+qemuBuildRedirdevDevProps(const virDomainDef *def,
+                          virDomainRedirdevDef *dev);
 
 char *qemuBuildZPCIDevStr(virDomainDeviceInfo *dev);
 
index e1db3d55f332437e5f280980a352d58f3f6ba227..422ab267cfc093bd8fab5a22b5202a30a2f8782a 100644 (file)
@@ -1961,7 +1961,7 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriver *driver,
     qemuDomainObjPrivate *priv = vm->privateData;
     virDomainDef *def = vm->def;
     g_autofree char *charAlias = NULL;
-    g_autofree char *devstr = NULL;
+    g_autoptr(virJSONValue) devprops = NULL;
     bool chardevAdded = false;
     g_autofree char *tlsAlias = NULL;
     const char *secAlias = NULL;
@@ -1976,7 +1976,7 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriver *driver,
     if ((virDomainUSBAddressEnsure(priv->usbaddrs, &redirdev->info)) < 0)
         return -1;
 
-    if (!(devstr = qemuBuildRedirdevDevStr(def, redirdev, priv->qemuCaps)))
+    if (!(devprops = qemuBuildRedirdevDevProps(def, redirdev)))
         goto cleanup;
 
     VIR_REALLOC_N(def->redirdevs, def->nredirdevs+1);
@@ -1994,7 +1994,7 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriver *driver,
         goto exit_monitor;
     chardevAdded = true;
 
-    if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
+    if (qemuMonitorAddDeviceProps(priv->mon, &devprops) < 0)
         goto exit_monitor;
 
     if (qemuDomainObjExitMonitor(driver, vm) < 0)