[libvirt] [PATCH] Use virBuffer when constructing QEMU character device command line

Matthew Booth mbooth at redhat.com
Wed Nov 4 17:43:51 UTC 2009


This patch updates qemudBuildCommandLineChrDevStr to use a virBuffer instead of
a char[]. This is slightly tidier, and it makes it cleaner to (ap|pre)pend the
output in other command lines.

* src/qemu/qemu_conf.c: Update qemudBuildCommandLineChrDevStr to use a virBuffer
---
 src/qemu/qemu_conf.c |   97 +++++++++++++++++++++++--------------------------
 1 files changed, 46 insertions(+), 51 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 40613dd..052ae98 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1409,83 +1409,66 @@ qemuBuildHostNetStr(virConnectPtr conn,
     return 0;
 }
 
-static int qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
-                                          char *buf,
-                                          int buflen)
+static void qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
+                                           virBufferPtr buf)
 {
     switch (dev->type) {
     case VIR_DOMAIN_CHR_TYPE_NULL:
-        if (virStrcpy(buf, "null", buflen) == NULL)
-            return -1;
+        virBufferAddLit(buf, "null");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_VC:
-        if (virStrcpy(buf, "vc", buflen) == NULL)
-            return -1;
+        virBufferAddLit(buf, "vc");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PTY:
-        if (virStrcpy(buf, "pty", buflen) == NULL)
-            return -1;
+        virBufferAddLit(buf, "pty");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_DEV:
-        if (snprintf(buf, buflen, "%s",
-                     dev->data.file.path) >= buflen)
-            return -1;
+        virBufferStrcat(buf, dev->data.file.path, NULL);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_FILE:
-        if (snprintf(buf, buflen, "file:%s",
-                     dev->data.file.path) >= buflen)
-            return -1;
+        virBufferVSprintf(buf, "file:%s", dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PIPE:
-        if (snprintf(buf, buflen, "pipe:%s",
-                     dev->data.file.path) >= buflen)
-            return -1;
+        virBufferVSprintf(buf, "pipe:%s", dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_STDIO:
-        if (virStrcpy(buf, "stdio", buflen) == NULL)
-            return -1;
+        virBufferAddLit(buf, "stdio");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UDP:
-        if (snprintf(buf, buflen, "udp:%s:%s@%s:%s",
-                     dev->data.udp.connectHost,
-                     dev->data.udp.connectService,
-                     dev->data.udp.bindHost,
-                     dev->data.udp.bindService) >= buflen)
-            return -1;
+        virBufferVSprintf(buf, "udp:%s:%s@%s:%s",
+                          dev->data.udp.connectHost,
+                          dev->data.udp.connectService,
+                          dev->data.udp.bindHost,
+                          dev->data.udp.bindService);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_TCP:
         if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
-            if (snprintf(buf, buflen, "telnet:%s:%s%s",
-                         dev->data.tcp.host,
-                         dev->data.tcp.service,
-                         dev->data.tcp.listen ? ",server,nowait" : "") >= buflen)
-                return -1;
+            virBufferVSprintf(buf, "telnet:%s:%s%s",
+                              dev->data.tcp.host,
+                              dev->data.tcp.service,
+                              dev->data.tcp.listen ? ",server,nowait" : "");
         } else {
-            if (snprintf(buf, buflen, "tcp:%s:%s%s",
-                         dev->data.tcp.host,
-                         dev->data.tcp.service,
-                         dev->data.tcp.listen ? ",server,nowait" : "") >= buflen)
-                return -1;
+            virBufferVSprintf(buf, "tcp:%s:%s%s",
+                              dev->data.tcp.host,
+                              dev->data.tcp.service,
+                              dev->data.tcp.listen ? ",server,nowait" : "");
         }
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UNIX:
-        if (snprintf(buf, buflen, "unix:%s%s",
-                     dev->data.nix.path,
-                     dev->data.nix.listen ? ",server,nowait" : "") >= buflen)
-            return -1;
+        virBufferVSprintf(buf, "unix:%s%s",
+                          dev->data.nix.path,
+                          dev->data.nix.listen ? ",server,nowait" : "");
         break;
     }
-
-    return 0;
 }
 
 #define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
@@ -1773,13 +1756,17 @@ int qemudBuildCommandLine(virConnectPtr conn,
         ADD_ARG_LIT("-nographic");
 
     if (monitor_chr) {
-        char buf[4096];
+        virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-        if (qemudBuildCommandLineChrDevStr(monitor_chr, buf, sizeof(buf)) < 0)
+        qemudBuildCommandLineChrDevStr(monitor_chr, &buf);
+        const char *argStr = virBufferContentAndReset(&buf);
+        if (argStr == NULL)
             goto error;
 
         ADD_ARG_LIT("-monitor");
-        ADD_ARG_LIT(buf);
+        ADD_ARG_LIT(argStr);
+
+        VIR_FREE(argStr);
     }
 
     if (def->localtime)
@@ -2059,14 +2046,18 @@ int qemudBuildCommandLine(virConnectPtr conn,
         ADD_ARG_LIT("none");
     } else {
         for (i = 0 ; i < def->nserials ; i++) {
-            char buf[4096];
+            virBuffer buf = VIR_BUFFER_INITIALIZER;
             virDomainChrDefPtr serial = def->serials[i];
 
-            if (qemudBuildCommandLineChrDevStr(serial, buf, sizeof(buf)) < 0)
+            qemudBuildCommandLineChrDevStr(serial, &buf);
+            const char *argStr = virBufferContentAndReset(&buf);
+            if (argStr == NULL)
                 goto error;
 
             ADD_ARG_LIT("-serial");
-            ADD_ARG_LIT(buf);
+            ADD_ARG_LIT(argStr);
+
+            VIR_FREE(argStr);
         }
     }
 
@@ -2075,14 +2066,18 @@ int qemudBuildCommandLine(virConnectPtr conn,
         ADD_ARG_LIT("none");
     } else {
         for (i = 0 ; i < def->nparallels ; i++) {
-            char buf[4096];
+            virBuffer buf = VIR_BUFFER_INITIALIZER;
             virDomainChrDefPtr parallel = def->parallels[i];
 
-            if (qemudBuildCommandLineChrDevStr(parallel, buf, sizeof(buf)) < 0)
+            qemudBuildCommandLineChrDevStr(parallel, &buf);
+            const char *argStr = virBufferContentAndReset(&buf);
+            if (argStr == NULL)
                 goto error;
 
             ADD_ARG_LIT("-parallel");
-            ADD_ARG_LIT(buf);
+            ADD_ARG_LIT(argStr);
+
+            VIR_FREE(argStr);
         }
     }
 
-- 
1.6.2.5




More information about the libvir-list mailing list