129 lines
4.8 KiB
Diff
129 lines
4.8 KiB
Diff
From 17e751be222dd86959f71afda2fca8b0ed09f55b Mon Sep 17 00:00:00 2001
|
|
From: Peter Krempa <pkrempa@redhat.com>
|
|
Date: Fri, 15 May 2020 09:46:08 +0200
|
|
Subject: [PATCH 11/18] qemuBuildChannelGuestfwdNetdevProps: Convert to
|
|
generating JSON props
|
|
|
|
Syntax of guestfwd channel also needs to be modified to conform to the
|
|
QAPI schema.
|
|
|
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
|
Reviewed-by: Eric Blake <eblake@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 141657b3e4..bd78bfb31b 100644
|
|
--- a/src/qemu/qemu_command.c
|
|
+++ b/src/qemu/qemu_command.c
|
|
@@ -8903,6 +8903,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,
|
|
@@ -8917,8 +8918,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;
|
|
|
|
@@ -10186,19 +10191,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 00d9a9da8f..1e6b23ba05 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 1877aef1b0..24a898166d 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.23.0.windows.1
|
|
|