]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildChannelGuestfwdNetdevProps: Convert to generating JSON props
authorPeter Krempa <pkrempa@redhat.com>
Fri, 15 May 2020 07:46:08 +0000 (09:46 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 20 May 2020 07:41:57 +0000 (09:41 +0200)
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
src/qemu/qemu_command.h
src/qemu/qemu_hotplug.c

index aaae46cee486f6a06dd845ecca4a224ab78f2366..ccae54140877be226fe7ba5955d2465db0469577 100644 (file)
@@ -8577,6 +8577,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,
@@ -8591,8 +8592,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;
 
@@ -9860,19 +9865,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;
 }
 
 
index 6cdd9debe00fff4e6dd235a5f823c7c24377820b..1daa07982caa960b35a385adac82aca65d881cb6 100644 (file)
@@ -86,7 +86,7 @@ qemuBuildChrDeviceStr(char **deviceStr,
                       virDomainChrDefPtr chr,
                       virQEMUCapsPtr qemuCaps);
 
-char *
+virJSONValuePtr
 qemuBuildChannelGuestfwdNetdevProps(virDomainChrDefPtr chr);
 
 virJSONValuePtr qemuBuildHostNetStr(virDomainNetDefPtr net,
index 670250d9738c8d5a150a50f1c613cba1a3297938..4a3597ac011959693f5a5a5da9fe0b3af688307e 100644 (file)
@@ -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)