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@xxxxxxxxxx> --- 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