Still to go - add .args files to match .xml files in testsuite
* src/qemu/qemu_command.c (qemuBuildCommandLine): Emit smartcard
options.
(qemuAssignDeviceAliases): Assign an alias for smartcard passthrough.
* tests/qemuxml2argvtest.c (mymain): Three new tests.
* tests/qemuxml2argvdata/...arg: Three new files.
---
Well, as you can see, the tests/ part isn't done yet.
src/qemu/qemu_command.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 205c303..d02241f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -604,6 +604,11 @@ qemuAssignDeviceAliases(virDomainDefPtr def, unsigned long long
qemuCmdFlags)
if (virAsprintf(&def->channels[i]->info.alias, "channel%d",
i) < 0)
goto no_memory;
}
+ for (i = 0; i < def->nsmartcards ; i++) {
+ if (def->smartcards[i]->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH
&&
+ virAsprintf(&def->smartcards[i]->info.alias,
"smartcard%d", i) < 0)
+ goto no_memory;
+ }
if (def->console) {
if (virAsprintf(&def->console->info.alias, "console%d", i)
< 0)
goto no_memory;
@@ -3332,6 +3337,50 @@ qemuBuildCommandLine(virConnectPtr conn,
}
}
+ if (def->nsmartcards) {
+ /* Requires -chardev and -device usb-ccid */
+ if (!(qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) ||
+ !(qemuCmdFlags & QEMUD_CMD_FLAG_USB_CCID)) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("smartcard requires QEMU to support
-usb-ccid"));
+ goto error;
+ }
+ virCommandAddArgList(cmd, "-device", "usb-ccid", NULL);
+ }
+ for (i = 0 ; i < def->nsmartcards ; i++) {
+ virDomainSmartcardDefPtr smartcard = def->smartcards[i];
+ char *devstr;
+ virBuffer smartcard_buf = VIR_BUFFER_INITIALIZER;
+ int j;
+
+ switch (smartcard->type) {
+ case VIR_DOMAIN_SMARTCARD_TYPE_HOST:
+ virCommandAddArgList(cmd, "-device",
"ccid-card-emulated", NULL);
+ break;
+ case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES:
+ virCommandAddArg(cmd, "-device");
+ virBufferAddLit(&smartcard_buf,
+ "ccid-card-emulated,backend=certificates");
+ for (j = 0; j < VIR_DOMAIN_SMARTCARD_NUM_CERTIFICATES; j++)
+ virBufferVSprintf(&smartcard_buf, ",cert%d=%s", j + 1,
+ smartcard->data.cert.file[j]);
+ virCommandAddArgBuffer(cmd, &smartcard_buf);
+ break;
+ case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH:
+ virCommandAddArg(cmd, "-chardev");
+ if (!(devstr = qemuBuildChrChardevStr(&smartcard->data.passthru,
+ smartcard->info.alias)))
+ goto error;
+ virCommandAddArg(cmd, devstr);
+ VIR_FREE(devstr);
+
+ virCommandAddArg(cmd, "-device");
+ virCommandAddArgFormat(cmd, "ccid-card-passthru,chardev=%s",
+ smartcard->info.alias);
+ break;
+ }
+ }
+
if (!def->nserials) {
/* If we have -device, then we set -nodefault already */
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE))
--
1.7.3.4