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