[PATCH 12/14] qemuBuildSmartcardCommandLine: Generate via JSON

Peter Krempa pkrempa at redhat.com
Tue Oct 12 11:12:18 UTC 2021


QEMU declares the props we control as:

'ccid-card-emulated'
  backend=<str>
  cert1=<str>
  cert2=<str>
  cert3=<str>
  db=<str>

'ccid-card-passthru'
  chardev=<str>          - ID of a chardev to use as a backend

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_command.c | 88 +++++++++++++++++++++++++----------------
 1 file changed, 54 insertions(+), 34 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8913110b00..1d5986b85a 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9056,16 +9056,10 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager,
                               virQEMUCaps *qemuCaps,
                               bool chardevStdioLogd)
 {
-    size_t i;
+    g_autoptr(virJSONValue) props = NULL;
     virDomainSmartcardDef *smartcard;
-    g_autofree char *devstr = NULL;
-    g_auto(virBuffer) opt = VIR_BUFFER_INITIALIZER;
-    const char *database;
     const char *contAlias = NULL;
-    unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
-        QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
-    if (chardevStdioLogd)
-        cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
+    g_autofree char *bus = NULL;

     if (!def->nsmartcards)
         return 0;
@@ -9074,37 +9068,56 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager,

     switch (smartcard->type) {
     case VIR_DOMAIN_SMARTCARD_TYPE_HOST:
-        virBufferAddLit(&opt, "ccid-card-emulated,backend=nss-emulated");
+        if (virJSONValueObjectCreate(&props,
+                                     "s:driver", "ccid-card-emulated",
+                                     "s:backend", "nss-emulated",
+                                     NULL) < 0)
+            return -1;
+
         break;

-    case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES:
-        virBufferAddLit(&opt, "ccid-card-emulated,backend=certificates");
-        for (i = 0; i < VIR_DOMAIN_SMARTCARD_NUM_CERTIFICATES; i++) {
-            virBufferAsprintf(&opt, ",cert%zu=", i + 1);
-            virQEMUBuildBufferEscapeComma(&opt, smartcard->data.cert.file[i]);
-        }
-        if (smartcard->data.cert.database) {
+    case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES: {
+        const char *database = VIR_DOMAIN_SMARTCARD_DEFAULT_DATABASE;
+
+        if (smartcard->data.cert.database)
             database = smartcard->data.cert.database;
-        } else {
-            database = VIR_DOMAIN_SMARTCARD_DEFAULT_DATABASE;
-        }
-        virBufferAddLit(&opt, ",db=");
-        virQEMUBuildBufferEscapeComma(&opt, database);
+
+        if (virJSONValueObjectCreate(&props,
+                                     "s:driver", "ccid-card-emulated",
+                                     "s:backend", "certificates",
+                                     "s:cert1", smartcard->data.cert.file[0],
+                                     "s:cert2", smartcard->data.cert.file[1],
+                                     "s:cert3", smartcard->data.cert.file[2],
+                                     "s:db", database,
+                                     NULL) < 0)
+            return -1;
+    }
         break;

-    case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH:
-        if (!(devstr = qemuBuildChrChardevStr(logManager, secManager,
-                                              cmd, cfg, def,
-                                              smartcard->data.passthru,
-                                              smartcard->info.alias,
-                                              qemuCaps, cdevflags))) {
+    case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: {
+        unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | QEMU_BUILD_CHARDEV_UNIX_FD_PASS;
+        g_autofree char *chardevstr = NULL;
+        g_autofree char *chardevalias = g_strdup_printf("char%s", smartcard->info.alias);
+
+        if (chardevStdioLogd)
+            cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD;
+
+        if (!(chardevstr = qemuBuildChrChardevStr(logManager, secManager,
+                                                  cmd, cfg, def,
+                                                  smartcard->data.passthru,
+                                                  smartcard->info.alias,
+                                                  qemuCaps, cdevflags))) {
             return -1;
         }
-        virCommandAddArg(cmd, "-chardev");
-        virCommandAddArg(cmd, devstr);

-        virBufferAsprintf(&opt, "ccid-card-passthru,chardev=char%s",
-                          smartcard->info.alias);
+        virCommandAddArgList(cmd, "-chardev", chardevstr, NULL);
+
+        if (virJSONValueObjectCreate(&props,
+                                     "s:driver", "ccid-card-passthru",
+                                     "s:chardev", chardevalias,
+                                     NULL) < 0)
+            return -1;
+    }
         break;

     case VIR_DOMAIN_SMARTCARD_TYPE_LAST:
@@ -9118,9 +9131,16 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager,
                                                    smartcard->info.addr.ccid.controller)))
         return -1;

-    virCommandAddArg(cmd, "-device");
-    virBufferAsprintf(&opt, ",id=%s,bus=%s.0", smartcard->info.alias, contAlias);
-    virCommandAddArgBuffer(cmd, &opt);
+    bus = g_strdup_printf("%s.0", contAlias);
+
+    if (virJSONValueObjectAdd(props,
+                              "s:id", smartcard->info.alias,
+                              "s:bus", bus,
+                              NULL) < 0)
+        return -1;
+
+    if (qemuBuildDeviceCommandlineFromJSON(cmd, props, qemuCaps) < 0)
+        return -1;

     return 0;
 }
-- 
2.31.1




More information about the libvir-list mailing list