[PATCH 16/37] qemuBuildHostNetProps: Refactor construction of tapfd/vhostfd arguments

Peter Krempa pkrempa at redhat.com
Tue May 10 15:19:52 UTC 2022


Pre-construct the array the same way for the case when there's only one
FD and when there are multiple. We just change the argument name
depending on the count.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_command.c | 66 +++++++++++++++++++----------------------
 1 file changed, 31 insertions(+), 35 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 19afad22a1..c412bc50e0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4215,54 +4215,50 @@ qemuBuildHostNetProps(virDomainNetDef *net,
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
     case VIR_DOMAIN_NET_TYPE_NETWORK:
     case VIR_DOMAIN_NET_TYPE_DIRECT:
-    case VIR_DOMAIN_NET_TYPE_ETHERNET:
-        if (virJSONValueObjectAdd(&netprops, "s:type", "tap", NULL) < 0)
-            return NULL;
+    case VIR_DOMAIN_NET_TYPE_ETHERNET: {
+        g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+        /* for one tapfd/vhostfd 'fd=' shall be used, for more than use 'fds=' */
+        const char *tapfd_field = "s:fd";
+        g_autofree char *tapfd_arg = NULL;
+        const char *vhostfd_field = "S:vhostfd";
+        g_autofree char *vhostfd_arg = NULL;
+        bool vhost = false;

-        /* for one tapfd 'fd=' shall be used,
-         * for more than one 'fds=' is the right choice */
-        if (tapfdSize == 1) {
-            if (virJSONValueObjectAdd(&netprops, "s:fd", tapfd[0], NULL) < 0)
-                return NULL;
-        } else {
-            g_auto(virBuffer) fdsbuf = VIR_BUFFER_INITIALIZER;
+        for (i = 0; i < tapfdSize; i++)
+            virBufferAsprintf(&buf, "%s:", tapfd[i]);

-            for (i = 0; i < tapfdSize; i++)
-                virBufferAsprintf(&fdsbuf, "%s:", tapfd[i]);
+        if (tapfdSize > 1)
+            tapfd_field = "s:fds";

-            virBufferTrim(&fdsbuf, ":");
+        virBufferTrim(&buf, ":");
+        tapfd_arg = virBufferContentAndReset(&buf);

-            if (virJSONValueObjectAdd(&netprops,
-                                      "s:fds", virBufferCurrentContent(&fdsbuf),
-                                      NULL) < 0)
-                return NULL;
-        }
+        if (vhostfdSize > 0) {
+            vhost = true;

-        if (vhostfdSize) {
-            if (virJSONValueObjectAppendBoolean(netprops, "vhost", true) < 0)
-                return NULL;
+            for (i = 0; i < vhostfdSize; i++)
+                virBufferAsprintf(&buf, "%s:", vhostfd[i]);

-            if (vhostfdSize == 1) {
-                if (virJSONValueObjectAdd(&netprops, "s:vhostfd", vhostfd[0], NULL) < 0)
-                    return NULL;
-            } else {
-                g_auto(virBuffer) fdsbuf = VIR_BUFFER_INITIALIZER;
+            if (vhostfdSize > 1)
+                vhostfd_field = "s:vhostfds";
+        }

-                for (i = 0; i < vhostfdSize; i++)
-                    virBufferAsprintf(&fdsbuf, "%s:", vhostfd[i]);
+        virBufferTrim(&buf, ":");
+        vhostfd_arg = virBufferContentAndReset(&buf);

-                virBufferTrim(&fdsbuf, ":");
+        if (virJSONValueObjectAdd(&netprops,
+                                  "s:type", "tap",
+                                  tapfd_field, tapfd_arg,
+                                  "B:vhost", vhost,
+                                  vhostfd_field, vhostfd_arg,
+                                  NULL) < 0)
+            return NULL;

-                if (virJSONValueObjectAdd(&netprops,
-                                          "s:vhostfds", virBufferCurrentContent(&fdsbuf),
-                                          NULL) < 0)
-                    return NULL;
-            }
-        }

         if (net->tune.sndbuf_specified &&
             virJSONValueObjectAppendNumberUlong(netprops, "sndbuf", net->tune.sndbuf) < 0)
             return NULL;
+    }
         break;

     case VIR_DOMAIN_NET_TYPE_CLIENT:
-- 
2.35.1



More information about the libvir-list mailing list