[PATCH 00/24] chardev handling cleanups (chardev refactors part 2)

In this part I'm cleaning up the command line generators and unifying them. Until now there were multiple custom -chardev generators in places where it was simpler to use it than the common code. This series fixes the common code to have sane API and refactors virtiofs, vhost-user-blk vhost-user-gpu and TPM code to use it. After this series we are left with 3 distinct generators for chardev properties: - commandline - commandline for capabilties probing - QMP After the refactors here we can finally also add DO_TEST_CAPS_LATEST of chardev tests without actually touching the host as part of the testsuite which was impossible before. In further parts the generators will be put into one place and prepared for upcoming qemu refactors. Peter Krempa (24): virDomainDeviceInfoIterateFlags: Export the symbol qemu: domain: Introduce helpers for initializing chardev backend of devices qemu: Move creation and opening of chardev backend FDs to host prepare step qemu: command: Remove unused QEMU_BUILD_CHARDEV_FILE_LOGD and QEMU_BUILD_CHARDEV_UNIX_FD_PASS qemu: command: remove the unused 'chardevStdioLogd' argument/variable qemu: domain: Refactor chardev definition preparing qemu: Store chardev 'wait' flag in chardev source private data qemuBuildChrChardevStr: Remove 'cdevflags' argument qemuBuildChrChardevStr: Remove unused arguments and clean up callers qemuxml2argvtest: Add DO_TEST_CAPS_LATEST versions for all character device tests qemuxml2argvtest: Add _LATEST version for 'name-escape' case qemuBuildConsoleCommandLine: Remove identical code qemuBuildChrChardevStr: Directly generate command line qemuBuildChardevCommand: Move earlier qemuBuildChardevCommand: Don't prefix alias qemuBuildChardevCommand: Split creation of the command and setup of other objects qemu: Store TLS config options for chardevs in qemuDomainChrSourcePrivate qemuBuildChardevCommand: Remove unused 'cfg' parameter qemu: Implement chardev source setup for disk qemu: Use qemuBuildChrChardevCommand for vhost-user disk backend qemu: Use qemuBuildChrChardevCommand for virtiofs backend chardev qemu: Use qemuBuildChrChardevCommand for vhost-user-gpu backend chardev qemu: Implement chardev source setup for tpm qemu: command: Use 'qemuBuildChrChardevCommand' to build TPM backend src/libvirt_private.syms | 1 + src/qemu/qemu_block.c | 1 - src/qemu/qemu_block.h | 1 - src/qemu/qemu_command.c | 1095 +++++++---------- src/qemu/qemu_command.h | 2 - src/qemu/qemu_domain.c | 258 +++- src/qemu/qemu_domain.h | 38 +- src/qemu/qemu_driver.c | 8 + src/qemu/qemu_hotplug.c | 3 - src/qemu/qemu_process.c | 264 +++- .../aarch64-tpm.aarch64-latest.args | 2 +- .../console-compat-auto.x86_64-latest.args | 39 + .../console-compat-chardev.x86_64-latest.args | 39 + .../console-compat.x86_64-latest.args | 38 + .../name-escape.x86_64-latest.args | 51 + ...arallel-parport-chardev.x86_64-latest.args | 39 + .../parallel-tcp-chardev.x86_64-latest.args | 39 + .../pci-serial-dev-chardev.x86_64-latest.args | 39 + .../ppc64-tpmproxy-with-tpm.ppc64-latest.args | 2 +- ...rial-dev-chardev-iobase.x86_64-latest.args | 39 + .../serial-dev-chardev.x86_64-latest.args | 39 + .../serial-file-chardev.x86_64-latest.args | 40 + .../serial-file-log.x86_64-latest.args | 40 + .../serial-many-chardev.x86_64-latest.args | 42 + .../serial-pty-chardev.x86_64-latest.args | 39 + ...erial-spiceport-nospice.x86_64-latest.args | 37 + .../serial-spiceport.x86_64-latest.args | 41 + .../serial-tcp-chardev.x86_64-latest.args | 39 + ...rial-tcp-telnet-chardev.x86_64-latest.args | 39 + ...p-tlsx509-chardev-notls.x86_64-latest.args | 41 + ...-tlsx509-chardev-verify.x86_64-latest.args | 42 + ...ial-tcp-tlsx509-chardev.x86_64-latest.args | 42 + ...-tlsx509-secret-chardev.x86_64-latest.args | 43 + .../serial-udp-chardev.x86_64-latest.args | 41 + ...rial-unix-missing-source.x86_64-latest.err | 1 + .../serial-vc-chardev.x86_64-latest.args | 39 + .../tpm-emulator-spapr.ppc64-latest.args | 2 +- .../tpm-emulator-tpm2-enc.x86_64-latest.args | 2 +- ...pm-emulator-tpm2-pstate.x86_64-latest.args | 2 +- .../tpm-emulator-tpm2.x86_64-latest.args | 2 +- .../tpm-emulator.x86_64-latest.args | 2 +- ...host-user-gpu-secondary.x86_64-latest.args | 2 +- ...irtio-options-video-ats.x86_64-latest.args | 2 +- ...tio-options-video-iommu.x86_64-latest.args | 2 +- ...io-options-video-packed.x86_64-latest.args | 2 +- tests/qemuxml2argvtest.c | 114 ++ 46 files changed, 1959 insertions(+), 776 deletions(-) create mode 100644 tests/qemuxml2argvdata/console-compat-auto.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/console-compat-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/console-compat.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/name-escape.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/parallel-parport-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/parallel-tcp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/pci-serial-dev-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-dev-chardev-iobase.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-dev-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-pty-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-spiceport-nospice.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-spiceport.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-telnet-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-udp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-unix-missing-source.x86_64-latest.err create mode 100644 tests/qemuxml2argvdata/serial-vc-chardev.x86_64-latest.args -- 2.31.1

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7be5b51100..cb3ee324cc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -359,6 +359,7 @@ virDomainDeviceDefParse; virDomainDeviceFindSCSIController; virDomainDeviceGetInfo; virDomainDeviceInfoIterate; +virDomainDeviceInfoIterateFlags; virDomainDeviceSetData; virDomainDeviceTypeToString; virDomainDiskBackingStoreFormat; -- 2.31.1

On a Thursday in 2021, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 + 1 file changed, 1 insertion(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Introduce qemuDomainDeviceBackendChardevForeach(One) which calls the callback if either given device has a chardev backend or for all chardev backends of all devices. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 117 +++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 12 +++++ 2 files changed, 129 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2c10f185f8..4f0d266c73 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11455,3 +11455,120 @@ qemuDomainGetVHostUserFSSocketPath(qemuDomainObjPrivate *priv, return virFileBuildPath(priv->libDir, fs->info.alias, "-fs.sock"); } + + +/** + * qemuDomainDeviceBackendChardevForeachOne: + * @dev: device definition + * @cb: callback + * @opaque: data for @cb + * + * Calls @cb with the char device backend data if @dev is a device which has a + * chardev backend. + */ +int +qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, + qemuDomainDeviceBackendChardevForeachCallback cb, + void *opaque) +{ + switch ((virDomainDeviceType) dev->type) { + case VIR_DOMAIN_DEVICE_NET: + if (virDomainNetGetActualType(dev->data.net) != VIR_DOMAIN_NET_TYPE_VHOSTUSER) + return 0; + + return cb(dev, dev->data.net->data.vhostuser, opaque); + + case VIR_DOMAIN_DEVICE_REDIRDEV: + return cb(dev, dev->data.redirdev->source, opaque); + + case VIR_DOMAIN_DEVICE_SHMEM: + if (!dev->data.shmem->server.enabled) + return 0; + + return cb(dev, dev->data.shmem->server.chr, opaque); + + case VIR_DOMAIN_DEVICE_CHR: + return cb(dev, dev->data.chr->source, opaque); + + case VIR_DOMAIN_DEVICE_SMARTCARD: + if (dev->data.smartcard->type != VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH) + return 0; + + return cb(dev, dev->data.smartcard->data.passthru, opaque); + + case VIR_DOMAIN_DEVICE_RNG: + if (dev->data.rng->backend != VIR_DOMAIN_RNG_BACKEND_EGD) + return 0; + + return cb(dev, dev->data.rng->source.chardev, opaque); + + case VIR_DOMAIN_DEVICE_DISK: + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_FS: + case VIR_DOMAIN_DEVICE_INPUT: + case VIR_DOMAIN_DEVICE_SOUND: + case VIR_DOMAIN_DEVICE_VIDEO: + case VIR_DOMAIN_DEVICE_HOSTDEV: + case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_CONTROLLER: + case VIR_DOMAIN_DEVICE_GRAPHICS: + case VIR_DOMAIN_DEVICE_HUB: + case VIR_DOMAIN_DEVICE_NONE: + case VIR_DOMAIN_DEVICE_MEMBALLOON: + case VIR_DOMAIN_DEVICE_NVRAM: + case VIR_DOMAIN_DEVICE_TPM: + case VIR_DOMAIN_DEVICE_PANIC: + case VIR_DOMAIN_DEVICE_LAST: + case VIR_DOMAIN_DEVICE_MEMORY: + case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: + case VIR_DOMAIN_DEVICE_AUDIO: + /* no chardev backend */ + break; + } + + return 0; +} + +struct qemuDomainDeviceBackendChardevIterData { + qemuDomainDeviceBackendChardevForeachCallback cb; + void *cbdata; +}; + + +static int +qemuDomainDeviceBackendChardevIter(virDomainDef *def G_GNUC_UNUSED, + virDomainDeviceDef *dev, + virDomainDeviceInfo *info G_GNUC_UNUSED, + void *opaque) +{ + struct qemuDomainDeviceBackendChardevIterData *data = opaque; + + return qemuDomainDeviceBackendChardevForeachOne(dev, data->cb, data->cbdata); +} + + +/** + * qemuDomainDeviceBackendChardevForeach:a + * @def: domain definition + * @cb: callback + * @opqaue: data for @cb + * + * Same as qemuDomainDeviceBackendChardevForeachOne called for every device in + * @def. + */ +int +qemuDomainDeviceBackendChardevForeach(virDomainDef *def, + qemuDomainDeviceBackendChardevForeachCallback cb, + void *opaque) +{ + struct qemuDomainDeviceBackendChardevIterData data = { + .cb = cb, + .cbdata = opaque, + }; + + return virDomainDeviceInfoIterateFlags(def, + qemuDomainDeviceBackendChardevIter, + DOMAIN_DEVICE_ITERATE_MISSING_INFO, + &data); +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f2a303d8a7..3de3f70b94 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1032,3 +1032,15 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfig *cfg, char * qemuDomainGetVHostUserFSSocketPath(qemuDomainObjPrivate *priv, const virDomainFSDef *fs); + +typedef int (*qemuDomainDeviceBackendChardevForeachCallback)(virDomainDeviceDef *dev, + virDomainChrSourceDef *charsrc, + void *opaque); +int +qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, + qemuDomainDeviceBackendChardevForeachCallback cb, + void *opaque); +int +qemuDomainDeviceBackendChardevForeach(virDomainDef *def, + qemuDomainDeviceBackendChardevForeachCallback cb, + void *opaque); -- 2.31.1

On a Thursday in 2021, Peter Krempa wrote:
Introduce qemuDomainDeviceBackendChardevForeach(One) which calls the callback if either given device has a chardev backend or for all chardev backends of all devices.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 117 +++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 12 +++++ 2 files changed, 129 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

The opening of files for FD passing for a chardev backend was historically done in the function which is formatting the commandline. This has multiple problems. Firstly the function takes a lot of parameters which need to be passed through the commandline formatters. This made the 'qemuBuildChrChardevStr' extremely unappealing to the extent that we have multiple other custom formatters in places which didn't really want to use the function. Additionally the function is also creating files in the host in certain configurations which is wrong for a commandline formatter to do. This meant that e.g. not all chardev test cases can be converted to use DO_TEST_CAPS_LATEST as we attempt to use such code path and attempt to create files outside of the test directory. This patch moves the opening of the filedescriptors from 'qemuBuildChrChardevFileStr' into a new helper 'qemuProcessPrepareHostBackendChardevOne' which is called using 'qemuDomainDeviceBackendChardevForeach'. To preserve test behaviour we also have another instance 'testPrepareHostBackendChardevOne' which is populating mock filedescriptors. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 160 +++++++++------------------ src/qemu/qemu_domain.c | 6 + src/qemu/qemu_domain.h | 3 + src/qemu/qemu_process.c | 229 ++++++++++++++++++++++++++++++++++----- tests/qemuxml2argvtest.c | 79 ++++++++++++++ 5 files changed, 338 insertions(+), 139 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c47998aabd..01388b44ef 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4967,86 +4967,6 @@ qemuBuildSCSIHostdevDevProps(const virDomainDef *def, return g_steal_pointer(&props); } -static int -qemuBuildChrChardevFileStr(virLogManager *logManager, - virSecurityManager *secManager, - virQEMUDriverConfig *cfg, - virQEMUCaps *qemuCaps, - const virDomainDef *def, - virCommand *cmd, - virBuffer *buf, - const char *filearg, const char *fileval, - const char *appendarg, int appendval) -{ - /* Technically, to pass an FD via /dev/fdset we don't need - * any capability check because X_QEMU_CAPS_ADD_FD is already - * assumed. But keeping the old style is still handy when - * building a standalone command line (e.g. for tests). */ - if (logManager || - virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { - g_autofree char *fdset = NULL; - int logfd; - size_t idx; - - if (logManager) { - int flags = 0; - - if (appendval == VIR_TRISTATE_SWITCH_ABSENT || - appendval == VIR_TRISTATE_SWITCH_OFF) - flags |= VIR_LOG_MANAGER_PROTOCOL_DOMAIN_OPEN_LOG_FILE_TRUNCATE; - - if ((logfd = virLogManagerDomainOpenLogFile(logManager, - "qemu", - def->uuid, - def->name, - fileval, - flags, - NULL, NULL)) < 0) - return -1; - } else { - int oflags = O_CREAT | O_WRONLY; - - switch (appendval) { - case VIR_TRISTATE_SWITCH_ABSENT: - case VIR_TRISTATE_SWITCH_OFF: - oflags |= O_TRUNC; - break; - case VIR_TRISTATE_SWITCH_ON: - oflags |= O_APPEND; - break; - case VIR_TRISTATE_SWITCH_LAST: - break; - } - - if ((logfd = qemuDomainOpenFile(cfg, def, fileval, oflags, NULL)) < 0) - return -1; - - if (qemuSecuritySetImageFDLabel(secManager, (virDomainDef*)def, logfd) < 0) { - VIR_FORCE_CLOSE(logfd); - return -1; - } - } - - virCommandPassFDIndex(cmd, logfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset = qemuBuildFDSet(logfd, idx); - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - virBufferAsprintf(buf, ",%s=/dev/fdset/%zu,%s=on", filearg, idx, appendarg); - } else { - virBufferAsprintf(buf, ",%s=", filearg); - virQEMUBuildBufferEscapeComma(buf, fileval); - if (appendval != VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(buf, ",%s=%s", appendarg, - virTristateSwitchTypeToString(appendval)); - } - } - - return 0; -} - - static void qemuBuildChrChardevReconnectStr(virBuffer *buf, const virDomainChrSourceReconnectDef *def) @@ -5125,11 +5045,11 @@ enum { /* This function outputs a -chardev command line option which describes only the * host side of the character device */ static char * -qemuBuildChrChardevStr(virLogManager *logManager, - virSecurityManager *secManager, +qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, + virSecurityManager *secManager G_GNUC_UNUSED, virCommand *cmd, virQEMUDriverConfig *cfg, - const virDomainDef *def, + const virDomainDef *def G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *alias, virQEMUCaps *qemuCaps, @@ -5166,12 +5086,27 @@ qemuBuildChrChardevStr(virLogManager *logManager, case VIR_DOMAIN_CHR_TYPE_FILE: virBufferAsprintf(&buf, "file,id=%s", charAlias); - if (qemuBuildChrChardevFileStr(cdevflags & QEMU_BUILD_CHARDEV_FILE_LOGD ? - logManager : NULL, - secManager, cfg, qemuCaps, def, cmd, &buf, - "path", dev->data.file.path, - "append", dev->data.file.append) < 0) - return NULL; + if (chrSourcePriv->fd != -1) { + g_autofree char *fdset = NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->fd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->fd, idx); + chrSourcePriv->fd = -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",path=/dev/fdset/%zu,append=on", idx); + } else { + virBufferAddLit(&buf, ",path="); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + if (dev->data.file.append != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",append=%s", + virTristateSwitchTypeToString(dev->data.file.append)); + } + } break; case VIR_DOMAIN_CHR_TYPE_PIPE: @@ -5255,24 +5190,11 @@ qemuBuildChrChardevStr(virLogManager *logManager, case VIR_DOMAIN_CHR_TYPE_UNIX: virBufferAsprintf(&buf, "socket,id=%s", charAlias); - if (dev->data.nix.listen && - (cdevflags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { - int fd; - - if (qemuSecuritySetSocketLabel(secManager, (virDomainDef *)def) < 0) - return NULL; - fd = qemuOpenChrChardevUNIXSocket(dev); - if (qemuSecurityClearSocketLabel(secManager, (virDomainDef *)def) < 0) { - VIR_FORCE_CLOSE(fd); - return NULL; - } - if (fd < 0) - return NULL; - - virBufferAsprintf(&buf, ",fd=%d", fd); + if (chrSourcePriv->fd != -1) { + virBufferAsprintf(&buf, ",fd=%d", chrSourcePriv->fd); - virCommandPassFD(cmd, fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + chrSourcePriv->fd = -1; } else { virBufferAddLit(&buf, ",path="); virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); @@ -5306,11 +5228,27 @@ qemuBuildChrChardevStr(virLogManager *logManager, } if (dev->logfile) { - if (qemuBuildChrChardevFileStr(logManager, secManager, cfg, - qemuCaps, def, cmd, &buf, - "logfile", dev->logfile, - "logappend", dev->logappend) < 0) - return NULL; + if (chrSourcePriv->logfd != -1) { + g_autofree char *fdset = NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->logfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->logfd, idx); + chrSourcePriv->logfd = -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",logfile=/dev/fdset/%zu,logappend=on", idx); + } else { + virBufferAddLit(&buf, ",logfile="); + virQEMUBuildBufferEscapeComma(&buf, dev->logfile); + if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",logappend=%s", + virTristateSwitchTypeToString(dev->logappend)); + } + } } return virBufferContentAndReset(&buf); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4f0d266c73..cbaa39b618 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -850,6 +850,9 @@ qemuDomainChrSourcePrivateNew(void) if (!(priv = virObjectNew(qemuDomainChrSourcePrivateClass))) return NULL; + priv->fd = -1; + priv->logfd = -1; + return (virObject *) priv; } @@ -859,6 +862,9 @@ qemuDomainChrSourcePrivateDispose(void *obj) { qemuDomainChrSourcePrivate *priv = obj; + VIR_FORCE_CLOSE(priv->fd); + VIR_FORCE_CLOSE(priv->logfd); + g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 3de3f70b94..61704fdae7 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -341,6 +341,9 @@ struct _qemuDomainChrSourcePrivate { /* for char devices using secret * NB: *not* to be written to qemu domain object XML */ qemuDomainSecretInfo *secinfo; + + int fd; /* file descriptor of the chardev source */ + int logfd; /* file descriptor of the logging source */ }; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6b83a571b9..866b6b9ed6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -98,6 +98,9 @@ #include "storage_source.h" #include "backup_conf.h" +#include "logging/log_manager.h" +#include "logging/log_protocol.h" + #define VIR_FROM_THIS VIR_FROM_QEMU VIR_LOG_INIT("qemu.qemu_process"); @@ -3069,29 +3072,6 @@ qemuProcessInitPasswords(virQEMUDriver *driver, } -static int -qemuProcessPrepareChardevDevice(virDomainDef *def G_GNUC_UNUSED, - virDomainChrDef *dev, - void *opaque G_GNUC_UNUSED) -{ - int fd; - if (dev->source->type != VIR_DOMAIN_CHR_TYPE_FILE) - return 0; - - if ((fd = open(dev->source->data.file.path, - O_CREAT | O_APPEND, S_IRUSR|S_IWUSR)) < 0) { - virReportSystemError(errno, - _("Unable to pre-create chardev file '%s'"), - dev->source->data.file.path); - return -1; - } - - VIR_FORCE_CLOSE(fd); - - return 0; -} - - static int qemuProcessCleanupChardevDevice(virDomainDef *def G_GNUC_UNUSED, virDomainChrDef *dev, @@ -6806,6 +6786,200 @@ qemuProcessOpenVhostVsock(virDomainVsockDef *vsock) } +static int +qemuProcessPrepareHostBackendChardevFileHelper(const char *path, + virTristateSwitch append, + int *fd, + virLogManager *logManager, + virSecurityManager *secManager, + virQEMUCaps *qemuCaps, + virQEMUDriverConfig *cfg, + const virDomainDef *def) +{ + /* Technically, to pass an FD via /dev/fdset we don't need + * any capability check because X_QEMU_CAPS_ADD_FD is already + * assumed. But keeping the old style is still handy when + * building a standalone command line (e.g. for tests). */ + if (!logManager && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) + return 0; + + if (logManager) { + int flags = 0; + + if (append == VIR_TRISTATE_SWITCH_ABSENT || + append == VIR_TRISTATE_SWITCH_OFF) + flags |= VIR_LOG_MANAGER_PROTOCOL_DOMAIN_OPEN_LOG_FILE_TRUNCATE; + + if ((*fd = virLogManagerDomainOpenLogFile(logManager, + "qemu", + def->uuid, + def->name, + path, + flags, + NULL, NULL)) < 0) + return -1; + } else { + int oflags = O_CREAT | O_WRONLY; + + switch (append) { + case VIR_TRISTATE_SWITCH_ABSENT: + case VIR_TRISTATE_SWITCH_OFF: + oflags |= O_TRUNC; + break; + case VIR_TRISTATE_SWITCH_ON: + oflags |= O_APPEND; + break; + case VIR_TRISTATE_SWITCH_LAST: + break; + } + + if ((*fd = qemuDomainOpenFile(cfg, def, path, oflags, NULL)) < 0) + return -1; + + if (qemuSecuritySetImageFDLabel(secManager, (virDomainDef*)def, *fd) < 0) { + VIR_FORCE_CLOSE(*fd); + return -1; + } + } + + return 0; +} + + +struct qemuProcessPrepareHostBackendChardevData { + virQEMUCaps *qemuCaps; + virLogManager *logManager; + virSecurityManager *secManager; + virQEMUDriverConfig *cfg; + virDomainDef *def; +}; + + +static int +qemuProcessPrepareHostBackendChardevOne(virDomainDeviceDef *dev, + virDomainChrSourceDef *chardev, + void *opaque) +{ + struct qemuProcessPrepareHostBackendChardevData *data = opaque; + qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chardev); + + /* this function is also called for the monitor backend which doesn't have + * a 'dev' */ + if (dev) { + if (dev->type == VIR_DOMAIN_DEVICE_NET) { + /* due to a historical bug in qemu we don't use FD passtrhough for + * vhost-sockets for network devices */ + return 0; + } + } + + switch ((virDomainChrType) chardev->type) { + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_PTY: + case VIR_DOMAIN_CHR_TYPE_DEV: + case VIR_DOMAIN_CHR_TYPE_PIPE: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_UDP: + case VIR_DOMAIN_CHR_TYPE_TCP: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + if (qemuProcessPrepareHostBackendChardevFileHelper(chardev->data.file.path, + chardev->data.file.append, + &charpriv->fd, + data->logManager, + data->secManager, + data->qemuCaps, + data->cfg, + data->def) < 0) + return -1; + + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + if (chardev->data.nix.listen && + virQEMUCapsGet(data->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { + + if (qemuSecuritySetSocketLabel(data->secManager, data->def) < 0) + return -1; + + charpriv->fd = qemuOpenChrChardevUNIXSocket(chardev); + + if (qemuSecurityClearSocketLabel(data->secManager, data->def) < 0) { + VIR_FORCE_CLOSE(charpriv->fd); + return -1; + } + + if (charpriv->fd < 0) + return -1; + } + break; + + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported chardev '%s'"), + virDomainChrTypeToString(chardev->type)); + return -1; + } + + if (chardev->logfile) { + if (qemuProcessPrepareHostBackendChardevFileHelper(chardev->logfile, + chardev->logappend, + &charpriv->logfd, + data->logManager, + data->secManager, + data->qemuCaps, + data->cfg, + data->def) < 0) + return -1; + } + + return 0; +} + + +/* prepare the chardev backends for various devices: + * serial/parallel/channel chardevs, vhost-user disks, vhost-user network + * interfaces, smartcards, shared memory, and redirdevs */ +static int +qemuProcessPrepareHostBackendChardev(virDomainObj *vm, + virQEMUCaps *qemuCaps, + virSecurityManager *secManager) +{ + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver); + struct qemuProcessPrepareHostBackendChardevData data = { + .qemuCaps = qemuCaps, + .logManager = NULL, + .secManager = secManager, + .cfg = cfg, + .def = vm->def, + }; + g_autoptr(virLogManager) logManager = NULL; + + if (cfg->stdioLogD) { + if (!(logManager = data.logManager = virLogManagerNew(priv->driver->privileged))) + return -1; + } + + if (qemuDomainDeviceBackendChardevForeach(vm->def, + qemuProcessPrepareHostBackendChardevOne, + &data) < 0) + return -1; + + if (qemuProcessPrepareHostBackendChardevOne(NULL, priv->monConfig, &data) < 0) + return -1; + + return 0; +} + + /** * qemuProcessPrepareHost: * @driver: qemu driver @@ -6852,11 +7026,10 @@ qemuProcessPrepareHost(virQEMUDriver *driver, hostdev_flags) < 0) return -1; - VIR_DEBUG("Preparing chr devices"); - if (virDomainChrDefForeach(vm->def, - true, - qemuProcessPrepareChardevDevice, - NULL) < 0) + VIR_DEBUG("Preparing chr device backends"); + if (qemuProcessPrepareHostBackendChardev(vm, + priv->qemuCaps, + driver->securityManager) < 0) return -1; if (qemuProcessBuildDestroyMemoryPaths(driver, vm, NULL, true) < 0) diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5e4cd7389c..9cece1df91 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -376,6 +376,71 @@ testCheckExclusiveFlags(int flags) } +static int +testPrepareHostBackendChardevOne(virDomainDeviceDef *dev, + virDomainChrSourceDef *chardev, + void *opaque) +{ + virQEMUCaps *qemuCaps = opaque; + qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chardev); + + if (dev) { + if (dev->type == VIR_DOMAIN_DEVICE_NET) { + /* due to a historical bug in qemu we don't use FD passtrhough for + * vhost-sockets for network devices */ + return 0; + } + } + + switch ((virDomainChrType) chardev->type) { + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_PTY: + case VIR_DOMAIN_CHR_TYPE_DEV: + case VIR_DOMAIN_CHR_TYPE_PIPE: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_UDP: + case VIR_DOMAIN_CHR_TYPE_TCP: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { + if (fcntl(1750, F_GETFD) != -1) + abort(); + charpriv->fd = 1750; + } + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + if (chardev->data.nix.listen && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { + + if (fcntl(1729, F_GETFD) != -1) + abort(); + + charpriv->fd = 1729; + } + break; + + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + break; + } + + if (chardev->logfile) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { + if (fcntl(1751, F_GETFD) != -1) + abort(); + charpriv->logfd = 1751; + } + } + + return 0; +} + + static virCommand * testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, virDomainObj *vm, @@ -391,6 +456,20 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, VIR_QEMU_PROCESS_START_COLD) < 0) return NULL; + if (qemuDomainDeviceBackendChardevForeach(vm->def, + testPrepareHostBackendChardevOne, + info->qemuCaps) < 0) + return NULL; + + if (virQEMUCapsGet(info->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE)) { + qemuDomainChrSourcePrivate *monpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(priv->monConfig); + + if (fcntl(1729, F_GETFD) != -1) + abort(); + + monpriv->fd = 1729; + } + for (i = 0; i < vm->def->ndisks; i++) { virDomainDiskDef *disk = vm->def->disks[i]; -- 2.31.1

On 12/9/21 13:30, Peter Krempa wrote:
The opening of files for FD passing for a chardev backend was historically done in the function which is formatting the commandline.
This has multiple problems. Firstly the function takes a lot of parameters which need to be passed through the commandline formatters. This made the 'qemuBuildChrChardevStr' extremely unappealing to the extent that we have multiple other custom formatters in places which didn't really want to use the function.
Additionally the function is also creating files in the host in certain configurations which is wrong for a commandline formatter to do. This meant that e.g. not all chardev test cases can be converted to use DO_TEST_CAPS_LATEST as we attempt to use such code path and attempt to create files outside of the test directory.
This patch moves the opening of the filedescriptors from 'qemuBuildChrChardevFileStr' into a new helper 'qemuProcessPrepareHostBackendChardevOne' which is called using 'qemuDomainDeviceBackendChardevForeach'.
To preserve test behaviour we also have another instance 'testPrepareHostBackendChardevOne' which is populating mock filedescriptors.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 160 +++++++++------------------ src/qemu/qemu_domain.c | 6 + src/qemu/qemu_domain.h | 3 + src/qemu/qemu_process.c | 229 ++++++++++++++++++++++++++++++++++----- tests/qemuxml2argvtest.c | 79 ++++++++++++++ 5 files changed, 338 insertions(+), 139 deletions(-)
libvirt.git $ git bisect bad ff024b60cc39d5d41b1e68728a00a47e103ec4dd is the first bad commit virsh # start fedora error: Failed to start domain 'fedora' error: Unable to bind to UNIX socket path '/var/lib/libvirt/qemu/channel/target/domain-2-fedora/org.qemu.guest_agent.0': No such file or directory I don't have capacity to debug right now, but maybe I'll have later today. Michal

'qemuBuildChrChardevStr' doesn't use these flags any more. Stop passing them. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 64 +++++++++++------------------------------ 1 file changed, 17 insertions(+), 47 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01388b44ef..814b003e49 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5038,8 +5038,6 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) enum { QEMU_BUILD_CHARDEV_TCP_NOWAIT = (1 << 0), - QEMU_BUILD_CHARDEV_FILE_LOGD = (1 << 1), - QEMU_BUILD_CHARDEV_UNIX_FD_PASS = (1 << 2), }; /* This function outputs a -chardev command line option which describes only the @@ -5527,10 +5525,7 @@ qemuBuildMonitorCommandLine(virLogManager *logManager, qemuDomainObjPrivate *priv) { g_autofree char *chrdev = NULL; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (priv->chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (!priv->monConfig) return 0; @@ -5665,16 +5660,12 @@ qemuBuildRNGBackendChrdevStr(virLogManager *logManager, virDomainRNGDef *rng, virQEMUCaps *qemuCaps, char **chr, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; *chr = NULL; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; - switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: case VIR_DOMAIN_RNG_BACKEND_BUILTIN: @@ -9045,7 +9036,7 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { g_autoptr(virJSONValue) props = NULL; virDomainSmartcardDef *smartcard; @@ -9086,13 +9077,10 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, break; case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: { - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | QEMU_BUILD_CHARDEV_UNIX_FD_PASS; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; 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, @@ -9249,15 +9237,12 @@ qemuBuildShmemCommandLine(virLogManager *logManager, virDomainDef *def, virDomainShmemDef *shmem, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { g_autoptr(virJSONValue) memProps = NULL; g_autoptr(virJSONValue) devProps = NULL; g_autofree char *chardev = NULL; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (shmem->size) { /* @@ -9422,14 +9407,11 @@ qemuBuildSerialCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { size_t i; bool havespice = false; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (def->nserials) { for (i = 0; i < def->ngraphics && !havespice; i++) { @@ -9486,13 +9468,10 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nparallels; i++) { virDomainChrDef *parallel = def->parallels[i]; @@ -9523,13 +9502,10 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nchannels; i++) { virDomainChrDef *channel = def->channels[i]; @@ -9578,13 +9554,10 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; /* Explicit console devices */ for (i = 0; i < def->nconsoles; i++) { @@ -9714,13 +9687,10 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + bool chardevStdioLogd G_GNUC_UNUSED) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT | - QEMU_BUILD_CHARDEV_UNIX_FD_PASS; - if (chardevStdioLogd) - cdevflags |= QEMU_BUILD_CHARDEV_FILE_LOGD; + unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nredirdevs; i++) { virDomainRedirdevDef *redirdev = def->redirdevs[i]; -- 2.31.1

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 55 ++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 814b003e49..b637cd2bf5 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5659,8 +5659,7 @@ qemuBuildRNGBackendChrdevStr(virLogManager *logManager, const virDomainDef *def, virDomainRNGDef *rng, virQEMUCaps *qemuCaps, - char **chr, - bool chardevStdioLogd G_GNUC_UNUSED) + char **chr) { unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; @@ -5771,8 +5770,7 @@ qemuBuildRNGCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd) + virQEMUCaps *qemuCaps) { size_t i; @@ -5790,8 +5788,7 @@ qemuBuildRNGCommandLine(virLogManager *logManager, /* possibly add character device for backend */ if (qemuBuildRNGBackendChrdevStr(logManager, secManager, cmd, cfg, def, - rng, qemuCaps, &chardev, - chardevStdioLogd) < 0) + rng, qemuCaps, &chardev) < 0) return -1; if (chardev) @@ -9035,8 +9032,7 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { g_autoptr(virJSONValue) props = NULL; virDomainSmartcardDef *smartcard; @@ -9236,8 +9232,7 @@ qemuBuildShmemCommandLine(virLogManager *logManager, virQEMUDriverConfig *cfg, virDomainDef *def, virDomainShmemDef *shmem, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { g_autoptr(virJSONValue) memProps = NULL; g_autoptr(virJSONValue) devProps = NULL; @@ -9406,8 +9401,7 @@ qemuBuildSerialCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { size_t i; bool havespice = false; @@ -9467,8 +9461,7 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { size_t i; unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; @@ -9501,8 +9494,7 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { size_t i; unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; @@ -9553,8 +9545,7 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { size_t i; unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; @@ -9686,8 +9677,7 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager, virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, - virQEMUCaps *qemuCaps, - bool chardevStdioLogd G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { size_t i; unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; @@ -10566,7 +10556,6 @@ qemuBuildCommandLine(virQEMUDriver *driver, qemuDomainObjPrivate *priv = vm->privateData; virDomainDef *def = vm->def; virQEMUCaps *qemuCaps = priv->qemuCaps; - bool chardevStdioLogd = priv->chardevStdioLogd; VIR_DEBUG("driver=%p def=%p mon=%p " "qemuCaps=%p migrateURI=%s snapshot=%p vmop=%d flags=0x%x", @@ -10715,24 +10704,19 @@ qemuBuildCommandLine(virQEMUDriver *driver, nnicindexes, nicindexes) < 0) return NULL; - if (qemuBuildSmartcardCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildSmartcardCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildSerialCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildSerialCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildParallelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildParallelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildChannelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildChannelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildConsoleCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildConsoleCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildTPMsCommandLine(cmd, def, qemuCaps) < 0) @@ -10756,8 +10740,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildWatchdogCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRedirdevCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildRedirdevCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps) < 0) @@ -10769,8 +10752,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildMemballoonCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRNGCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps, - chardevStdioLogd) < 0) + if (qemuBuildRNGCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildNVRAMCommandLine(cmd, def) < 0) @@ -10805,8 +10787,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, for (i = 0; i < def->nshmems; i++) { if (qemuBuildShmemCommandLine(logManager, secManager, cmd, cfg, - def, def->shmems[i], qemuCaps, - chardevStdioLogd) < 0) + def, def->shmems[i], qemuCaps) < 0) return NULL; } -- 2.31.1

Use the qemuDomainDeviceBackendChardevForeach helper to iterate all eligible structs and convert the setup of the TLS defaults from the config. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 103 +++++++++++++++++++--------------------- src/qemu/qemu_domain.h | 13 ++--- src/qemu/qemu_driver.c | 7 +++ src/qemu/qemu_hotplug.c | 3 -- src/qemu/qemu_process.c | 23 ++++++++- 5 files changed, 85 insertions(+), 64 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cbaa39b618..550afca36e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -9720,66 +9720,63 @@ qemuDomainPrepareChannel(virDomainChrDef *channel, } -/* qemuDomainPrepareChardevSourceTLS: - * @source: pointer to host interface data for char devices - * @cfg: driver configuration - * - * Updates host interface TLS encryption setting based on qemu.conf - * for char devices. This will be presented as "tls='yes|no'" in - * live XML of a guest. - */ -void -qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDef *source, - virQEMUDriverConfig *cfg) -{ - if (source->type == VIR_DOMAIN_CHR_TYPE_TCP) { - if (source->data.tcp.haveTLS == VIR_TRISTATE_BOOL_ABSENT) { - if (cfg->chardevTLS) - source->data.tcp.haveTLS = VIR_TRISTATE_BOOL_YES; - else - source->data.tcp.haveTLS = VIR_TRISTATE_BOOL_NO; - source->data.tcp.tlsFromConfig = true; - } - } -} - - -/* qemuDomainPrepareChardevSource: - * @def: live domain definition - * @cfg: driver configuration +/* qemuDomainPrepareChardevSourceOne: + * @dev: device definition + * @charsrc: chardev source definition + * @opaque: pointer to struct qemuDomainPrepareChardevSourceData * - * Iterate through all devices that use virDomainChrSourceDef *as host - * interface part. + * Updates the config of a chardev source based on the qemu driver configuration. + * Note that this is meant to be called via + * qemuDomainDeviceBackendChardevForeach(One). */ -void -qemuDomainPrepareChardevSource(virDomainDef *def, - virQEMUDriverConfig *cfg) +int +qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev, + virDomainChrSourceDef *charsrc, + void *opaque) { - size_t i; - - for (i = 0; i < def->nserials; i++) - qemuDomainPrepareChardevSourceTLS(def->serials[i]->source, cfg); - - for (i = 0; i < def->nparallels; i++) - qemuDomainPrepareChardevSourceTLS(def->parallels[i]->source, cfg); + struct qemuDomainPrepareChardevSourceData *data = opaque; - for (i = 0; i < def->nchannels; i++) - qemuDomainPrepareChardevSourceTLS(def->channels[i]->source, cfg); - - for (i = 0; i < def->nconsoles; i++) - qemuDomainPrepareChardevSourceTLS(def->consoles[i]->source, cfg); + switch ((virDomainDeviceType) dev->type) { - for (i = 0; i < def->nrngs; i++) - if (def->rngs[i]->backend == VIR_DOMAIN_RNG_BACKEND_EGD) - qemuDomainPrepareChardevSourceTLS(def->rngs[i]->source.chardev, cfg); + case VIR_DOMAIN_DEVICE_CHR: + case VIR_DOMAIN_DEVICE_RNG: + case VIR_DOMAIN_DEVICE_SMARTCARD: + case VIR_DOMAIN_DEVICE_REDIRDEV: + if (charsrc->type == VIR_DOMAIN_CHR_TYPE_TCP) { + if (charsrc->data.tcp.haveTLS == VIR_TRISTATE_BOOL_ABSENT) { + charsrc->data.tcp.haveTLS = virTristateBoolFromBool(data->cfg->chardevTLS); + charsrc->data.tcp.tlsFromConfig = true; + } + } + break; - for (i = 0; i < def->nsmartcards; i++) - if (def->smartcards[i]->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH) - qemuDomainPrepareChardevSourceTLS(def->smartcards[i]->data.passthru, - cfg); + case VIR_DOMAIN_DEVICE_DISK: + case VIR_DOMAIN_DEVICE_NET: + case VIR_DOMAIN_DEVICE_SHMEM: + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_FS: + case VIR_DOMAIN_DEVICE_INPUT: + case VIR_DOMAIN_DEVICE_SOUND: + case VIR_DOMAIN_DEVICE_VIDEO: + case VIR_DOMAIN_DEVICE_HOSTDEV: + case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_CONTROLLER: + case VIR_DOMAIN_DEVICE_GRAPHICS: + case VIR_DOMAIN_DEVICE_HUB: + case VIR_DOMAIN_DEVICE_NONE: + case VIR_DOMAIN_DEVICE_MEMBALLOON: + case VIR_DOMAIN_DEVICE_NVRAM: + case VIR_DOMAIN_DEVICE_TPM: + case VIR_DOMAIN_DEVICE_PANIC: + case VIR_DOMAIN_DEVICE_LAST: + case VIR_DOMAIN_DEVICE_MEMORY: + case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: + case VIR_DOMAIN_DEVICE_AUDIO: + break; + } - for (i = 0; i < def->nredirdevs; i++) - qemuDomainPrepareChardevSourceTLS(def->redirdevs[i]->source, cfg); + return 0; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 61704fdae7..f84acf408b 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -864,13 +864,14 @@ int qemuDomainPrepareChannel(virDomainChrDef *chr, const char *domainChannelTargetDir) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDef *source, - virQEMUDriverConfig *cfg) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +struct qemuDomainPrepareChardevSourceData { + virQEMUDriverConfig *cfg; +}; -void qemuDomainPrepareChardevSource(virDomainDef *def, - virQEMUDriverConfig *cfg) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int +qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev, + virDomainChrSourceDef *charsrc, + void *opaque); void qemuDomainPrepareShmemChardev(virDomainShmemDef *shmem) ATTRIBUTE_NONNULL(1); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8093b8f69b..10feb606ad 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6793,6 +6793,13 @@ qemuDomainAttachDeviceLive(virDomainObj *vm, { int ret = -1; const char *alias = NULL; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg }; + + if (qemuDomainDeviceBackendChardevForeachOne(dev, + qemuDomainPrepareChardevSourceOne, + &chardevBackendData) < 0) + return -1; switch ((virDomainDeviceType)dev->type) { case VIR_DOMAIN_DEVICE_DISK: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 2e1d18c633..66961eba70 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1852,9 +1852,6 @@ qemuDomainAddChardevTLSObjects(virQEMUDriver *driver, g_autoptr(virJSONValue) tlsProps = NULL; g_autoptr(virJSONValue) secProps = NULL; - /* NB: This may alter haveTLS based on cfg */ - qemuDomainPrepareChardevSourceTLS(dev, cfg); - if (dev->type != VIR_DOMAIN_CHR_TYPE_TCP || dev->data.tcp.haveTLS != VIR_TRISTATE_BOOL_YES) return 0; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 866b6b9ed6..be49cc9360 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6498,6 +6498,24 @@ qemuProcessUpdateSEVInfo(virDomainObj *vm) } +/* qemuProcessPrepareChardevSource: + * @def: live domain definition + * @cfg: driver configuration + * + * Iterate through all devices that use virDomainChrSourceDef as backend. + */ +static int +qemuProcessPrepareChardevSource(virDomainDef *def, + virQEMUDriverConfig *cfg) +{ + struct qemuDomainPrepareChardevSourceData data = { .cfg = cfg }; + + return qemuDomainDeviceBackendChardevForeach(def, + qemuDomainPrepareChardevSourceOne, + &data); +} + + /** * qemuProcessPrepareDomain: * @driver: qemu driver @@ -6586,8 +6604,9 @@ qemuProcessPrepareDomain(virQEMUDriver *driver, if (qemuProcessPrepareDomainHostdevs(vm, priv) < 0) return -1; - VIR_DEBUG("Prepare chardev source backends for TLS"); - qemuDomainPrepareChardevSource(vm->def, cfg); + VIR_DEBUG("Prepare chardev source backends"); + if (qemuProcessPrepareChardevSource(vm->def, cfg) < 0) + return -1; VIR_DEBUG("Prepare device secrets"); if (qemuDomainSecretPrepare(driver, vm) < 0) -- 2.31.1

We have just one case when we wish to wait for incomming connections for a listening socket and that is for vhost-user network devices. Passing this via a flag to qemuBuildChrChardevStr is unwieldy. Add a field to qemuDomainChrSourcePrivate and populate it for our special case inside of qemuDomainPrepareChardevSourceOne. Since we wait for incomming connections only on startup of a new VM we also need to pass in a flag whether qemuDomainPrepareChardevSourceOne is called on a new start or on hotplug. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 6 +++--- src/qemu/qemu_domain.c | 8 +++++++- src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_driver.c | 3 ++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b637cd2bf5..0baf3acde6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5051,7 +5051,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *alias, virQEMUCaps *qemuCaps, - unsigned int cdevflags) + unsigned int cdevflags G_GNUC_UNUSED) { qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; @@ -5148,7 +5148,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, if (dev->data.tcp.listen) { virBufferAddLit(&buf, ",server=on"); - if (cdevflags & QEMU_BUILD_CHARDEV_TCP_NOWAIT) + if (!chrSourcePriv->wait) virBufferAddLit(&buf, ",wait=off"); } @@ -5199,7 +5199,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, } if (dev->data.nix.listen) { virBufferAddLit(&buf, ",server=on"); - if (cdevflags & QEMU_BUILD_CHARDEV_TCP_NOWAIT) + if (!chrSourcePriv->wait) virBufferAddLit(&buf, ",wait=off"); } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 550afca36e..e6d6bf10f1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -9735,6 +9735,7 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev, void *opaque) { struct qemuDomainPrepareChardevSourceData *data = opaque; + qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(charsrc); switch ((virDomainDeviceType) dev->type) { @@ -9750,8 +9751,13 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev, } break; - case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_NET: + /* when starting a fresh VM, vhost-user network sockets wait for connection */ + if (!data->hotplug) + charpriv->wait = true; + break; + + case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f84acf408b..2d93cf2253 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -344,6 +344,7 @@ struct _qemuDomainChrSourcePrivate { int fd; /* file descriptor of the chardev source */ int logfd; /* file descriptor of the logging source */ + bool wait; /* wait for incomming connections on chardev */ }; @@ -866,6 +867,7 @@ int qemuDomainPrepareChannel(virDomainChrDef *chr, struct qemuDomainPrepareChardevSourceData { virQEMUDriverConfig *cfg; + bool hotplug; }; int diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 10feb606ad..4301f3f89e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6794,7 +6794,8 @@ qemuDomainAttachDeviceLive(virDomainObj *vm, int ret = -1; const char *alias = NULL; g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); - struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg }; + struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg, + .hotplug = true }; if (qemuDomainDeviceBackendChardevForeachOne(dev, qemuDomainPrepareChardevSourceOne, -- 2.31.1

The argument and corresponding enum are not used any more. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 45 ++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0baf3acde6..918361d55c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5036,10 +5036,6 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) } -enum { - QEMU_BUILD_CHARDEV_TCP_NOWAIT = (1 << 0), -}; - /* This function outputs a -chardev command line option which describes only the * host side of the character device */ static char * @@ -5050,8 +5046,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, const virDomainDef *def G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *alias, - virQEMUCaps *qemuCaps, - unsigned int cdevflags G_GNUC_UNUSED) + virQEMUCaps *qemuCaps) { qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; @@ -5525,7 +5520,6 @@ qemuBuildMonitorCommandLine(virLogManager *logManager, qemuDomainObjPrivate *priv) { g_autofree char *chrdev = NULL; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (!priv->monConfig) return 0; @@ -5533,7 +5527,7 @@ qemuBuildMonitorCommandLine(virLogManager *logManager, if (!(chrdev = qemuBuildChrChardevStr(logManager, secManager, cmd, cfg, def, priv->monConfig, "monitor", - priv->qemuCaps, cdevflags))) + priv->qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, chrdev); @@ -5661,8 +5655,6 @@ qemuBuildRNGBackendChrdevStr(virLogManager *logManager, virQEMUCaps *qemuCaps, char **chr) { - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; - *chr = NULL; switch ((virDomainRNGBackend) rng->backend) { @@ -5676,8 +5668,8 @@ qemuBuildRNGBackendChrdevStr(virLogManager *logManager, if (!(*chr = qemuBuildChrChardevStr(logManager, secManager, cmd, cfg, def, rng->source.chardev, - rng->info.alias, qemuCaps, - cdevflags))) + rng->info.alias, + qemuCaps))) return -1; break; } @@ -8629,7 +8621,7 @@ qemuInterfaceVhostuserConnect(virQEMUDriver *driver, if (!(*chardev = qemuBuildChrChardevStr(logManager, secManager, cmd, cfg, def, net->data.vhostuser, - net->info.alias, qemuCaps, 0))) + net->info.alias, qemuCaps))) return -1; break; @@ -9073,7 +9065,6 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, break; case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: { - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; g_autofree char *chardevstr = NULL; g_autofree char *chardevalias = g_strdup_printf("char%s", smartcard->info.alias); @@ -9081,7 +9072,7 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, cmd, cfg, def, smartcard->data.passthru, smartcard->info.alias, - qemuCaps, cdevflags))) { + qemuCaps))) { return -1; } @@ -9237,7 +9228,6 @@ qemuBuildShmemCommandLine(virLogManager *logManager, g_autoptr(virJSONValue) memProps = NULL; g_autoptr(virJSONValue) devProps = NULL; g_autofree char *chardev = NULL; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (shmem->size) { /* @@ -9299,8 +9289,8 @@ qemuBuildShmemCommandLine(virLogManager *logManager, chardev = qemuBuildChrChardevStr(logManager, secManager, cmd, cfg, def, shmem->server.chr, - shmem->info.alias, qemuCaps, - cdevflags); + shmem->info.alias, + qemuCaps); if (!chardev) return -1; @@ -9405,7 +9395,6 @@ qemuBuildSerialCommandLine(virLogManager *logManager, { size_t i; bool havespice = false; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; if (def->nserials) { for (i = 0; i < def->ngraphics && !havespice; i++) { @@ -9425,7 +9414,7 @@ qemuBuildSerialCommandLine(virLogManager *logManager, cmd, cfg, def, serial->source, serial->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, devstr); @@ -9464,7 +9453,6 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, virQEMUCaps *qemuCaps) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nparallels; i++) { virDomainChrDef *parallel = def->parallels[i]; @@ -9474,7 +9462,7 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, cmd, cfg, def, parallel->source, parallel->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, devstr); @@ -9497,7 +9485,6 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, virQEMUCaps *qemuCaps) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nchannels; i++) { virDomainChrDef *channel = def->channels[i]; @@ -9508,7 +9495,7 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, cmd, cfg, def, channel->source, channel->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); @@ -9548,7 +9535,6 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, virQEMUCaps *qemuCaps) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; /* Explicit console devices */ for (i = 0; i < def->nconsoles; i++) { @@ -9561,7 +9547,7 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, cmd, cfg, def, console->source, console->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, devstr); @@ -9576,7 +9562,7 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, cmd, cfg, def, console->source, console->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, devstr); @@ -9591,7 +9577,7 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, cmd, cfg, def, console->source, console->info.alias, - qemuCaps, cdevflags))) + qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, devstr); @@ -9680,7 +9666,6 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager, virQEMUCaps *qemuCaps) { size_t i; - unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT; for (i = 0; i < def->nredirdevs; i++) { virDomainRedirdevDef *redirdev = def->redirdevs[i]; @@ -9691,7 +9676,7 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager, cmd, cfg, def, redirdev->source, redirdev->info.alias, - qemuCaps, cdevflags))) { + qemuCaps))) { return -1; } -- 2.31.1

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 145 +++++++++++++++------------------------- src/qemu/qemu_command.h | 2 - src/qemu/qemu_process.c | 4 -- 3 files changed, 55 insertions(+), 96 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 918361d55c..5c2b8d65fd 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5039,11 +5039,8 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) /* This function outputs a -chardev command line option which describes only the * host side of the character device */ static char * -qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED, - virSecurityManager *secManager G_GNUC_UNUSED, - virCommand *cmd, +qemuBuildChrChardevStr(virCommand *cmd, virQEMUDriverConfig *cfg, - const virDomainDef *def G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *alias, virQEMUCaps *qemuCaps) @@ -5512,11 +5509,8 @@ qemuBuildHostdevCommandLine(virCommand *cmd, static int -qemuBuildMonitorCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildMonitorCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, - virDomainDef *def, qemuDomainObjPrivate *priv) { g_autofree char *chrdev = NULL; @@ -5524,9 +5518,10 @@ qemuBuildMonitorCommandLine(virLogManager *logManager, if (!priv->monConfig) return 0; - if (!(chrdev = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, - priv->monConfig, "monitor", + if (!(chrdev = qemuBuildChrChardevStr(cmd, + cfg, + priv->monConfig, + "monitor", priv->qemuCaps))) return -1; virCommandAddArg(cmd, "-chardev"); @@ -5646,11 +5641,8 @@ qemuBuildSclpDevProps(virDomainChrDef *dev) static int -qemuBuildRNGBackendChrdevStr(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildRNGBackendChrdevStr(virCommand *cmd, virQEMUDriverConfig *cfg, - const virDomainDef *def, virDomainRNGDef *rng, virQEMUCaps *qemuCaps, char **chr) @@ -5665,8 +5657,8 @@ qemuBuildRNGBackendChrdevStr(virLogManager *logManager, return 0; case VIR_DOMAIN_RNG_BACKEND_EGD: - if (!(*chr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(*chr = qemuBuildChrChardevStr(cmd, + cfg, rng->source.chardev, rng->info.alias, qemuCaps))) @@ -5757,9 +5749,7 @@ qemuBuildRNGDevProps(const virDomainDef *def, static int -qemuBuildRNGCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildRNGCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -5779,8 +5769,7 @@ qemuBuildRNGCommandLine(virLogManager *logManager, } /* possibly add character device for backend */ - if (qemuBuildRNGBackendChrdevStr(logManager, secManager, cmd, cfg, def, - rng, qemuCaps, &chardev) < 0) + if (qemuBuildRNGBackendChrdevStr(cmd, cfg, rng, qemuCaps, &chardev) < 0) return -1; if (chardev) @@ -8606,10 +8595,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg, static int qemuInterfaceVhostuserConnect(virQEMUDriver *driver, - virLogManager *logManager, - virSecurityManager *secManager, virCommand *cmd, - virDomainDef *def, virDomainNetDef *net, virQEMUCaps *qemuCaps, char **chardev) @@ -8618,10 +8604,11 @@ qemuInterfaceVhostuserConnect(virQEMUDriver *driver, switch ((virDomainChrType)net->data.vhostuser->type) { case VIR_DOMAIN_CHR_TYPE_UNIX: - if (!(*chardev = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(*chardev = qemuBuildChrChardevStr(cmd, + cfg, net->data.vhostuser, - net->info.alias, qemuCaps))) + net->info.alias, + qemuCaps))) return -1; break; @@ -8650,8 +8637,6 @@ qemuInterfaceVhostuserConnect(virQEMUDriver *driver, static int qemuBuildInterfaceCommandLine(virQEMUDriver *driver, virDomainObj *vm, - virLogManager *logManager, - virSecurityManager *secManager, virCommand *cmd, virDomainNetDef *net, virQEMUCaps *qemuCaps, @@ -8742,8 +8727,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, case VIR_DOMAIN_NET_TYPE_VHOSTUSER: requireNicdev = true; - if (qemuInterfaceVhostuserConnect(driver, logManager, secManager, - cmd, def, net, qemuCaps, &chardev) < 0) + if (qemuInterfaceVhostuserConnect(driver, cmd, net, qemuCaps, &chardev) < 0) goto cleanup; if (virNetDevOpenvswitchGetVhostuserIfname(net->data.vhostuser->data.nix.path, @@ -8980,8 +8964,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, static int qemuBuildNetCommandLine(virQEMUDriver *driver, virDomainObj *vm, - virLogManager *logManager, - virSecurityManager *secManager, virCommand *cmd, virQEMUCaps *qemuCaps, virNetDevVPortProfileOp vmop, @@ -8997,7 +8979,7 @@ qemuBuildNetCommandLine(virQEMUDriver *driver, for (i = 0; i < def->nnets; i++) { virDomainNetDef *net = def->nets[i]; - if (qemuBuildInterfaceCommandLine(driver, vm, logManager, secManager, cmd, net, + if (qemuBuildInterfaceCommandLine(driver, vm, cmd, net, qemuCaps, vmop, standalone, nnicindexes, nicindexes) < 0) @@ -9019,9 +9001,7 @@ qemuBuildNetCommandLine(virQEMUDriver *driver, static int -qemuBuildSmartcardCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildSmartcardCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9068,8 +9048,8 @@ qemuBuildSmartcardCommandLine(virLogManager *logManager, g_autofree char *chardevstr = NULL; g_autofree char *chardevalias = g_strdup_printf("char%s", smartcard->info.alias); - if (!(chardevstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(chardevstr = qemuBuildChrChardevStr(cmd, + cfg, smartcard->data.passthru, smartcard->info.alias, qemuCaps))) { @@ -9217,9 +9197,7 @@ qemuBuildShmemBackendMemProps(virDomainShmemDef *shmem) static int -qemuBuildShmemCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildShmemCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, virDomainDef *def, virDomainShmemDef *shmem, @@ -9286,11 +9264,11 @@ qemuBuildShmemCommandLine(virLogManager *logManager, return -1; if (shmem->server.enabled) { - chardev = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, - shmem->server.chr, - shmem->info.alias, - qemuCaps); + chardev = qemuBuildChrChardevStr(cmd, + cfg, + shmem->server.chr, + shmem->info.alias, + qemuCaps); if (!chardev) return -1; @@ -9386,9 +9364,7 @@ qemuChrIsPlatformDevice(const virDomainDef *def, static int -qemuBuildSerialCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildSerialCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9410,8 +9386,8 @@ qemuBuildSerialCommandLine(virLogManager *logManager, if (serial->source->type == VIR_DOMAIN_CHR_TYPE_SPICEPORT && !havespice) continue; - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, serial->source, serial->info.alias, qemuCaps))) @@ -9445,9 +9421,7 @@ qemuBuildSerialCommandLine(virLogManager *logManager, static int -qemuBuildParallelsCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildParallelsCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9458,8 +9432,8 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, virDomainChrDef *parallel = def->parallels[i]; g_autofree char *devstr = NULL; - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, parallel->source, parallel->info.alias, qemuCaps))) @@ -9477,9 +9451,7 @@ qemuBuildParallelsCommandLine(virLogManager *logManager, static int -qemuBuildChannelsCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildChannelsCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9491,8 +9463,8 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, g_autofree char *chardevstr = NULL; g_autoptr(virJSONValue) netdevprops = NULL; - if (!(chardevstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(chardevstr = qemuBuildChrChardevStr(cmd, + cfg, channel->source, channel->info.alias, qemuCaps))) @@ -9527,9 +9499,7 @@ qemuBuildChannelsCommandLine(virLogManager *logManager, static int -qemuBuildConsoleCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildConsoleCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9543,8 +9513,8 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, switch (console->targetType) { case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, console->source, console->info.alias, qemuCaps))) @@ -9558,8 +9528,8 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, break; case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, console->source, console->info.alias, qemuCaps))) @@ -9573,8 +9543,8 @@ qemuBuildConsoleCommandLine(virLogManager *logManager, break; case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, console->source, console->info.alias, qemuCaps))) @@ -9658,9 +9628,7 @@ qemuBuildRedirdevDevProps(const virDomainDef *def, static int -qemuBuildRedirdevCommandLine(virLogManager *logManager, - virSecurityManager *secManager, - virCommand *cmd, +qemuBuildRedirdevCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -9672,8 +9640,8 @@ qemuBuildRedirdevCommandLine(virLogManager *logManager, g_autoptr(virJSONValue) devprops = NULL; char *devstr; - if (!(devstr = qemuBuildChrChardevStr(logManager, secManager, - cmd, cfg, def, + if (!(devstr = qemuBuildChrChardevStr(cmd, + cfg, redirdev->source, redirdev->info.alias, qemuCaps))) { @@ -10522,8 +10490,6 @@ qemuBuildCompatDeprecatedCommandLine(virCommand *cmd, */ virCommand * qemuBuildCommandLine(virQEMUDriver *driver, - virLogManager *logManager, - virSecurityManager *secManager, virDomainObj *vm, const char *migrateURI, virDomainMomentObj *snapshot, @@ -10650,7 +10616,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, virCommandAddArg(cmd, "-no-user-config"); virCommandAddArg(cmd, "-nodefaults"); - if (qemuBuildMonitorCommandLine(logManager, secManager, cmd, cfg, def, priv) < 0) + if (qemuBuildMonitorCommandLine(cmd, cfg, priv) < 0) return NULL; if (qemuBuildClockCommandLine(cmd, def, qemuCaps) < 0) @@ -10684,24 +10650,24 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildFilesystemCommandLine(cmd, def, qemuCaps, priv) < 0) return NULL; - if (qemuBuildNetCommandLine(driver, vm, logManager, secManager, cmd, + if (qemuBuildNetCommandLine(driver, vm, cmd, qemuCaps, vmop, standalone, nnicindexes, nicindexes) < 0) return NULL; - if (qemuBuildSmartcardCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildSmartcardCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildSerialCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildSerialCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildParallelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildParallelsCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildChannelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildChannelsCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; - if (qemuBuildConsoleCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildConsoleCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildTPMsCommandLine(cmd, def, qemuCaps) < 0) @@ -10725,7 +10691,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildWatchdogCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRedirdevCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildRedirdevCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps) < 0) @@ -10737,7 +10703,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildMemballoonCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRNGCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildRNGCommandLine(cmd, cfg, def, qemuCaps) < 0) return NULL; if (qemuBuildNVRAMCommandLine(cmd, def) < 0) @@ -10771,8 +10737,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, return NULL; for (i = 0; i < def->nshmems; i++) { - if (qemuBuildShmemCommandLine(logManager, secManager, cmd, cfg, - def, def->shmems[i], qemuCaps) < 0) + if (qemuBuildShmemCommandLine(cmd, cfg, def, def->shmems[i], qemuCaps) < 0) return NULL; } diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 7dec2cb4af..dbdf3a4793 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -44,8 +44,6 @@ VIR_ENUM_DECL(qemuVideo); VIR_ENUM_DECL(qemuSoundCodec); virCommand *qemuBuildCommandLine(virQEMUDriver *driver, - virLogManager *logManager, - virSecurityManager *secManager, virDomainObj *vm, const char *migrateURI, virDomainMomentObj *snapshot, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index be49cc9360..d31ab103cf 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7463,8 +7463,6 @@ qemuProcessLaunch(virConnectPtr conn, VIR_DEBUG("Building emulator command line"); if (!(cmd = qemuBuildCommandLine(driver, - qemuDomainLogContextGetManager(logCtxt), - driver->securityManager, vm, incoming ? incoming->launchURI : NULL, snapshot, vmop, @@ -7978,8 +7976,6 @@ qemuProcessCreatePretendCmdBuild(virQEMUDriver *driver, { VIR_DEBUG("Building emulator command line"); return qemuBuildCommandLine(driver, - NULL, - driver->securityManager, vm, migrateURI, NULL, -- 2.31.1

Now that the test cases won't cause host modification we can add the contemporary versions. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- .../console-compat-auto.x86_64-latest.args | 39 +++++++++++++++++ .../console-compat-chardev.x86_64-latest.args | 39 +++++++++++++++++ .../console-compat.x86_64-latest.args | 38 ++++++++++++++++ ...arallel-parport-chardev.x86_64-latest.args | 39 +++++++++++++++++ .../parallel-tcp-chardev.x86_64-latest.args | 39 +++++++++++++++++ .../pci-serial-dev-chardev.x86_64-latest.args | 39 +++++++++++++++++ ...rial-dev-chardev-iobase.x86_64-latest.args | 39 +++++++++++++++++ .../serial-dev-chardev.x86_64-latest.args | 39 +++++++++++++++++ .../serial-file-chardev.x86_64-latest.args | 40 +++++++++++++++++ .../serial-file-log.x86_64-latest.args | 40 +++++++++++++++++ .../serial-many-chardev.x86_64-latest.args | 42 ++++++++++++++++++ .../serial-pty-chardev.x86_64-latest.args | 39 +++++++++++++++++ ...erial-spiceport-nospice.x86_64-latest.args | 37 ++++++++++++++++ .../serial-spiceport.x86_64-latest.args | 41 ++++++++++++++++++ .../serial-tcp-chardev.x86_64-latest.args | 39 +++++++++++++++++ ...rial-tcp-telnet-chardev.x86_64-latest.args | 39 +++++++++++++++++ ...p-tlsx509-chardev-notls.x86_64-latest.args | 41 ++++++++++++++++++ ...-tlsx509-chardev-verify.x86_64-latest.args | 42 ++++++++++++++++++ ...ial-tcp-tlsx509-chardev.x86_64-latest.args | 42 ++++++++++++++++++ ...-tlsx509-secret-chardev.x86_64-latest.args | 43 +++++++++++++++++++ .../serial-udp-chardev.x86_64-latest.args | 41 ++++++++++++++++++ ...rial-unix-missing-source.x86_64-latest.err | 1 + .../serial-vc-chardev.x86_64-latest.args | 39 +++++++++++++++++ tests/qemuxml2argvtest.c | 26 +++++++++++ 24 files changed, 903 insertions(+) create mode 100644 tests/qemuxml2argvdata/console-compat-auto.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/console-compat-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/console-compat.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/parallel-parport-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/parallel-tcp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/pci-serial-dev-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-dev-chardev-iobase.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-dev-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-pty-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-spiceport-nospice.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-spiceport.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-telnet-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-udp-chardev.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/serial-unix-missing-source.x86_64-latest.err create mode 100644 tests/qemuxml2argvdata/serial-vc-chardev.x86_64-latest.args diff --git a/tests/qemuxml2argvdata/console-compat-auto.x86_64-latest.args b/tests/qemuxml2argvdata/console-compat-auto.x86_64-latest.args new file mode 100644 index 0000000000..7b31c86820 --- /dev/null +++ b/tests/qemuxml2argvdata/console-compat-auto.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev pty,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/console-compat-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/console-compat-chardev.x86_64-latest.args new file mode 100644 index 0000000000..7b31c86820 --- /dev/null +++ b/tests/qemuxml2argvdata/console-compat-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev pty,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/console-compat.x86_64-latest.args b/tests/qemuxml2argvdata/console-compat.x86_64-latest.args new file mode 100644 index 0000000000..17a356b480 --- /dev/null +++ b/tests/qemuxml2argvdata/console-compat.x86_64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev pty,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/parallel-parport-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/parallel-parport-chardev.x86_64-latest.args new file mode 100644 index 0000000000..eecdb27463 --- /dev/null +++ b/tests/qemuxml2argvdata/parallel-parport-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev parport,id=charparallel0,path=/dev/parport0 \ +-device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/parallel-tcp-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/parallel-tcp-chardev.x86_64-latest.args new file mode 100644 index 0000000000..b549c433a5 --- /dev/null +++ b/tests/qemuxml2argvdata/parallel-tcp-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev socket,id=charparallel0,host=127.0.0.1,port=9999,server=on,wait=off \ +-device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/pci-serial-dev-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/pci-serial-dev-chardev.x86_64-latest.args new file mode 100644 index 0000000000..988ec823b4 --- /dev/null +++ b/tests/qemuxml2argvdata/pci-serial-dev-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev tty,id=charserial0,path=/dev/ttyS2 \ +-device '{"driver":"pci-serial","chardev":"charserial0","id":"serial0","bus":"pci.0","addr":"0x4"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-dev-chardev-iobase.x86_64-latest.args b/tests/qemuxml2argvdata/serial-dev-chardev-iobase.x86_64-latest.args new file mode 100644 index 0000000000..512d1f7e9d --- /dev/null +++ b/tests/qemuxml2argvdata/serial-dev-chardev-iobase.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev tty,id=charserial0,path=/dev/ttyS2 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","iobase":1016,"irq":4}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-dev-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-dev-chardev.x86_64-latest.args new file mode 100644 index 0000000000..cfa0f8ce02 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-dev-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev tty,id=charserial0,path=/dev/ttyS2 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args new file mode 100644 index 0000000000..9c7fd01f97 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args @@ -0,0 +1,40 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-add-fd set=0,fd=1750 \ +-chardev file,id=charserial0,path=/dev/fdset/0,append=on \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args b/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args new file mode 100644 index 0000000000..f7f59bc542 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args @@ -0,0 +1,40 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-add-fd set=0,fd=1750 \ +-add-fd set=1,fd=1751 \ +-chardev file,id=charserial0,path=/dev/fdset/0,append=on,logfile=/dev/fdset/1,logappend=on \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args new file mode 100644 index 0000000000..1e0f0110bf --- /dev/null +++ b/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args @@ -0,0 +1,42 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev pty,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-add-fd set=0,fd=1750 \ +-chardev file,id=charserial1,path=/dev/fdset/0,append=on \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-pty-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-pty-chardev.x86_64-latest.args new file mode 100644 index 0000000000..7b31c86820 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-pty-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev pty,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-spiceport-nospice.x86_64-latest.args b/tests/qemuxml2argvdata/serial-spiceport-nospice.x86_64-latest.args new file mode 100644 index 0000000000..7a52bb6a8c --- /dev/null +++ b/tests/qemuxml2argvdata/serial-spiceport-nospice.x86_64-latest.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-spiceport.x86_64-latest.args b/tests/qemuxml2argvdata/serial-spiceport.x86_64-latest.args new file mode 100644 index 0000000000..f552782edf --- /dev/null +++ b/tests/qemuxml2argvdata/serial-spiceport.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev spiceport,id=charserial0,name=org.qemu.console.serial.0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-device '{"driver":"usb-tablet","id":"input0","bus":"usb.0","port":"1"}' \ +-audiodev '{"id":"audio1","driver":"spice"}' \ +-spice port=5903,tls-port=5904,addr=127.0.0.1,x509-dir=/etc/pki/libvirt-spice,seamless-migration=on \ +-device '{"driver":"qxl-vga","id":"video0","ram_size":67108864,"vram_size":67108864,"vram64_size_mb":0,"vgamem_mb":8,"max_outputs":1,"bus":"pci.0","addr":"0x2"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-chardev.x86_64-latest.args new file mode 100644 index 0000000000..33e6215ebb --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev socket,id=charserial0,host=127.0.0.1,port=9999 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-telnet-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-telnet-chardev.x86_64-latest.args new file mode 100644 index 0000000000..4433ce50f5 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-telnet-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev socket,id=charserial0,host=127.0.0.1,port=9999,telnet=on,server=on,wait=off \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.x86_64-latest.args new file mode 100644 index 0000000000..f4c3ca4cbd --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,localport=1111 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-chardev socket,id=charserial1,host=127.0.0.1,port=5555 \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.x86_64-latest.args new file mode 100644 index 0000000000..39d8c562c0 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.x86_64-latest.args @@ -0,0 +1,42 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,localport=1111 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-object '{"qom-type":"tls-creds-x509","id":"objcharserial1_tls0","dir":"/etc/pki/libvirt-chardev","endpoint":"client","verify-peer":true}' \ +-chardev socket,id=charserial1,host=127.0.0.1,port=5555,tls-creds=objcharserial1_tls0 \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.x86_64-latest.args new file mode 100644 index 0000000000..39d8c562c0 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.x86_64-latest.args @@ -0,0 +1,42 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,localport=1111 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-object '{"qom-type":"tls-creds-x509","id":"objcharserial1_tls0","dir":"/etc/pki/libvirt-chardev","endpoint":"client","verify-peer":true}' \ +-chardev socket,id=charserial1,host=127.0.0.1,port=5555,tls-creds=objcharserial1_tls0 \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.x86_64-latest.args new file mode 100644 index 0000000000..4f20639bcf --- /dev/null +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.x86_64-latest.args @@ -0,0 +1,43 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,localport=1111 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-object '{"qom-type":"secret","id":"charserial1-secret0","data":"9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1","keyid":"masterKey0","iv":"AAECAwQFBgcICQoLDA0ODw==","format":"base64"}' \ +-object '{"qom-type":"tls-creds-x509","id":"objcharserial1_tls0","dir":"/etc/pki/libvirt-chardev","endpoint":"client","verify-peer":true,"passwordid":"charserial1-secret0"}' \ +-chardev socket,id=charserial1,host=127.0.0.1,port=5555,tls-creds=objcharserial1_tls0 \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-udp-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-udp-chardev.x86_64-latest.args new file mode 100644 index 0000000000..95e6e6ed90 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-udp-chardev.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev udp,id=charserial0,host=127.0.0.1,port=9998,localaddr=127.0.0.1,localport=9999 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-chardev udp,id=charserial1,host=,port=9999,localaddr=,localport=0 \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/serial-unix-missing-source.x86_64-latest.err b/tests/qemuxml2argvdata/serial-unix-missing-source.x86_64-latest.err new file mode 100644 index 0000000000..86be3aead4 --- /dev/null +++ b/tests/qemuxml2argvdata/serial-unix-missing-source.x86_64-latest.err @@ -0,0 +1 @@ +unsupported configuration: Emulator '/usr/bin/qemu-system-aarch64' does not support arch 'aarch64' diff --git a/tests/qemuxml2argvdata/serial-vc-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-vc-chardev.x86_64-latest.args new file mode 100644 index 0000000000..d15062b94f --- /dev/null +++ b/tests/qemuxml2argvdata/serial-vc-chardev.x86_64-latest.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ +-chardev vc,id=charserial0 \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 9cece1df91..a3d0b5e614 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1685,6 +1685,18 @@ mymain(void) QEMU_CAPS_CHARDEV_FILE_APPEND); DO_TEST("serial-unix-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-file-log"); + DO_TEST_CAPS_LATEST("serial-spiceport"); + DO_TEST_CAPS_LATEST("serial-spiceport-nospice"); + + DO_TEST_CAPS_LATEST("console-compat"); + DO_TEST_CAPS_LATEST("console-compat-auto"); + + DO_TEST_CAPS_LATEST("serial-vc-chardev"); + DO_TEST_CAPS_LATEST("serial-pty-chardev"); + DO_TEST_CAPS_LATEST("serial-dev-chardev"); + DO_TEST_CAPS_LATEST("serial-dev-chardev-iobase"); + DO_TEST_CAPS_LATEST("serial-file-chardev"); DO_TEST_CAPS_LATEST("serial-unix-chardev"); DO_TEST_PARSE_ERROR_NOCAPS("serial-unix-missing-source"); DO_TEST("serial-tcp-chardev", @@ -1693,31 +1705,45 @@ mymain(void) QEMU_CAPS_DEVICE_ISA_SERIAL); DO_TEST("serial-tcp-telnet-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-unix-chardev"); + DO_TEST_CAPS_LATEST_PARSE_ERROR("serial-unix-missing-source"); + DO_TEST_CAPS_LATEST("serial-tcp-chardev"); + DO_TEST_CAPS_LATEST("serial-udp-chardev"); + DO_TEST_CAPS_LATEST("serial-tcp-telnet-chardev"); driver.config->chardevTLS = 1; DO_TEST("serial-tcp-tlsx509-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-tcp-tlsx509-chardev"); driver.config->chardevTLSx509verify = 1; DO_TEST("serial-tcp-tlsx509-chardev-verify", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-tcp-tlsx509-chardev-verify"); driver.config->chardevTLSx509verify = 0; DO_TEST("serial-tcp-tlsx509-chardev-notls", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-tcp-tlsx509-chardev-notls"); VIR_FREE(driver.config->chardevTLSx509certdir); driver.config->chardevTLSx509certdir = g_strdup("/etc/pki/libvirt-chardev"); driver.config->chardevTLSx509secretUUID = g_strdup("6fd3f62d-9fe7-4a4e-a869-7acd6376d8ea"); DO_TEST("serial-tcp-tlsx509-secret-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-tcp-tlsx509-secret-chardev"); driver.config->chardevTLS = 0; VIR_FREE(driver.config->chardevTLSx509certdir); DO_TEST("serial-many-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); DO_TEST_NOCAPS("parallel-tcp-chardev"); DO_TEST_NOCAPS("parallel-parport-chardev"); + DO_TEST_CAPS_LATEST("serial-many-chardev"); + DO_TEST_CAPS_LATEST("parallel-tcp-chardev"); + DO_TEST_CAPS_LATEST("parallel-parport-chardev"); DO_TEST_CAPS_LATEST("parallel-unix-chardev"); DO_TEST("console-compat-chardev", QEMU_CAPS_DEVICE_ISA_SERIAL); DO_TEST("pci-serial-dev-chardev", QEMU_CAPS_DEVICE_PCI_SERIAL); + DO_TEST_CAPS_LATEST("console-compat-chardev"); + DO_TEST_CAPS_LATEST("pci-serial-dev-chardev"); DO_TEST_NOCAPS("channel-guestfwd"); DO_TEST_CAPS_LATEST("channel-unix-guestfwd"); -- 2.31.1

It was impossible to use _LATEST when commit d7c814f7f75 was modernizing the cases as improper separation in the code caused that files were created in the host during the testsuite run. Now that the host manipulation when instantiating chardevs is separated we can add the missing version. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- .../name-escape.x86_64-latest.args | 51 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 2 files changed, 52 insertions(+) create mode 100644 tests/qemuxml2argvdata/name-escape.x86_64-latest.args diff --git a/tests/qemuxml2argvdata/name-escape.x86_64-latest.args b/tests/qemuxml2argvdata/name-escape.x86_64-latest.args new file mode 100644 index 0000000000..336ea5f4d4 --- /dev/null +++ b/tests/qemuxml2argvdata/name-escape.x86_64-latest.args @@ -0,0 +1,51 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-foo=1,bar=2 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-foo=1,bar=2/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-foo=1,bar=2/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-foo=1,bar=2/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=foo=1,,bar=2,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-foo=1,bar=2/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-device '{"driver":"virtio-scsi-pci","id":"scsi0","bus":"pci.0","addr":"0x3"}' \ +-device '{"driver":"usb-ccid","id":"ccid0","bus":"usb.0","port":"1"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},"auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"cache":{"direct":true,"no-flush":false},"driver":"qcow2","file":"libvirt-1-storage"}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1,"write-cache":"on"}' \ +-device '{"driver":"ccid-card-emulated","backend":"certificates","cert1":"cert1,foo","cert2":"cert2","cert3":"cert3","db":"/etc/pki/nssdb,foo","id":"smartcard0","bus":"ccid0.0"}' \ +-chardev tty,id=charserial0,path=/dev/ttyS2,,foo \ +-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0"}' \ +-add-fd set=0,fd=1750 \ +-chardev file,id=charserial1,path=/dev/fdset/0,append=on \ +-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1"}' \ +-chardev pipe,id=charchannel0,path=/tmp/guestfwd,,foo \ +-netdev user,guestfwd=tcp:10.0.2.1:4600-chardev:charchannel0,id=channel0 \ +-audiodev '{"id":"audio1","driver":"spice"}' \ +-vnc vnc=unix:/tmp/lib/domain--1-foo=1,,bar=2/vnc.sock,audiodev=audio1 \ +-spice unix,addr=/tmp/lib/domain--1-foo=1,,bar=2/spice.sock,gl=on,rendernode=/dev/dri/foo,,bar,seamless-migration=on \ +-device '{"driver":"cirrus-vga","id":"video0","bus":"pci.0","addr":"0x2"}' \ +-blockdev '{"driver":"iscsi","portal":"example.foo.org:3260","target":"iqn.1992-01.com.example:my,storage","lun":1,"transport":"tcp","node-name":"libvirt-2-backend","read-only":false}' \ +-device '{"driver":"scsi-generic","drive":"libvirt-2-backend","id":"hostdev0","bus":"scsi0.0","channel":0,"scsi-id":0,"lun":4}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x4"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index a3d0b5e614..fa451b6b54 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3280,6 +3280,7 @@ mymain(void) ARG_END); DO_TEST_CAPS_VER("name-escape", "2.11.0"); + DO_TEST_CAPS_LATEST("name-escape"); DO_TEST_NOCAPS("master-key"); DO_TEST("usb-long-port-path", -- 2.31.1

Unify the cases for SCPL/SCLPLM/VIRTIO consoles as the code is identical. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5c2b8d65fd..fb4535e889 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9513,35 +9513,7 @@ qemuBuildConsoleCommandLine(virCommand *cmd, switch (console->targetType) { case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - console->source, - console->info.alias, - qemuCaps))) - return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); - VIR_FREE(devstr); - - if (qemuBuildChrDeviceCommandLine(cmd, def, console, qemuCaps) < 0) - return -1; - break; - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - console->source, - console->info.alias, - qemuCaps))) - return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); - VIR_FREE(devstr); - - if (qemuBuildChrDeviceCommandLine(cmd, def, console, qemuCaps) < 0) - return -1; - break; - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: if (!(devstr = qemuBuildChrChardevStr(cmd, cfg, -- 2.31.1

On a Thursday in 2021, Peter Krempa wrote:
Unify the cases for SCPL/SCLPLM/VIRTIO consoles as the code is
*SCLP
identical.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 28 ---------------------------- 1 file changed, 28 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

'qemuBuildChrChardevStr' used a hybrid approach where some arguments were directly added to '@cmd' while the commandline itself was returned as a string. This patch renames qemuBuildChrChardevStr to qemuBuildChardevCommand and adds the argument directly to @cmd inside the function. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 186 +++++++++++++++------------------------- 1 file changed, 71 insertions(+), 115 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fb4535e889..f6aab6a52c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5036,14 +5036,12 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) } -/* This function outputs a -chardev command line option which describes only the - * host side of the character device */ -static char * -qemuBuildChrChardevStr(virCommand *cmd, - virQEMUDriverConfig *cfg, - const virDomainChrSourceDef *dev, - const char *alias, - virQEMUCaps *qemuCaps) +static int +qemuBuildChardevCommand(virCommand *cmd, + virQEMUDriverConfig *cfg, + const virDomainChrSourceDef *dev, + const char *alias, + virQEMUCaps *qemuCaps) { qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; @@ -5051,7 +5049,7 @@ qemuBuildChrChardevStr(virCommand *cmd, g_autofree char *charAlias = NULL; if (!(charAlias = qemuAliasChardevFromDevAlias(alias))) - return NULL; + return -1; switch ((virDomainChrType) dev->type) { case VIR_DOMAIN_CHR_TYPE_NULL: @@ -5158,20 +5156,20 @@ qemuBuildChrChardevStr(virCommand *cmd, if (qemuBuildObjectSecretCommandLine(cmd, chrSourcePriv->secinfo, qemuCaps) < 0) - return NULL; + return -1; tlsCertEncSecAlias = chrSourcePriv->secinfo->alias; } if (!(objalias = qemuAliasTLSObjFromSrcAlias(charAlias))) - return NULL; + return -1; if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdir, dev->data.tcp.listen, cfg->chardevTLSx509verify, tlsCertEncSecAlias, objalias, qemuCaps) < 0) { - return NULL; + return -1; } virBufferAsprintf(&buf, ",tls-creds=%s", objalias); @@ -5214,7 +5212,7 @@ qemuBuildChrChardevStr(virCommand *cmd, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported chardev '%s'"), virDomainChrTypeToString(dev->type)); - return NULL; + return -1; } if (dev->logfile) { @@ -5241,7 +5239,9 @@ qemuBuildChrChardevStr(virCommand *cmd, } } - return virBufferContentAndReset(&buf); + virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), NULL); + + return 0; } @@ -5513,19 +5513,15 @@ qemuBuildMonitorCommandLine(virCommand *cmd, virQEMUDriverConfig *cfg, qemuDomainObjPrivate *priv) { - g_autofree char *chrdev = NULL; - if (!priv->monConfig) return 0; - if (!(chrdev = qemuBuildChrChardevStr(cmd, - cfg, - priv->monConfig, - "monitor", - priv->qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + priv->monConfig, + "monitor", + priv->qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, chrdev); virCommandAddArg(cmd, "-mon"); virCommandAddArg(cmd, "chardev=charmonitor,id=monitor,mode=control"); @@ -5641,14 +5637,11 @@ qemuBuildSclpDevProps(virDomainChrDef *dev) static int -qemuBuildRNGBackendChrdevStr(virCommand *cmd, - virQEMUDriverConfig *cfg, - virDomainRNGDef *rng, - virQEMUCaps *qemuCaps, - char **chr) +qemuBuildRNGBackendChrdev(virCommand *cmd, + virQEMUDriverConfig *cfg, + virDomainRNGDef *rng, + virQEMUCaps *qemuCaps) { - *chr = NULL; - switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: case VIR_DOMAIN_RNG_BACKEND_BUILTIN: @@ -5657,11 +5650,11 @@ qemuBuildRNGBackendChrdevStr(virCommand *cmd, return 0; case VIR_DOMAIN_RNG_BACKEND_EGD: - if (!(*chr = qemuBuildChrChardevStr(cmd, - cfg, - rng->source.chardev, - rng->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + rng->source.chardev, + rng->info.alias, + qemuCaps) < 0) return -1; break; } @@ -5759,7 +5752,6 @@ qemuBuildRNGCommandLine(virCommand *cmd, for (i = 0; i < def->nrngs; i++) { g_autoptr(virJSONValue) props = NULL; virDomainRNGDef *rng = def->rngs[i]; - g_autofree char *chardev = NULL; g_autoptr(virJSONValue) devprops = NULL; if (!rng->info.alias) { @@ -5769,12 +5761,9 @@ qemuBuildRNGCommandLine(virCommand *cmd, } /* possibly add character device for backend */ - if (qemuBuildRNGBackendChrdevStr(cmd, cfg, rng, qemuCaps, &chardev) < 0) + if (qemuBuildRNGBackendChrdev(cmd, cfg, rng, qemuCaps) < 0) return -1; - if (chardev) - virCommandAddArgList(cmd, "-chardev", chardev, NULL); - if (qemuBuildRNGBackendProps(rng, &props) < 0) return -1; @@ -8597,18 +8586,17 @@ static int qemuInterfaceVhostuserConnect(virQEMUDriver *driver, virCommand *cmd, virDomainNetDef *net, - virQEMUCaps *qemuCaps, - char **chardev) + virQEMUCaps *qemuCaps) { g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); switch ((virDomainChrType)net->data.vhostuser->type) { case VIR_DOMAIN_CHR_TYPE_UNIX: - if (!(*chardev = qemuBuildChrChardevStr(cmd, - cfg, - net->data.vhostuser, - net->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + net->data.vhostuser, + net->info.alias, + qemuCaps) < 0) return -1; break; @@ -8649,7 +8637,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, int ret = -1; g_autoptr(virJSONValue) nicprops = NULL; g_autofree char *nic = NULL; - g_autofree char *chardev = NULL; int *tapfd = NULL; size_t tapfdSize = 0; int *vhostfd = NULL; @@ -8727,7 +8714,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, case VIR_DOMAIN_NET_TYPE_VHOSTUSER: requireNicdev = true; - if (qemuInterfaceVhostuserConnect(driver, cmd, net, qemuCaps, &chardev) < 0) + if (qemuInterfaceVhostuserConnect(driver, cmd, net, qemuCaps) < 0) goto cleanup; if (virNetDevOpenvswitchGetVhostuserIfname(net->data.vhostuser->data.nix.path, @@ -8888,9 +8875,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, vdpafd = -1; } - if (chardev) - virCommandAddArgList(cmd, "-chardev", chardev, NULL); - if (!(hostnetprops = qemuBuildHostNetProps(net, tapfdName, tapfdSize, vhostfdName, vhostfdSize, @@ -9045,18 +9029,14 @@ qemuBuildSmartcardCommandLine(virCommand *cmd, break; case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: { - g_autofree char *chardevstr = NULL; g_autofree char *chardevalias = g_strdup_printf("char%s", smartcard->info.alias); - if (!(chardevstr = qemuBuildChrChardevStr(cmd, - cfg, - smartcard->data.passthru, - smartcard->info.alias, - qemuCaps))) { + if (qemuBuildChardevCommand(cmd, + cfg, + smartcard->data.passthru, + smartcard->info.alias, + qemuCaps) < 0) return -1; - } - - virCommandAddArgList(cmd, "-chardev", chardevstr, NULL); if (virJSONValueObjectAdd(&props, "s:driver", "ccid-card-passthru", @@ -9205,7 +9185,6 @@ qemuBuildShmemCommandLine(virCommand *cmd, { g_autoptr(virJSONValue) memProps = NULL; g_autoptr(virJSONValue) devProps = NULL; - g_autofree char *chardev = NULL; if (shmem->size) { /* @@ -9264,15 +9243,12 @@ qemuBuildShmemCommandLine(virCommand *cmd, return -1; if (shmem->server.enabled) { - chardev = qemuBuildChrChardevStr(cmd, - cfg, - shmem->server.chr, - shmem->info.alias, - qemuCaps); - if (!chardev) + if (qemuBuildChardevCommand(cmd, + cfg, + shmem->server.chr, + shmem->info.alias, + qemuCaps) < 0) return -1; - - virCommandAddArgList(cmd, "-chardev", chardev, NULL); } return 0; @@ -9381,19 +9357,16 @@ qemuBuildSerialCommandLine(virCommand *cmd, for (i = 0; i < def->nserials; i++) { virDomainChrDef *serial = def->serials[i]; - g_autofree char *devstr = NULL; if (serial->source->type == VIR_DOMAIN_CHR_TYPE_SPICEPORT && !havespice) continue; - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - serial->source, - serial->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + serial->source, + serial->info.alias, + qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); /* If the device is not a platform device, build the devstr */ if (!qemuChrIsPlatformDevice(def, serial)) { @@ -9430,16 +9403,13 @@ qemuBuildParallelsCommandLine(virCommand *cmd, for (i = 0; i < def->nparallels; i++) { virDomainChrDef *parallel = def->parallels[i]; - g_autofree char *devstr = NULL; - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - parallel->source, - parallel->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + parallel->source, + parallel->info.alias, + qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); if (qemuBuildChrDeviceCommandLine(cmd, def, parallel, qemuCaps) < 0) @@ -9460,19 +9430,15 @@ qemuBuildChannelsCommandLine(virCommand *cmd, for (i = 0; i < def->nchannels; i++) { virDomainChrDef *channel = def->channels[i]; - g_autofree char *chardevstr = NULL; g_autoptr(virJSONValue) netdevprops = NULL; - if (!(chardevstr = qemuBuildChrChardevStr(cmd, - cfg, - channel->source, - channel->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + channel->source, + channel->info.alias, + qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, chardevstr); - switch ((virDomainChrChannelTargetType) channel->targetType) { case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD: if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(channel))) @@ -9509,21 +9475,17 @@ qemuBuildConsoleCommandLine(virCommand *cmd, /* Explicit console devices */ for (i = 0; i < def->nconsoles; i++) { virDomainChrDef *console = def->consoles[i]; - char *devstr; switch (console->targetType) { case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - console->source, - console->info.alias, - qemuCaps))) + if (qemuBuildChardevCommand(cmd, + cfg, + console->source, + console->info.alias, + qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); - VIR_FREE(devstr); if (qemuBuildChrDeviceCommandLine(cmd, def, console, qemuCaps) < 0) return -1; @@ -9610,19 +9572,13 @@ qemuBuildRedirdevCommandLine(virCommand *cmd, for (i = 0; i < def->nredirdevs; i++) { virDomainRedirdevDef *redirdev = def->redirdevs[i]; g_autoptr(virJSONValue) devprops = NULL; - char *devstr; - if (!(devstr = qemuBuildChrChardevStr(cmd, - cfg, - redirdev->source, - redirdev->info.alias, - qemuCaps))) { + if (qemuBuildChardevCommand(cmd, + cfg, + redirdev->source, + redirdev->info.alias, + qemuCaps) < 0) return -1; - } - - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, devstr); - VIR_FREE(devstr); if (!(devprops = qemuBuildRedirdevDevProps(def, redirdev))) return -1; -- 2.31.1

Make it accessible sooner inside qemu_command.c Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 442 ++++++++++++++++++++-------------------- 1 file changed, 221 insertions(+), 221 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f6aab6a52c..874f875c5a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1306,6 +1306,227 @@ qemuBuildTLSx509CommandLine(virCommand *cmd, } +static void +qemuBuildChrChardevReconnectStr(virBuffer *buf, + const virDomainChrSourceReconnectDef *def) +{ + if (def->enabled == VIR_TRISTATE_BOOL_YES) { + virBufferAsprintf(buf, ",reconnect=%u", def->timeout); + } else if (def->enabled == VIR_TRISTATE_BOOL_NO) { + virBufferAddLit(buf, ",reconnect=0"); + } +} + + +static int +qemuBuildChardevCommand(virCommand *cmd, + virQEMUDriverConfig *cfg, + const virDomainChrSourceDef *dev, + const char *alias, + virQEMUCaps *qemuCaps) +{ + qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + bool telnet; + g_autofree char *charAlias = NULL; + + if (!(charAlias = qemuAliasChardevFromDevAlias(alias))) + return -1; + + switch ((virDomainChrType) dev->type) { + case VIR_DOMAIN_CHR_TYPE_NULL: + virBufferAsprintf(&buf, "null,id=%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_VC: + virBufferAsprintf(&buf, "vc,id=%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_PTY: + virBufferAsprintf(&buf, "pty,id=%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_DEV: + virBufferAsprintf(&buf, "%s,id=%s,path=", + STRPREFIX(alias, "parallel") ? "parport" : "tty", + charAlias); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + virBufferAsprintf(&buf, "file,id=%s", charAlias); + + if (chrSourcePriv->fd != -1) { + g_autofree char *fdset = NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->fd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->fd, idx); + chrSourcePriv->fd = -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",path=/dev/fdset/%zu,append=on", idx); + } else { + virBufferAddLit(&buf, ",path="); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + if (dev->data.file.append != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",append=%s", + virTristateSwitchTypeToString(dev->data.file.append)); + } + } + break; + + case VIR_DOMAIN_CHR_TYPE_PIPE: + virBufferAsprintf(&buf, "pipe,id=%s,path=", charAlias); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + break; + + case VIR_DOMAIN_CHR_TYPE_STDIO: + virBufferAsprintf(&buf, "stdio,id=%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_UDP: { + const char *connectHost = dev->data.udp.connectHost; + const char *bindHost = dev->data.udp.bindHost; + const char *bindService = dev->data.udp.bindService; + + if (connectHost == NULL) + connectHost = ""; + if (bindHost == NULL) + bindHost = ""; + if (bindService == NULL) + bindService = "0"; + + virBufferAsprintf(&buf, + "udp,id=%s,host=%s,port=%s,localaddr=%s," + "localport=%s", + charAlias, + connectHost, + dev->data.udp.connectService, + bindHost, bindService); + break; + } + case VIR_DOMAIN_CHR_TYPE_TCP: + telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET; + virBufferAsprintf(&buf, + "socket,id=%s,host=%s,port=%s%s", + charAlias, + dev->data.tcp.host, + dev->data.tcp.service, + telnet ? ",telnet=on" : ""); + + if (dev->data.tcp.listen) { + virBufferAddLit(&buf, ",server=on"); + if (!chrSourcePriv->wait) + virBufferAddLit(&buf, ",wait=off"); + } + + qemuBuildChrChardevReconnectStr(&buf, &dev->data.tcp.reconnect); + + if (dev->data.tcp.haveTLS == VIR_TRISTATE_BOOL_YES) { + g_autofree char *objalias = NULL; + const char *tlsCertEncSecAlias = NULL; + + /* Add the secret object first if necessary. The + * secinfo is added only to a TCP serial device during + * qemuDomainSecretChardevPrepare. Subsequently called + * functions can just check the config fields */ + if (chrSourcePriv && chrSourcePriv->secinfo) { + if (qemuBuildObjectSecretCommandLine(cmd, + chrSourcePriv->secinfo, + qemuCaps) < 0) + return -1; + + tlsCertEncSecAlias = chrSourcePriv->secinfo->alias; + } + + if (!(objalias = qemuAliasTLSObjFromSrcAlias(charAlias))) + return -1; + + if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdir, + dev->data.tcp.listen, + cfg->chardevTLSx509verify, + tlsCertEncSecAlias, + objalias, qemuCaps) < 0) { + return -1; + } + + virBufferAsprintf(&buf, ",tls-creds=%s", objalias); + } + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + virBufferAsprintf(&buf, "socket,id=%s", charAlias); + if (chrSourcePriv->fd != -1) { + virBufferAsprintf(&buf, ",fd=%d", chrSourcePriv->fd); + + virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + chrSourcePriv->fd = -1; + } else { + virBufferAddLit(&buf, ",path="); + virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); + } + if (dev->data.nix.listen) { + virBufferAddLit(&buf, ",server=on"); + if (!chrSourcePriv->wait) + virBufferAddLit(&buf, ",wait=off"); + } + + qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + virBufferAsprintf(&buf, "spicevmc,id=%s,name=%s", charAlias, + virDomainChrSpicevmcTypeToString(dev->data.spicevmc)); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + virBufferAsprintf(&buf, "spiceport,id=%s,name=%s", charAlias, + dev->data.spiceport.channel); + break; + + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported chardev '%s'"), + virDomainChrTypeToString(dev->type)); + return -1; + } + + if (dev->logfile) { + if (chrSourcePriv->logfd != -1) { + g_autofree char *fdset = NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->logfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->logfd, idx); + chrSourcePriv->logfd = -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",logfile=/dev/fdset/%zu,logappend=on", idx); + } else { + virBufferAddLit(&buf, ",logfile="); + virQEMUBuildBufferEscapeComma(&buf, dev->logfile); + if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",logappend=%s", + virTristateSwitchTypeToString(dev->logappend)); + } + } + } + + virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), NULL); + + return 0; +} + + static char * qemuBuildNetworkDriveURI(virStorageSource *src) { @@ -4967,18 +5188,6 @@ qemuBuildSCSIHostdevDevProps(const virDomainDef *def, return g_steal_pointer(&props); } -static void -qemuBuildChrChardevReconnectStr(virBuffer *buf, - const virDomainChrSourceReconnectDef *def) -{ - if (def->enabled == VIR_TRISTATE_BOOL_YES) { - virBufferAsprintf(buf, ",reconnect=%u", def->timeout); - } else if (def->enabled == VIR_TRISTATE_BOOL_NO) { - virBufferAddLit(buf, ",reconnect=0"); - } -} - - int qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) { @@ -5036,215 +5245,6 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) } -static int -qemuBuildChardevCommand(virCommand *cmd, - virQEMUDriverConfig *cfg, - const virDomainChrSourceDef *dev, - const char *alias, - virQEMUCaps *qemuCaps) -{ - qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - bool telnet; - g_autofree char *charAlias = NULL; - - if (!(charAlias = qemuAliasChardevFromDevAlias(alias))) - return -1; - - switch ((virDomainChrType) dev->type) { - case VIR_DOMAIN_CHR_TYPE_NULL: - virBufferAsprintf(&buf, "null,id=%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_VC: - virBufferAsprintf(&buf, "vc,id=%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_PTY: - virBufferAsprintf(&buf, "pty,id=%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_DEV: - virBufferAsprintf(&buf, "%s,id=%s,path=", - STRPREFIX(alias, "parallel") ? "parport" : "tty", - charAlias); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - break; - - case VIR_DOMAIN_CHR_TYPE_FILE: - virBufferAsprintf(&buf, "file,id=%s", charAlias); - - if (chrSourcePriv->fd != -1) { - g_autofree char *fdset = NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->fd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset = qemuBuildFDSet(chrSourcePriv->fd, idx); - chrSourcePriv->fd = -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - virBufferAsprintf(&buf, ",path=/dev/fdset/%zu,append=on", idx); - } else { - virBufferAddLit(&buf, ",path="); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - if (dev->data.file.append != VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",append=%s", - virTristateSwitchTypeToString(dev->data.file.append)); - } - } - break; - - case VIR_DOMAIN_CHR_TYPE_PIPE: - virBufferAsprintf(&buf, "pipe,id=%s,path=", charAlias); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - break; - - case VIR_DOMAIN_CHR_TYPE_STDIO: - virBufferAsprintf(&buf, "stdio,id=%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_UDP: { - const char *connectHost = dev->data.udp.connectHost; - const char *bindHost = dev->data.udp.bindHost; - const char *bindService = dev->data.udp.bindService; - - if (connectHost == NULL) - connectHost = ""; - if (bindHost == NULL) - bindHost = ""; - if (bindService == NULL) - bindService = "0"; - - virBufferAsprintf(&buf, - "udp,id=%s,host=%s,port=%s,localaddr=%s," - "localport=%s", - charAlias, - connectHost, - dev->data.udp.connectService, - bindHost, bindService); - break; - } - case VIR_DOMAIN_CHR_TYPE_TCP: - telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET; - virBufferAsprintf(&buf, - "socket,id=%s,host=%s,port=%s%s", - charAlias, - dev->data.tcp.host, - dev->data.tcp.service, - telnet ? ",telnet=on" : ""); - - if (dev->data.tcp.listen) { - virBufferAddLit(&buf, ",server=on"); - if (!chrSourcePriv->wait) - virBufferAddLit(&buf, ",wait=off"); - } - - qemuBuildChrChardevReconnectStr(&buf, &dev->data.tcp.reconnect); - - if (dev->data.tcp.haveTLS == VIR_TRISTATE_BOOL_YES) { - g_autofree char *objalias = NULL; - const char *tlsCertEncSecAlias = NULL; - - /* Add the secret object first if necessary. The - * secinfo is added only to a TCP serial device during - * qemuDomainSecretChardevPrepare. Subsequently called - * functions can just check the config fields */ - if (chrSourcePriv && chrSourcePriv->secinfo) { - if (qemuBuildObjectSecretCommandLine(cmd, - chrSourcePriv->secinfo, - qemuCaps) < 0) - return -1; - - tlsCertEncSecAlias = chrSourcePriv->secinfo->alias; - } - - if (!(objalias = qemuAliasTLSObjFromSrcAlias(charAlias))) - return -1; - - if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdir, - dev->data.tcp.listen, - cfg->chardevTLSx509verify, - tlsCertEncSecAlias, - objalias, qemuCaps) < 0) { - return -1; - } - - virBufferAsprintf(&buf, ",tls-creds=%s", objalias); - } - break; - - case VIR_DOMAIN_CHR_TYPE_UNIX: - virBufferAsprintf(&buf, "socket,id=%s", charAlias); - if (chrSourcePriv->fd != -1) { - virBufferAsprintf(&buf, ",fd=%d", chrSourcePriv->fd); - - virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); - chrSourcePriv->fd = -1; - } else { - virBufferAddLit(&buf, ",path="); - virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); - } - if (dev->data.nix.listen) { - virBufferAddLit(&buf, ",server=on"); - if (!chrSourcePriv->wait) - virBufferAddLit(&buf, ",wait=off"); - } - - qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); - break; - - case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - virBufferAsprintf(&buf, "spicevmc,id=%s,name=%s", charAlias, - virDomainChrSpicevmcTypeToString(dev->data.spicevmc)); - break; - - case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - virBufferAsprintf(&buf, "spiceport,id=%s,name=%s", charAlias, - dev->data.spiceport.channel); - break; - - case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported chardev '%s'"), - virDomainChrTypeToString(dev->type)); - return -1; - } - - if (dev->logfile) { - if (chrSourcePriv->logfd != -1) { - g_autofree char *fdset = NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->logfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset = qemuBuildFDSet(chrSourcePriv->logfd, idx); - chrSourcePriv->logfd = -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - virBufferAsprintf(&buf, ",logfile=/dev/fdset/%zu,logappend=on", idx); - } else { - virBufferAddLit(&buf, ",logfile="); - virQEMUBuildBufferEscapeComma(&buf, dev->logfile); - if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",logappend=%s", - virTristateSwitchTypeToString(dev->logappend)); - } - } - } - - virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), NULL); - - return 0; -} - - static const char * qemuBuildHostdevMdevModelTypeString(virDomainHostdevSubsysMediatedDev *mdev) { -- 2.31.1

Make the callers construct the alias for the chardev so that the function can be used also for code paths which use a different convention. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 42 +++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 874f875c5a..26cb25a70c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1322,16 +1322,12 @@ static int qemuBuildChardevCommand(virCommand *cmd, virQEMUDriverConfig *cfg, const virDomainChrSourceDef *dev, - const char *alias, + const char *charAlias, virQEMUCaps *qemuCaps) { qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; bool telnet; - g_autofree char *charAlias = NULL; - - if (!(charAlias = qemuAliasChardevFromDevAlias(alias))) - return -1; switch ((virDomainChrType) dev->type) { case VIR_DOMAIN_CHR_TYPE_NULL: @@ -1348,7 +1344,7 @@ qemuBuildChardevCommand(virCommand *cmd, case VIR_DOMAIN_CHR_TYPE_DEV: virBufferAsprintf(&buf, "%s,id=%s,path=", - STRPREFIX(alias, "parallel") ? "parport" : "tty", + STRPREFIX(charAlias, "charparallel") ? "parport" : "tty", charAlias); virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); break; @@ -5519,7 +5515,7 @@ qemuBuildMonitorCommandLine(virCommand *cmd, if (qemuBuildChardevCommand(cmd, cfg, priv->monConfig, - "monitor", + "charmonitor", priv->qemuCaps) < 0) return -1; @@ -5642,6 +5638,8 @@ qemuBuildRNGBackendChrdev(virCommand *cmd, virDomainRNGDef *rng, virQEMUCaps *qemuCaps) { + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(rng->info.alias); + switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: case VIR_DOMAIN_RNG_BACKEND_BUILTIN: @@ -5653,7 +5651,7 @@ qemuBuildRNGBackendChrdev(virCommand *cmd, if (qemuBuildChardevCommand(cmd, cfg, rng->source.chardev, - rng->info.alias, + charAlias, qemuCaps) < 0) return -1; break; @@ -8589,13 +8587,14 @@ qemuInterfaceVhostuserConnect(virQEMUDriver *driver, virQEMUCaps *qemuCaps) { g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(net->info.alias); switch ((virDomainChrType)net->data.vhostuser->type) { case VIR_DOMAIN_CHR_TYPE_UNIX: if (qemuBuildChardevCommand(cmd, cfg, net->data.vhostuser, - net->info.alias, + charAlias, qemuCaps) < 0) return -1; break; @@ -9029,18 +9028,18 @@ qemuBuildSmartcardCommandLine(virCommand *cmd, break; case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: { - g_autofree char *chardevalias = g_strdup_printf("char%s", smartcard->info.alias); + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(smartcard->info.alias); if (qemuBuildChardevCommand(cmd, cfg, smartcard->data.passthru, - smartcard->info.alias, + charAlias, qemuCaps) < 0) return -1; if (virJSONValueObjectAdd(&props, "s:driver", "ccid-card-passthru", - "s:chardev", chardevalias, + "s:chardev", charAlias, NULL) < 0) return -1; } @@ -9243,10 +9242,12 @@ qemuBuildShmemCommandLine(virCommand *cmd, return -1; if (shmem->server.enabled) { + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(shmem->info.alias); + if (qemuBuildChardevCommand(cmd, cfg, shmem->server.chr, - shmem->info.alias, + charAlias, qemuCaps) < 0) return -1; } @@ -9357,6 +9358,7 @@ qemuBuildSerialCommandLine(virCommand *cmd, for (i = 0; i < def->nserials; i++) { virDomainChrDef *serial = def->serials[i]; + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(serial->info.alias); if (serial->source->type == VIR_DOMAIN_CHR_TYPE_SPICEPORT && !havespice) continue; @@ -9364,7 +9366,7 @@ qemuBuildSerialCommandLine(virCommand *cmd, if (qemuBuildChardevCommand(cmd, cfg, serial->source, - serial->info.alias, + charAlias, qemuCaps) < 0) return -1; @@ -9403,11 +9405,12 @@ qemuBuildParallelsCommandLine(virCommand *cmd, for (i = 0; i < def->nparallels; i++) { virDomainChrDef *parallel = def->parallels[i]; + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(parallel->info.alias); if (qemuBuildChardevCommand(cmd, cfg, parallel->source, - parallel->info.alias, + charAlias, qemuCaps) < 0) return -1; @@ -9431,11 +9434,12 @@ qemuBuildChannelsCommandLine(virCommand *cmd, for (i = 0; i < def->nchannels; i++) { virDomainChrDef *channel = def->channels[i]; g_autoptr(virJSONValue) netdevprops = NULL; + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(channel->info.alias); if (qemuBuildChardevCommand(cmd, cfg, channel->source, - channel->info.alias, + charAlias, qemuCaps) < 0) return -1; @@ -9475,6 +9479,7 @@ qemuBuildConsoleCommandLine(virCommand *cmd, /* Explicit console devices */ for (i = 0; i < def->nconsoles; i++) { virDomainChrDef *console = def->consoles[i]; + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(console->info.alias); switch (console->targetType) { case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: @@ -9483,7 +9488,7 @@ qemuBuildConsoleCommandLine(virCommand *cmd, if (qemuBuildChardevCommand(cmd, cfg, console->source, - console->info.alias, + charAlias, qemuCaps) < 0) return -1; @@ -9572,11 +9577,12 @@ qemuBuildRedirdevCommandLine(virCommand *cmd, for (i = 0; i < def->nredirdevs; i++) { virDomainRedirdevDef *redirdev = def->redirdevs[i]; g_autoptr(virJSONValue) devprops = NULL; + g_autofree char *charAlias = qemuAliasChardevFromDevAlias(redirdev->info.alias); if (qemuBuildChardevCommand(cmd, cfg, redirdev->source, - redirdev->info.alias, + charAlias, qemuCaps) < 0) return -1; -- 2.31.1

Completely seprate the creation of the commandline string from the setup of other objects instantiated on the commandline. 'qemuBuildChardevCommand' will aggregate the setup of individual parameters such as -add-fd and setup of TLS and the -chardev parameter itself while the code formatting the commandline will be moved into qemuBuildChardevStr. 'fdset' names are then stored in qemuDomainChrSourcePrivate. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 204 ++++++++++++++++++++++++++-------------- src/qemu/qemu_domain.c | 6 ++ src/qemu/qemu_domain.h | 5 + 3 files changed, 145 insertions(+), 70 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 26cb25a70c..910508e725 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1318,16 +1318,15 @@ qemuBuildChrChardevReconnectStr(virBuffer *buf, } -static int -qemuBuildChardevCommand(virCommand *cmd, - virQEMUDriverConfig *cfg, - const virDomainChrSourceDef *dev, - const char *charAlias, - virQEMUCaps *qemuCaps) +static char * +qemuBuildChardevStr(const virDomainChrSourceDef *dev, + const char *charAlias) { + qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - bool telnet; + const char *path; + virTristateSwitch append; switch ((virDomainChrType) dev->type) { case VIR_DOMAIN_CHR_TYPE_NULL: @@ -1351,27 +1350,19 @@ qemuBuildChardevCommand(virCommand *cmd, case VIR_DOMAIN_CHR_TYPE_FILE: virBufferAsprintf(&buf, "file,id=%s", charAlias); + path = dev->data.file.path; + append = dev->data.file.append; - if (chrSourcePriv->fd != -1) { - g_autofree char *fdset = NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->fd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset = qemuBuildFDSet(chrSourcePriv->fd, idx); - chrSourcePriv->fd = -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); + if (chrSourcePriv->fdset) { + path = chrSourcePriv->fdset; + append = VIR_TRISTATE_SWITCH_ON; + } - virBufferAsprintf(&buf, ",path=/dev/fdset/%zu,append=on", idx); - } else { - virBufferAddLit(&buf, ",path="); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - if (dev->data.file.append != VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",append=%s", - virTristateSwitchTypeToString(dev->data.file.append)); - } + virBufferAddLit(&buf, ",path="); + virQEMUBuildBufferEscapeComma(&buf, path); + if (append != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",append=%s", + virTristateSwitchTypeToString(append)); } break; @@ -1405,14 +1396,16 @@ qemuBuildChardevCommand(virCommand *cmd, bindHost, bindService); break; } + case VIR_DOMAIN_CHR_TYPE_TCP: - telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET; virBufferAsprintf(&buf, - "socket,id=%s,host=%s,port=%s%s", + "socket,id=%s,host=%s,port=%s", charAlias, dev->data.tcp.host, - dev->data.tcp.service, - telnet ? ",telnet=on" : ""); + dev->data.tcp.service); + + if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) + virBufferAddLit(&buf, ",telnet=on"); if (dev->data.tcp.listen) { virBufferAddLit(&buf, ",server=on"); @@ -1422,6 +1415,77 @@ qemuBuildChardevCommand(virCommand *cmd, qemuBuildChrChardevReconnectStr(&buf, &dev->data.tcp.reconnect); + if (chrSourcePriv->tlsCredsAlias) + virBufferAsprintf(&buf, ",tls-creds=%s", chrSourcePriv->tlsCredsAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + virBufferAsprintf(&buf, "socket,id=%s", charAlias); + if (chrSourcePriv->passedFD != -1) { + virBufferAsprintf(&buf, ",fd=%d", chrSourcePriv->passedFD); + } else { + virBufferAddLit(&buf, ",path="); + virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); + } + + if (dev->data.nix.listen) { + virBufferAddLit(&buf, ",server=on"); + if (!chrSourcePriv->wait) + virBufferAddLit(&buf, ",wait=off"); + } + + qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + virBufferAsprintf(&buf, "spicevmc,id=%s,name=%s", charAlias, + virDomainChrSpicevmcTypeToString(dev->data.spicevmc)); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + virBufferAsprintf(&buf, "spiceport,id=%s,name=%s", charAlias, + dev->data.spiceport.channel); + break; + + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + break; + } + + if (dev->logfile) { + path = dev->logfile; + append = dev->logappend; + + if (chrSourcePriv->logFdset) { + path = chrSourcePriv->logFdset; + append = VIR_TRISTATE_SWITCH_ON; + } + + virBufferAddLit(&buf, ",logfile="); + virQEMUBuildBufferEscapeComma(&buf, path); + if (append != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",logappend=%s", + virTristateSwitchTypeToString(append)); + } + } + + return virBufferContentAndReset(&buf); +} + + +static int +qemuBuildChardevCommand(virCommand *cmd, + virQEMUDriverConfig *cfg, + const virDomainChrSourceDef *dev, + const char *charAlias, + virQEMUCaps *qemuCaps) +{ + qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev); + g_autofree char *charstr = NULL; + + switch ((virDomainChrType) dev->type) { + case VIR_DOMAIN_CHR_TYPE_TCP: if (dev->data.tcp.haveTLS == VIR_TRISTATE_BOOL_YES) { g_autofree char *objalias = NULL; const char *tlsCertEncSecAlias = NULL; @@ -1450,38 +1514,44 @@ qemuBuildChardevCommand(virCommand *cmd, return -1; } - virBufferAsprintf(&buf, ",tls-creds=%s", objalias); + chrSourcePriv->tlsCredsAlias = g_steal_pointer(&objalias); } break; - case VIR_DOMAIN_CHR_TYPE_UNIX: - virBufferAsprintf(&buf, "socket,id=%s", charAlias); + case VIR_DOMAIN_CHR_TYPE_FILE: if (chrSourcePriv->fd != -1) { - virBufferAsprintf(&buf, ",fd=%d", chrSourcePriv->fd); + g_autofree char *fdset = NULL; + size_t idx; - virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + virCommandPassFDIndex(cmd, chrSourcePriv->fd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->fd, idx); chrSourcePriv->fd = -1; - } else { - virBufferAddLit(&buf, ",path="); - virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); - } - if (dev->data.nix.listen) { - virBufferAddLit(&buf, ",server=on"); - if (!chrSourcePriv->wait) - virBufferAddLit(&buf, ",wait=off"); - } - qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + chrSourcePriv->fdset = g_strdup_printf("/dev/fdset/%zu", idx); + } break; - case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - virBufferAsprintf(&buf, "spicevmc,id=%s,name=%s", charAlias, - virDomainChrSpicevmcTypeToString(dev->data.spicevmc)); + case VIR_DOMAIN_CHR_TYPE_UNIX: + if (chrSourcePriv->fd != -1) { + virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + chrSourcePriv->passedFD = chrSourcePriv->fd; + chrSourcePriv->fd = -1; + } break; + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_PTY: + case VIR_DOMAIN_CHR_TYPE_DEV: + case VIR_DOMAIN_CHR_TYPE_PIPE: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_UDP: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - virBufferAsprintf(&buf, "spiceport,id=%s,name=%s", charAlias, - dev->data.spiceport.channel); break; case VIR_DOMAIN_CHR_TYPE_NMDM: @@ -1493,31 +1563,25 @@ qemuBuildChardevCommand(virCommand *cmd, return -1; } - if (dev->logfile) { - if (chrSourcePriv->logfd != -1) { - g_autofree char *fdset = NULL; - size_t idx; + if (chrSourcePriv->logfd != -1) { + g_autofree char *fdset = NULL; + size_t idx; - virCommandPassFDIndex(cmd, chrSourcePriv->logfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset = qemuBuildFDSet(chrSourcePriv->logfd, idx); - chrSourcePriv->logfd = -1; + virCommandPassFDIndex(cmd, chrSourcePriv->logfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset = qemuBuildFDSet(chrSourcePriv->logfd, idx); + chrSourcePriv->logfd = -1; - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); - virBufferAsprintf(&buf, ",logfile=/dev/fdset/%zu,logappend=on", idx); - } else { - virBufferAddLit(&buf, ",logfile="); - virQEMUBuildBufferEscapeComma(&buf, dev->logfile); - if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",logappend=%s", - virTristateSwitchTypeToString(dev->logappend)); - } - } + chrSourcePriv->logFdset = g_strdup_printf("/dev/fdset/%zu", idx); } - virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), NULL); + if (!(charstr = qemuBuildChardevStr(dev, charAlias))) + return -1; + + virCommandAddArgList(cmd, "-chardev", charstr, NULL); return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e6d6bf10f1..a2ee160128 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -853,6 +853,8 @@ qemuDomainChrSourcePrivateNew(void) priv->fd = -1; priv->logfd = -1; + priv->passedFD = -1; + return (virObject *) priv; } @@ -865,6 +867,10 @@ qemuDomainChrSourcePrivateDispose(void *obj) VIR_FORCE_CLOSE(priv->fd); VIR_FORCE_CLOSE(priv->logfd); + g_free(priv->fdset); + g_free(priv->logFdset); + g_free(priv->tlsCredsAlias); + g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 2d93cf2253..d07def3d85 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -345,6 +345,11 @@ struct _qemuDomainChrSourcePrivate { int fd; /* file descriptor of the chardev source */ int logfd; /* file descriptor of the logging source */ bool wait; /* wait for incomming connections on chardev */ + + char *fdset; /* fdset path corresponding to the passed filedescriptor */ + char *logFdset; /* fdset path corresponding to the passed filedescriptor for logfile */ + int passedFD; /* filedescriptor number when fdset passing it directly */ + char *tlsCredsAlias; /* alias of the x509 tls credentials object */ }; -- 2.31.1

When setting up TLS options from config in qemuDomainPrepareChardevSourceOne we can also extract the x509 certificate path and default tlsVerify setting so that 'qemuBuildChardevCommand' doesn't need to access the config object any more. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 6 +++--- src/qemu/qemu_domain.c | 7 +++++++ src/qemu/qemu_domain.h | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 910508e725..583e311008 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1476,7 +1476,7 @@ qemuBuildChardevStr(const virDomainChrSourceDef *dev, static int qemuBuildChardevCommand(virCommand *cmd, - virQEMUDriverConfig *cfg, + virQEMUDriverConfig *cfg G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *charAlias, virQEMUCaps *qemuCaps) @@ -1506,9 +1506,9 @@ qemuBuildChardevCommand(virCommand *cmd, if (!(objalias = qemuAliasTLSObjFromSrcAlias(charAlias))) return -1; - if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdir, + if (qemuBuildTLSx509CommandLine(cmd, chrSourcePriv->tlsCertPath, dev->data.tcp.listen, - cfg->chardevTLSx509verify, + chrSourcePriv->tlsVerify, tlsCertEncSecAlias, objalias, qemuCaps) < 0) { return -1; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a2ee160128..d7751f731d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -867,6 +867,8 @@ qemuDomainChrSourcePrivateDispose(void *obj) VIR_FORCE_CLOSE(priv->fd); VIR_FORCE_CLOSE(priv->logfd); + g_free(priv->tlsCertPath); + g_free(priv->fdset); g_free(priv->logFdset); g_free(priv->tlsCredsAlias); @@ -9754,6 +9756,11 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev, charsrc->data.tcp.haveTLS = virTristateBoolFromBool(data->cfg->chardevTLS); charsrc->data.tcp.tlsFromConfig = true; } + + if (charsrc->data.tcp.haveTLS == VIR_TRISTATE_BOOL_YES) { + charpriv->tlsCertPath = g_strdup(data->cfg->chardevTLSx509certdir); + charpriv->tlsVerify = data->cfg->chardevTLSx509verify; + } } break; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index d07def3d85..5474d1dccc 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -346,6 +346,9 @@ struct _qemuDomainChrSourcePrivate { int logfd; /* file descriptor of the logging source */ bool wait; /* wait for incomming connections on chardev */ + char *tlsCertPath; /* path to certificates if TLS is requested */ + bool tlsVerify; /* whether server should verify client certificates */ + char *fdset; /* fdset path corresponding to the passed filedescriptor */ char *logFdset; /* fdset path corresponding to the passed filedescriptor for logfile */ int passedFD; /* filedescriptor number when fdset passing it directly */ -- 2.31.1

Now that the parameter is unused we can remove it as well as from each caller that doesn't need it any more. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 47 +++++++++++------------------------------ 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 583e311008..0fb7b83d3f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1476,7 +1476,6 @@ qemuBuildChardevStr(const virDomainChrSourceDef *dev, static int qemuBuildChardevCommand(virCommand *cmd, - virQEMUDriverConfig *cfg G_GNUC_UNUSED, const virDomainChrSourceDef *dev, const char *charAlias, virQEMUCaps *qemuCaps) @@ -5570,14 +5569,12 @@ qemuBuildHostdevCommandLine(virCommand *cmd, static int qemuBuildMonitorCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, qemuDomainObjPrivate *priv) { if (!priv->monConfig) return 0; if (qemuBuildChardevCommand(cmd, - cfg, priv->monConfig, "charmonitor", priv->qemuCaps) < 0) @@ -5698,7 +5695,6 @@ qemuBuildSclpDevProps(virDomainChrDef *dev) static int qemuBuildRNGBackendChrdev(virCommand *cmd, - virQEMUDriverConfig *cfg, virDomainRNGDef *rng, virQEMUCaps *qemuCaps) { @@ -5713,7 +5709,6 @@ qemuBuildRNGBackendChrdev(virCommand *cmd, case VIR_DOMAIN_RNG_BACKEND_EGD: if (qemuBuildChardevCommand(cmd, - cfg, rng->source.chardev, charAlias, qemuCaps) < 0) @@ -5805,7 +5800,6 @@ qemuBuildRNGDevProps(const virDomainDef *def, static int qemuBuildRNGCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -5823,7 +5817,7 @@ qemuBuildRNGCommandLine(virCommand *cmd, } /* possibly add character device for backend */ - if (qemuBuildRNGBackendChrdev(cmd, cfg, rng, qemuCaps) < 0) + if (qemuBuildRNGBackendChrdev(cmd, rng, qemuCaps) < 0) return -1; if (qemuBuildRNGBackendProps(rng, &props) < 0) @@ -8645,18 +8639,15 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg, } static int -qemuInterfaceVhostuserConnect(virQEMUDriver *driver, - virCommand *cmd, +qemuInterfaceVhostuserConnect(virCommand *cmd, virDomainNetDef *net, virQEMUCaps *qemuCaps) { - g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autofree char *charAlias = qemuAliasChardevFromDevAlias(net->info.alias); switch ((virDomainChrType)net->data.vhostuser->type) { case VIR_DOMAIN_CHR_TYPE_UNIX: if (qemuBuildChardevCommand(cmd, - cfg, net->data.vhostuser, charAlias, qemuCaps) < 0) @@ -8777,7 +8768,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, case VIR_DOMAIN_NET_TYPE_VHOSTUSER: requireNicdev = true; - if (qemuInterfaceVhostuserConnect(driver, cmd, net, qemuCaps) < 0) + if (qemuInterfaceVhostuserConnect(cmd, net, qemuCaps) < 0) goto cleanup; if (virNetDevOpenvswitchGetVhostuserIfname(net->data.vhostuser->data.nix.path, @@ -9049,7 +9040,6 @@ qemuBuildNetCommandLine(virQEMUDriver *driver, static int qemuBuildSmartcardCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9095,7 +9085,6 @@ qemuBuildSmartcardCommandLine(virCommand *cmd, g_autofree char *charAlias = qemuAliasChardevFromDevAlias(smartcard->info.alias); if (qemuBuildChardevCommand(cmd, - cfg, smartcard->data.passthru, charAlias, qemuCaps) < 0) @@ -9241,7 +9230,6 @@ qemuBuildShmemBackendMemProps(virDomainShmemDef *shmem) static int qemuBuildShmemCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, virDomainDef *def, virDomainShmemDef *shmem, virQEMUCaps *qemuCaps) @@ -9309,7 +9297,6 @@ qemuBuildShmemCommandLine(virCommand *cmd, g_autofree char *charAlias = qemuAliasChardevFromDevAlias(shmem->info.alias); if (qemuBuildChardevCommand(cmd, - cfg, shmem->server.chr, charAlias, qemuCaps) < 0) @@ -9406,7 +9393,6 @@ qemuChrIsPlatformDevice(const virDomainDef *def, static int qemuBuildSerialCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9428,7 +9414,6 @@ qemuBuildSerialCommandLine(virCommand *cmd, continue; if (qemuBuildChardevCommand(cmd, - cfg, serial->source, charAlias, qemuCaps) < 0) @@ -9461,7 +9446,6 @@ qemuBuildSerialCommandLine(virCommand *cmd, static int qemuBuildParallelsCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9472,7 +9456,6 @@ qemuBuildParallelsCommandLine(virCommand *cmd, g_autofree char *charAlias = qemuAliasChardevFromDevAlias(parallel->info.alias); if (qemuBuildChardevCommand(cmd, - cfg, parallel->source, charAlias, qemuCaps) < 0) @@ -9489,7 +9472,6 @@ qemuBuildParallelsCommandLine(virCommand *cmd, static int qemuBuildChannelsCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9501,7 +9483,6 @@ qemuBuildChannelsCommandLine(virCommand *cmd, g_autofree char *charAlias = qemuAliasChardevFromDevAlias(channel->info.alias); if (qemuBuildChardevCommand(cmd, - cfg, channel->source, charAlias, qemuCaps) < 0) @@ -9534,7 +9515,6 @@ qemuBuildChannelsCommandLine(virCommand *cmd, static int qemuBuildConsoleCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9550,7 +9530,6 @@ qemuBuildConsoleCommandLine(virCommand *cmd, case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: if (qemuBuildChardevCommand(cmd, - cfg, console->source, charAlias, qemuCaps) < 0) @@ -9632,7 +9611,6 @@ qemuBuildRedirdevDevProps(const virDomainDef *def, static int qemuBuildRedirdevCommandLine(virCommand *cmd, - virQEMUDriverConfig *cfg, const virDomainDef *def, virQEMUCaps *qemuCaps) { @@ -9644,7 +9622,6 @@ qemuBuildRedirdevCommandLine(virCommand *cmd, g_autofree char *charAlias = qemuAliasChardevFromDevAlias(redirdev->info.alias); if (qemuBuildChardevCommand(cmd, - cfg, redirdev->source, charAlias, qemuCaps) < 0) @@ -10614,7 +10591,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, virCommandAddArg(cmd, "-no-user-config"); virCommandAddArg(cmd, "-nodefaults"); - if (qemuBuildMonitorCommandLine(cmd, cfg, priv) < 0) + if (qemuBuildMonitorCommandLine(cmd, priv) < 0) return NULL; if (qemuBuildClockCommandLine(cmd, def, qemuCaps) < 0) @@ -10653,19 +10630,19 @@ qemuBuildCommandLine(virQEMUDriver *driver, nnicindexes, nicindexes) < 0) return NULL; - if (qemuBuildSmartcardCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildSmartcardCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildSerialCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildSerialCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildParallelsCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildParallelsCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildChannelsCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildChannelsCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildConsoleCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildConsoleCommandLine(cmd, def, qemuCaps) < 0) return NULL; if (qemuBuildTPMsCommandLine(cmd, def, qemuCaps) < 0) @@ -10689,7 +10666,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildWatchdogCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRedirdevCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildRedirdevCommandLine(cmd, def, qemuCaps) < 0) return NULL; if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps) < 0) @@ -10701,7 +10678,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildMemballoonCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildRNGCommandLine(cmd, cfg, def, qemuCaps) < 0) + if (qemuBuildRNGCommandLine(cmd, def, qemuCaps) < 0) return NULL; if (qemuBuildNVRAMCommandLine(cmd, def) < 0) @@ -10735,7 +10712,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, return NULL; for (i = 0; i < def->nshmems; i++) { - if (qemuBuildShmemCommandLine(cmd, cfg, def, def->shmems[i], qemuCaps) < 0) + if (qemuBuildShmemCommandLine(cmd, def, def->shmems[i], qemuCaps) < 0) return NULL; } -- 2.31.1

Add handling to qemuDomainDeviceBackendChardevForeachOne and callbacks so that we can later use 'qemuBuildChardevCommand' for vhost-user disks instead of a custom formatter. Since we don't pass the FD for the vhost-user connection to qemu all of the setup can be skipped. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 7 ++++++- src/qemu/qemu_process.c | 4 ++++ tests/qemuxml2argvtest.c | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d7751f731d..475f2f536e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11494,6 +11494,12 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, void *opaque) { switch ((virDomainDeviceType) dev->type) { + case VIR_DOMAIN_DEVICE_DISK: + if (virStorageSourceGetActualType(dev->data.disk->src) != VIR_STORAGE_TYPE_VHOST_USER) + return 0; + + return cb(dev, dev->data.disk->src->vhostuser, opaque); + case VIR_DOMAIN_DEVICE_NET: if (virDomainNetGetActualType(dev->data.net) != VIR_DOMAIN_NET_TYPE_VHOSTUSER) return 0; @@ -11524,7 +11530,6 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, return cb(dev, dev->data.rng->source.chardev, opaque); - case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d31ab103cf..ed0b80be0b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6886,6 +6886,10 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDeviceDef *dev, /* this function is also called for the monitor backend which doesn't have * a 'dev' */ if (dev) { + /* vhost-user disk doesn't use FD passing */ + if (dev->type == VIR_DOMAIN_DEVICE_DISK) + return 0; + if (dev->type == VIR_DOMAIN_DEVICE_NET) { /* due to a historical bug in qemu we don't use FD passtrhough for * vhost-sockets for network devices */ diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index fa451b6b54..ac4b532ef1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -385,6 +385,10 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *dev, qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chardev); if (dev) { + /* vhost-user disk doesn't use FD passing */ + if (dev->type == VIR_DOMAIN_DEVICE_DISK) + return 0; + if (dev->type == VIR_DOMAIN_DEVICE_NET) { /* due to a historical bug in qemu we don't use FD passtrhough for * vhost-sockets for network devices */ -- 2.31.1

Now that the API for qemuBuildChrChardevCommand is sane enough, we can use it to centralize formatting of '-chardev' generally. For virtiofs we don't have a centrally stored chardev source so we allocate one inline for temporary use. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_block.c | 1 - src/qemu/qemu_block.h | 1 - src/qemu/qemu_command.c | 18 ++++-------------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index f6a7f2b750..87dca40179 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -1655,7 +1655,6 @@ qemuBlockStorageSourceAttachDataFree(qemuBlockStorageSourceAttachData *data) g_free(data->driveCmd); g_free(data->driveAlias); g_free(data->chardevAlias); - g_free(data->chardevCmd); g_free(data); } diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index 54601a48a9..184a549d5c 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -99,7 +99,6 @@ struct qemuBlockStorageSourceAttachData { virDomainChrSourceDef *chardevDef; char *chardevAlias; - char *chardevCmd; bool chardevAdded; virJSONValue *authsecretProps; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0fb7b83d3f..0bfe76c29c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2591,8 +2591,10 @@ qemuBuildBlockStorageSourceAttachDataCommandline(virCommand *cmd, if (data->driveCmd) virCommandAddArgList(cmd, "-drive", data->driveCmd, NULL); - if (data->chardevCmd) - virCommandAddArgList(cmd, "-chardev", data->chardevCmd, NULL); + if (data->chardevDef) { + if (qemuBuildChardevCommand(cmd, data->chardevDef, data->chardevAlias, qemuCaps) < 0) + return -1; + } if (data->storageProps) { if (!(tmp = virJSONValueToString(data->storageProps, false))) @@ -10959,24 +10961,12 @@ static qemuBlockStorageSourceAttachData * qemuBuildStorageSourceAttachPrepareChardev(virDomainDiskDef *disk) { g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; - g_auto(virBuffer) chardev = VIR_BUFFER_INITIALIZER; data = g_new0(qemuBlockStorageSourceAttachData, 1); data->chardevDef = disk->src->vhostuser; data->chardevAlias = qemuDomainGetVhostUserChrAlias(disk->info.alias); - virBufferAddLit(&chardev, "socket"); - virBufferAsprintf(&chardev, ",id=%s", data->chardevAlias); - virBufferAddLit(&chardev, ",path="); - virQEMUBuildBufferEscapeComma(&chardev, disk->src->vhostuser->data.nix.path); - - qemuBuildChrChardevReconnectStr(&chardev, - &disk->src->vhostuser->data.nix.reconnect); - - if (!(data->chardevCmd = virBufferContentAndReset(&chardev))) - return NULL; - return g_steal_pointer(&data); } -- 2.31.1

Now that the API for qemuBuildChrChardevCommand is sane enough, we can use it to centralize formatting of '-chardev' generally. The 'virDomainFSDef' doesn't use 'virDomainChrSourceDef' internally so we create it for this occasion manually. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0bfe76c29c..3a5796fed8 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2741,22 +2741,6 @@ qemuBuildDisksCommandLine(virCommand *cmd, } -static char * -qemuBuildVHostUserFsChardevStr(const virDomainFSDef *fs, - const char *chardev_alias, - qemuDomainObjPrivate *priv) -{ - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - g_autofree char *socket_path = qemuDomainGetVHostUserFSSocketPath(priv, fs); - - virBufferAddLit(&buf, "socket"); - virBufferAsprintf(&buf, ",id=%s", chardev_alias); - virBufferAddLit(&buf, ",path="); - virQEMUBuildBufferEscapeComma(&buf, socket_path); - return virBufferContentAndReset(&buf); -} - - virJSONValue * qemuBuildVHostUserFsDevProps(virDomainFSDef *fs, const virDomainDef *def, @@ -2790,15 +2774,18 @@ qemuBuildVHostUserFsCommandLine(virCommand *cmd, const virDomainDef *def, qemuDomainObjPrivate *priv) { - g_autofree char *chardev_alias = NULL; - g_autofree char *chrdevstr = NULL; + g_autofree char *chardev_alias = qemuDomainGetVhostUserChrAlias(fs->info.alias); g_autoptr(virJSONValue) devprops = NULL; + g_autoptr(virDomainChrSourceDef) chrsrc = virDomainChrSourceDefNew(priv->driver->xmlopt); - chardev_alias = qemuDomainGetVhostUserChrAlias(fs->info.alias); - chrdevstr = qemuBuildVHostUserFsChardevStr(fs, chardev_alias, priv); + if (!chrsrc) + return -1; + + chrsrc->type = VIR_DOMAIN_CHR_TYPE_UNIX; + chrsrc->data.nix.path = qemuDomainGetVHostUserFSSocketPath(priv, fs); - virCommandAddArg(cmd, "-chardev"); - virCommandAddArg(cmd, chrdevstr); + if (qemuBuildChardevCommand(cmd, chrsrc, chardev_alias, priv->qemuCaps) < 0) + return -1; if (qemuCommandAddExtDevice(cmd, &fs->info, priv->qemuCaps) < 0) return -1; -- 2.31.1

Now that the API for qemuBuildChrChardevCommand is sane enough, we can use it to centralize formatting of '-chardev' generally. The 'virDomainVideoDef' doesn't use 'virDomainChrSourceDef' internally so we create it for this occasion manually. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 57 ++++++------------- ...host-user-gpu-secondary.x86_64-latest.args | 2 +- ...irtio-options-video-ats.x86_64-latest.args | 2 +- ...tio-options-video-iommu.x86_64-latest.args | 2 +- ...io-options-video-packed.x86_64-latest.args | 2 +- 5 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3a5796fed8..3ca7da9d5d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4939,60 +4939,37 @@ qemuBuildDeviceVideoCmd(virCommand *cmd, } -static char * -qemuBuildVhostUserChardevStr(const char *alias, - int *fd, - virCommand *cmd) -{ - g_autofree char *chardev_alias = qemuDomainGetVhostUserChrAlias(alias); - char *chardev = NULL; - - if (*fd == -1) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Attempt to pass closed vhostuser FD")); - return NULL; - } - - chardev = g_strdup_printf("socket,id=%s,fd=%d", chardev_alias, *fd); - - virCommandPassFD(cmd, *fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); - *fd = -1; - - return chardev; -} - - static int qemuBuildVideoCommandLine(virCommand *cmd, const virDomainDef *def, - virQEMUCaps *qemuCaps) + qemuDomainObjPrivate *priv) { size_t i; for (i = 0; i < def->nvideos; i++) { - g_autofree char *chardev = NULL; virDomainVideoDef *video = def->videos[i]; + if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE) + continue; + if (video->backend == VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) { - if (!(chardev = qemuBuildVhostUserChardevStr(video->info.alias, - &QEMU_DOMAIN_VIDEO_PRIVATE(video)->vhost_user_fd, - cmd))) - return -1; + qemuDomainVideoPrivate *videopriv = QEMU_DOMAIN_VIDEO_PRIVATE(video); + g_autoptr(virDomainChrSourceDef) chrsrc = virDomainChrSourceDefNew(priv->driver->xmlopt); + g_autofree char *chrAlias = qemuDomainGetVhostUserChrAlias(video->info.alias); + qemuDomainChrSourcePrivate *chrsrcpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chrsrc); - virCommandAddArgList(cmd, "-chardev", chardev, NULL); - } - } + chrsrc->type = VIR_DOMAIN_CHR_TYPE_UNIX; + chrsrcpriv->fd = videopriv->vhost_user_fd; + videopriv->vhost_user_fd = -1; - for (i = 0; i < def->nvideos; i++) { - virDomainVideoDef *video = def->videos[i]; - - if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE) - continue; + if (qemuBuildChardevCommand(cmd, chrsrc, chrAlias, priv->qemuCaps) < 0) + return -1; + } - if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info, qemuCaps) < 0) + if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info, priv->qemuCaps) < 0) return -1; - if (qemuBuildDeviceVideoCmd(cmd, def, video, qemuCaps) < 0) + if (qemuBuildDeviceVideoCmd(cmd, def, video, priv->qemuCaps) < 0) return -1; } @@ -10646,7 +10623,7 @@ qemuBuildCommandLine(virQEMUDriver *driver, if (qemuBuildGraphicsCommandLine(cfg, cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildVideoCommandLine(cmd, def, qemuCaps) < 0) + if (qemuBuildVideoCommandLine(cmd, def, priv) < 0) return NULL; if (qemuBuildSoundCommandLine(cmd, def, qemuCaps) < 0) diff --git a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args index 7f0db5fbce..43ae421715 100644 --- a/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-user-gpu-secondary.x86_64-latest.args @@ -34,8 +34,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-format","id":"ide0-0-0","bootindex":1}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -chardev socket,id=chr-vu-video0,fd=1729 \ --chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-vga","id":"video0","max_outputs":1,"chardev":"chr-vu-video0","bus":"pci.0","addr":"0x2"}' \ +-chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-gpu-pci","id":"video1","max_outputs":1,"chardev":"chr-vu-video1","bus":"pci.0","addr":"0x4"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/virtio-options-video-ats.x86_64-latest.args b/tests/qemuxml2argvdata/virtio-options-video-ats.x86_64-latest.args index 4ec8d006e7..c0b5ad781a 100644 --- a/tests/qemuxml2argvdata/virtio-options-video-ats.x86_64-latest.args +++ b/tests/qemuxml2argvdata/virtio-options-video-ats.x86_64-latest.args @@ -30,8 +30,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -chardev socket,id=chr-vu-video0,fd=1729 \ --chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-vga","id":"video0","max_outputs":1,"chardev":"chr-vu-video0","bus":"pci.0","addr":"0x2"}' \ +-chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-gpu-pci","ats":false,"id":"video1","max_outputs":1,"chardev":"chr-vu-video1","bus":"pci.0","addr":"0x3"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x4"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/virtio-options-video-iommu.x86_64-latest.args b/tests/qemuxml2argvdata/virtio-options-video-iommu.x86_64-latest.args index d90b5c674f..48c7bcf7f6 100644 --- a/tests/qemuxml2argvdata/virtio-options-video-iommu.x86_64-latest.args +++ b/tests/qemuxml2argvdata/virtio-options-video-iommu.x86_64-latest.args @@ -30,8 +30,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -chardev socket,id=chr-vu-video0,fd=1729 \ --chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-vga","id":"video0","max_outputs":1,"chardev":"chr-vu-video0","bus":"pci.0","addr":"0x2"}' \ +-chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-gpu-pci","iommu_platform":false,"id":"video1","max_outputs":1,"chardev":"chr-vu-video1","bus":"pci.0","addr":"0x3"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x4"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/virtio-options-video-packed.x86_64-latest.args b/tests/qemuxml2argvdata/virtio-options-video-packed.x86_64-latest.args index 532285eb85..f1b96b92d7 100644 --- a/tests/qemuxml2argvdata/virtio-options-video-packed.x86_64-latest.args +++ b/tests/qemuxml2argvdata/virtio-options-video-packed.x86_64-latest.args @@ -30,8 +30,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -chardev socket,id=chr-vu-video0,fd=1729 \ --chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-vga","id":"video0","max_outputs":1,"chardev":"chr-vu-video0","bus":"pci.0","addr":"0x2"}' \ +-chardev socket,id=chr-vu-video1,fd=1729 \ -device '{"driver":"vhost-user-gpu-pci","packed":false,"id":"video1","max_outputs":1,"chardev":"chr-vu-video1","bus":"pci.0","addr":"0x3"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x4"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -- 2.31.1

Add handling to qemuDomainDeviceBackendChardevForeachOne and callbacks so that we can later use 'qemuBuildChardevCommand' for TPM devices. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 14 +++++++++++++- src/qemu/qemu_process.c | 4 ++++ tests/qemuxml2argvtest.c | 4 ++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 475f2f536e..5607d6f581 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11530,6 +11530,19 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, return cb(dev, dev->data.rng->source.chardev, opaque); + case VIR_DOMAIN_DEVICE_TPM: + switch ((virDomainTPMBackendType) dev->data.tpm->type) { + case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: + return cb(dev, dev->data.tpm->data.passthrough.source, opaque); + + case VIR_DOMAIN_TPM_TYPE_EMULATOR: + return cb(dev, dev->data.tpm->data.emulator.source, opaque); + + case VIR_DOMAIN_TPM_TYPE_LAST: + return 0; + } + return 0; + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: @@ -11543,7 +11556,6 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: - case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_MEMORY: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ed0b80be0b..a8a8c4c54b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6895,6 +6895,10 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDeviceDef *dev, * vhost-sockets for network devices */ return 0; } + + /* TPMs FD passing setup is special and handled separately */ + if (dev->type == VIR_DOMAIN_DEVICE_TPM) + return 0; } switch ((virDomainChrType) chardev->type) { diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ac4b532ef1..615f45376c 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -394,6 +394,10 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *dev, * vhost-sockets for network devices */ return 0; } + + /* TPMs FD passing setup is special and handled separately */ + if (dev->type == VIR_DOMAIN_DEVICE_TPM) + return 0; } switch ((virDomainChrType) chardev->type) { -- 2.31.1

Since the backend of the TPM is a chardev we can use the common helper to instantiate it. This commit also ensures proper ordering so that the backend chardev is formatted before it's being referenced. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 25 +++++++------------ .../aarch64-tpm.aarch64-latest.args | 2 +- .../ppc64-tpmproxy-with-tpm.ppc64-latest.args | 2 +- .../tpm-emulator-spapr.ppc64-latest.args | 2 +- .../tpm-emulator-tpm2-enc.x86_64-latest.args | 2 +- ...pm-emulator-tpm2-pstate.x86_64-latest.args | 2 +- .../tpm-emulator-tpm2.x86_64-latest.args | 2 +- .../tpm-emulator.x86_64-latest.args | 2 +- 8 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3ca7da9d5d..613f7a5d2a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9734,8 +9734,7 @@ static char * qemuBuildTPMBackendStr(virCommand *cmd, virDomainTPMDef *tpm, int *tpmfd, - int *cancelfd, - char **chardev) + int *cancelfd) { g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; g_autofree char *cancel_path = NULL; @@ -9774,10 +9773,6 @@ qemuBuildTPMBackendStr(virCommand *cmd, break; case VIR_DOMAIN_TPM_TYPE_EMULATOR: virBufferAddLit(&buf, ",chardev=chrtpm"); - - *chardev = g_strdup_printf("socket,id=chrtpm,path=%s", - tpm->data.emulator.source->data.nix.path); - break; case VIR_DOMAIN_TPM_TYPE_LAST: return NULL; @@ -9793,22 +9788,20 @@ qemuBuildTPMCommandLine(virCommand *cmd, virDomainTPMDef *tpm, virQEMUCaps *qemuCaps) { - char *optstr; - g_autofree char *chardev = NULL; + g_autofree char *tpmdevstr = NULL; int tpmfd = -1; int cancelfd = -1; char *fdset; - if (!(optstr = qemuBuildTPMBackendStr(cmd, tpm, - &tpmfd, &cancelfd, - &chardev))) - return -1; + if (tpm->type == VIR_DOMAIN_TPM_TYPE_EMULATOR) { + if (qemuBuildChardevCommand(cmd, tpm->data.emulator.source, "chrtpm", qemuCaps) < 0) + return -1; + } - virCommandAddArgList(cmd, "-tpmdev", optstr, NULL); - VIR_FREE(optstr); + if (!(tpmdevstr = qemuBuildTPMBackendStr(cmd, tpm, &tpmfd, &cancelfd))) + return -1; - if (chardev) - virCommandAddArgList(cmd, "-chardev", chardev, NULL); + virCommandAddArgList(cmd, "-tpmdev", tpmdevstr, NULL); if (tpmfd >= 0) { fdset = qemuVirCommandGetFDSet(cmd, tpmfd); diff --git a/tests/qemuxml2argvdata/aarch64-tpm.aarch64-latest.args b/tests/qemuxml2argvdata/aarch64-tpm.aarch64-latest.args index 77687b1d05..3125460a95 100644 --- a/tests/qemuxml2argvdata/aarch64-tpm.aarch64-latest.args +++ b/tests/qemuxml2argvdata/aarch64-tpm.aarch64-latest.args @@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-aarch64test/.config \ -no-shutdown \ -no-acpi \ -boot strict=on \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-tis-device","tpmdev":"tpm-tpm0","id":"tpm0"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.ppc64-latest.args index 104a5ef28c..90a27ca1a8 100644 --- a/tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.ppc64-latest.args +++ b/tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.ppc64-latest.args @@ -28,8 +28,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -boot strict=on \ -device '{"driver":"pci-ohci","id":"usb","bus":"pci.0","addr":"0x1"}' \ -device '{"driver":"spapr-tpm-proxy","id":"tpm0","host-path":"/dev/tpmrm0"}' \ --tpmdev emulator,id=tpm-tpm1,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm1,chardev=chrtpm \ -device '{"driver":"tpm-spapr","tpmdev":"tpm-tpm1","id":"tpm1","reg":16384}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x6"}' \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args index 90c207d544..97d310d8dc 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args @@ -36,8 +36,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \ -device '{"driver":"spapr-vty","chardev":"charserial0","id":"serial0","reg":805306368}' \ -chardev pty,id=charserial1 \ -device '{"driver":"spapr-vty","chardev":"charserial1","id":"serial1","reg":805310464}' \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-spapr","tpmdev":"tpm-tpm0","id":"tpm0","reg":20480}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -global spapr-nvram.reg=0x4000 \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args index 89a577d657..3b418917f3 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args @@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \ -no-shutdown \ -boot menu=on,strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-tis","tpmdev":"tpm-tpm0","id":"tpm0"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args index 89a577d657..3b418917f3 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args @@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \ -no-shutdown \ -boot menu=on,strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-tis","tpmdev":"tpm-tpm0","id":"tpm0"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args index 89a577d657..3b418917f3 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args @@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \ -no-shutdown \ -boot menu=on,strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-tis","tpmdev":"tpm-tpm0","id":"tpm0"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ diff --git a/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args index 89a577d657..3b418917f3 100644 --- a/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args @@ -27,8 +27,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \ -no-shutdown \ -boot menu=on,strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ --tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/dev/test \ +-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \ -device '{"driver":"tpm-tis","tpmdev":"tpm-tpm0","id":"tpm0"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ -- 2.31.1

On a Thursday in 2021, Peter Krempa wrote:
In this part I'm cleaning up the command line generators and unifying them. Until now there were multiple custom -chardev generators in places where it was simpler to use it than the common code. This series fixes the common code to have sane API and refactors virtiofs, vhost-user-blk vhost-user-gpu and TPM code to use it.
After this series we are left with 3 distinct generators for chardev properties:
- commandline - commandline for capabilties probing - QMP
After the refactors here we can finally also add DO_TEST_CAPS_LATEST of chardev tests without actually touching the host as part of the testsuite which was impossible before.
In further parts the generators will be put into one place and prepared for upcoming qemu refactors.
Peter Krempa (24): virDomainDeviceInfoIterateFlags: Export the symbol qemu: domain: Introduce helpers for initializing chardev backend of devices qemu: Move creation and opening of chardev backend FDs to host prepare step qemu: command: Remove unused QEMU_BUILD_CHARDEV_FILE_LOGD and QEMU_BUILD_CHARDEV_UNIX_FD_PASS qemu: command: remove the unused 'chardevStdioLogd' argument/variable qemu: domain: Refactor chardev definition preparing qemu: Store chardev 'wait' flag in chardev source private data qemuBuildChrChardevStr: Remove 'cdevflags' argument qemuBuildChrChardevStr: Remove unused arguments and clean up callers qemuxml2argvtest: Add DO_TEST_CAPS_LATEST versions for all character device tests qemuxml2argvtest: Add _LATEST version for 'name-escape' case qemuBuildConsoleCommandLine: Remove identical code qemuBuildChrChardevStr: Directly generate command line qemuBuildChardevCommand: Move earlier qemuBuildChardevCommand: Don't prefix alias qemuBuildChardevCommand: Split creation of the command and setup of other objects qemu: Store TLS config options for chardevs in qemuDomainChrSourcePrivate qemuBuildChardevCommand: Remove unused 'cfg' parameter qemu: Implement chardev source setup for disk qemu: Use qemuBuildChrChardevCommand for vhost-user disk backend qemu: Use qemuBuildChrChardevCommand for virtiofs backend chardev qemu: Use qemuBuildChrChardevCommand for vhost-user-gpu backend chardev qemu: Implement chardev source setup for tpm qemu: command: Use 'qemuBuildChrChardevCommand' to build TPM backend
46 files changed, 1959 insertions(+), 776 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (3)
-
Ján Tomko
-
Michal Prívozník
-
Peter Krempa