Syntax of guestfwd channel also needs to be modified to conform to the
QAPI schema.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 37 +++++++++++++++++++++++++++++++------
src/qemu/qemu_command.h | 2 +-
src/qemu/qemu_hotplug.c | 6 +++++-
3 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 00d1b4121d..2ed8e66f66 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8567,6 +8567,7 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
for (i = 0; i < def->nchannels; i++) {
virDomainChrDefPtr channel = def->channels[i];
g_autofree char *chardevstr = NULL;
+ g_autoptr(virJSONValue) netdevprops = NULL;
g_autofree char *netdevstr = NULL;
if (!(chardevstr = qemuBuildChrChardevStr(logManager, secManager,
@@ -8581,8 +8582,12 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
switch ((virDomainChrChannelTargetType) channel->targetType) {
case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
- if (!(netdevstr = qemuBuildChannelGuestfwdNetdevProps(channel)))
+ if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(channel)))
return -1;
+
+ if (!(netdevstr = virQEMUBuildNetdevCommandlineFromJSON(netdevprops)))
+ return -1;
+
virCommandAddArgList(cmd, "-netdev", netdevstr, NULL);
break;
@@ -9850,19 +9855,39 @@ qemuBuildParallelChrDeviceStr(char **deviceStr,
}
-char *
+virJSONValuePtr
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDefPtr chr)
{
+ g_autoptr(virJSONValue) guestfwdarr = virJSONValueNewArray();
+ g_autoptr(virJSONValue) guestfwdstrobj = virJSONValueNewObject();
g_autofree char *addr = NULL;
- int port;
+ virJSONValuePtr ret = NULL;
if (!(addr = virSocketAddrFormat(chr->target.addr)))
return NULL;
- port = virSocketAddrGetPort(chr->target.addr);
+ /* this may seem weird, but qemu indeed decided that 'guestfwd' parameter
+ * is an array of objects which have just one member named 'str' which
+ * contains the description */
+ if (virJSONValueObjectAppendStringPrintf(guestfwdstrobj, "str",
+ "tcp:%s:%i-chardev:char%s",
+ addr,
+ virSocketAddrGetPort(chr->target.addr),
+ chr->info.alias) < 0)
+ return NULL;
+
+ if (virJSONValueArrayAppend(guestfwdarr, guestfwdstrobj) < 0)
+ return NULL;
+ guestfwdstrobj = NULL;
- return g_strdup_printf("user,guestfwd=tcp:%s:%i-chardev:char%s,id=%s",
- addr, port, chr->info.alias, chr->info.alias);
+ if (virJSONValueObjectCreate(&ret,
+ "s:type", "user",
+ "a:guestfwd", &guestfwdarr,
+ "s:id", chr->info.alias,
+ NULL) < 0)
+ return NULL;
+
+ return ret;
}
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 6cdd9debe0..1daa07982c 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -86,7 +86,7 @@ qemuBuildChrDeviceStr(char **deviceStr,
virDomainChrDefPtr chr,
virQEMUCapsPtr qemuCaps);
-char *
+virJSONValuePtr
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDefPtr chr);
virJSONValuePtr qemuBuildHostNetStr(virDomainNetDefPtr net,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index c6789dcef3..cd9bc9b2f8 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2113,6 +2113,7 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
virErrorPtr orig_err;
virDomainDefPtr vmdef = vm->def;
g_autofree char *devstr = NULL;
+ g_autoptr(virJSONValue) netdevprops = NULL;
g_autofree char *netdevstr = NULL;
virDomainChrSourceDefPtr dev = chr->source;
g_autofree char *charAlias = NULL;
@@ -2153,7 +2154,10 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
teardowncgroup = true;
if (guestfwd) {
- if (!(netdevstr = qemuBuildChannelGuestfwdNetdevProps(chr)))
+ if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(chr)))
+ goto cleanup;
+
+ if (!(netdevstr = virQEMUBuildNetdevCommandlineFromJSON(netdevprops)))
goto cleanup;
} else {
if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
--
2.26.2