[libvirt] [PATCH 01/13] Standard internal API syntax for building QEMU command line arguments

Daniel P. Berrange berrange at redhat.com
Mon Feb 1 18:39:30 UTC 2010


All the helper functions for building command line arguments
now return a 'char *', instead of acepting a 'char **' or
virBufferPtr argument

* qemu/qemu_conf.c: Standardize syntax for building args
* qemu/qemu_conf.h: Export all functions for building args
* qemu/qemu_driver.c: Update for changed syntax for building
  NIC/hostnet args
---
 src/qemu/qemu_conf.c   |  341 +++++++++++++++++++++++-------------------------
 src/qemu/qemu_conf.h   |   56 ++++++--
 src/qemu/qemu_driver.c |    6 +-
 3 files changed, 211 insertions(+), 192 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index fd2acc1..232dc5d 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -2057,10 +2057,10 @@ error:
     return NULL;
 }
 
-static int
+
+char *
 qemuBuildDriveDevStr(virConnectPtr conn,
-                     virDomainDiskDefPtr disk,
-                     char **str)
+                     virDomainDiskDefPtr disk)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
@@ -2101,17 +2101,20 @@ qemuBuildDriveDevStr(virConnectPtr conn,
     virBufferVSprintf(&opt, ",drive=drive-%s", disk->info.alias);
     virBufferVSprintf(&opt, ",id=%s", disk->info.alias);
 
-    *str = virBufferContentAndReset(&opt);
-    return 0;
+    if (virBufferError(&opt)) {
+        virReportOOMError(NULL);
+        goto error;
+    }
+
+    return virBufferContentAndReset(&opt);
 
 error:
     virBufferFreeAndReset(&opt);
-    *str = NULL;
-    return -1;
+    return NULL;
 }
 
 
-static char *
+char *
 qemuBuildControllerDevStr(virDomainControllerDefPtr def)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -2131,8 +2134,10 @@ qemuBuildControllerDevStr(virDomainControllerDefPtr def)
     if (qemuBuildDeviceAddressStr(&buf, &def->info) < 0)
         goto error;
 
-    if (virBufferError(&buf))
+    if (virBufferError(&buf)) {
+        virReportOOMError(NULL);
         goto error;
+    }
 
     return virBufferContentAndReset(&buf);
 
@@ -2142,14 +2147,14 @@ error:
 }
 
 
-int
+char *
 qemuBuildNicStr(virConnectPtr conn,
                 virDomainNetDefPtr net,
                 const char *prefix,
-                int vlan,
-                char **str)
+                int vlan)
 {
-    if (virAsprintf(str,
+    char *str;
+    if (virAsprintf(&str,
                     "%smacaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d%s%s%s%s",
                     prefix ? prefix : "",
                     net->mac[0], net->mac[1],
@@ -2161,13 +2166,14 @@ qemuBuildNicStr(virConnectPtr conn,
                     (net->info.alias ? ",name=" : ""),
                     (net->info.alias ? net->info.alias : "")) < 0) {
         virReportOOMError(conn);
-        return -1;
+        return NULL;
     }
 
-    return 0;
+    return str;
 }
 
-static char *
+
+char *
 qemuBuildNicDevStr(virDomainNetDefPtr net)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -2202,23 +2208,25 @@ error:
     return NULL;
 }
 
-int
+
+char *
 qemuBuildHostNetStr(virConnectPtr conn,
                     virDomainNetDefPtr net,
                     char type_sep,
                     int vlan,
-                    const char *tapfd,
-                    char **str)
+                    const char *tapfd)
 {
+    char *str = NULL;
+
     switch (net->type) {
     case VIR_DOMAIN_NET_TYPE_NETWORK:
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
-        if (virAsprintf(str, "tap%cfd=%s,vlan=%d%s%s",
+        if (virAsprintf(&str, "tap%cfd=%s,vlan=%d%s%s",
                         type_sep, tapfd, vlan,
                         (net->hostnet_name ? ",name=" : ""),
                         (net->hostnet_name ? net->hostnet_name : "")) < 0) {
             virReportOOMError(conn);
-            return -1;
+            return NULL;
         }
         break;
 
@@ -2245,10 +2253,10 @@ qemuBuildHostNetStr(virConnectPtr conn,
             if (virBufferError(&buf)) {
                 virBufferFreeAndReset(&buf);
                 virReportOOMError(conn);
-                return -1;
+                return NULL;
             }
 
-            *str = virBufferContentAndReset(&buf);
+            str = virBufferContentAndReset(&buf);
         }
         break;
 
@@ -2270,7 +2278,7 @@ qemuBuildHostNetStr(virConnectPtr conn,
                 break;
             }
 
-            if (virAsprintf(str, "socket%c%s=%s:%d,vlan=%d%s%s",
+            if (virAsprintf(&str, "socket%c%s=%s:%d,vlan=%d%s%s",
                             type_sep, mode,
                             net->data.socket.address,
                             net->data.socket.port,
@@ -2278,40 +2286,41 @@ qemuBuildHostNetStr(virConnectPtr conn,
                             (net->hostnet_name ? ",name=" : ""),
                             (net->hostnet_name ? net->hostnet_name : "")) < 0) {
                 virReportOOMError(conn);
-                return -1;
+                return NULL;
             }
         }
         break;
 
     case VIR_DOMAIN_NET_TYPE_USER:
     default:
-        if (virAsprintf(str, "user%cvlan=%d%s%s",
+        if (virAsprintf(&str, "user%cvlan=%d%s%s",
                         type_sep, vlan,
                         (net->hostnet_name ? ",name=" : ""),
                         (net->hostnet_name ? net->hostnet_name : "")) < 0) {
             virReportOOMError(conn);
-            return -1;
+            return NULL;
         }
         break;
     }
 
-    return 0;
+    return str;
 }
 
 
-static int
+char *
 qemuBuildNetDevStr(virConnectPtr conn,
                    virDomainNetDefPtr net,
-                   const char *tapfd,
-                   char **str)
+                   const char *tapfd)
 {
+    char *str = NULL;
+
     switch (net->type) {
     case VIR_DOMAIN_NET_TYPE_NETWORK:
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
-        if (virAsprintf(str, "tap,fd=%s,id=%s",
+        if (virAsprintf(&str, "tap,fd=%s,id=%s",
                         tapfd, net->hostnet_name) < 0) {
             virReportOOMError(conn);
-            return -1;
+            return NULL;
         }
         break;
 
@@ -2331,10 +2340,10 @@ qemuBuildNetDevStr(virConnectPtr conn,
             if (virBufferError(&buf)) {
                 virBufferFreeAndReset(&buf);
                 virReportOOMError(conn);
-                return -1;
+                return NULL;
             }
 
-            *str = virBufferContentAndReset(&buf);
+            str = virBufferContentAndReset(&buf);
         }
         break;
 
@@ -2356,32 +2365,33 @@ qemuBuildNetDevStr(virConnectPtr conn,
                 break;
             }
 
-            if (virAsprintf(str, "socket,%s=%s:%d,id=%s",
+            if (virAsprintf(&str, "socket,%s=%s:%d,id=%s",
                             mode,
                             net->data.socket.address,
                             net->data.socket.port,
                             net->hostnet_name) < 0) {
                 virReportOOMError(conn);
-                return -1;
+                return NULL;
             }
         }
         break;
 
     case VIR_DOMAIN_NET_TYPE_USER:
     default:
-        if (virAsprintf(str, "user,id=%s",
+        if (virAsprintf(&str, "user,id=%s",
                         net->hostnet_name) < 0) {
             virReportOOMError(conn);
-            return -1;
+            return NULL;
         }
         break;
     }
 
-    return 0;
+    return str;
 }
 
 
-static char *qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev)
+char *
+qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -2410,7 +2420,8 @@ error:
 }
 
 
-static char *qemuBuildUSBInputDevStr(virDomainInputDefPtr dev)
+char *
+qemuBuildUSBInputDevStr(virDomainInputDefPtr dev)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -2432,7 +2443,7 @@ error:
 }
 
 
-static char *
+char *
 qemuBuildSoundDevStr(virDomainSoundDefPtr sound)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -2468,7 +2479,7 @@ error:
 }
 
 
-static char *
+char *
 qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -2494,43 +2505,46 @@ error:
     return NULL;
 }
 
+
 /* This function outputs a -chardev command line option which describes only the
  * host side of the character device */
-static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev,
-                                                  virBufferPtr buf)
+char *
+qemuBuildChrChardevStr(virDomainChrDefPtr dev)
 {
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
     bool telnet;
+
     switch(dev->type) {
     case VIR_DOMAIN_CHR_TYPE_NULL:
-        virBufferVSprintf(buf, "null,id=%s", dev->info.alias);
+        virBufferVSprintf(&buf, "null,id=%s", dev->info.alias);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_VC:
-        virBufferVSprintf(buf, "vc,id=%s", dev->info.alias);
+        virBufferVSprintf(&buf, "vc,id=%s", dev->info.alias);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PTY:
-        virBufferVSprintf(buf, "pty,id=%s", dev->info.alias);
+        virBufferVSprintf(&buf, "pty,id=%s", dev->info.alias);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_DEV:
-        virBufferVSprintf(buf, "tty,id=%s,path=%s", dev->info.alias, dev->data.file.path);
+        virBufferVSprintf(&buf, "tty,id=%s,path=%s", dev->info.alias, dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_FILE:
-        virBufferVSprintf(buf, "file,id=%s,path=%s", dev->info.alias, dev->data.file.path);
+        virBufferVSprintf(&buf, "file,id=%s,path=%s", dev->info.alias, dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PIPE:
-        virBufferVSprintf(buf, "pipe,id=%s,path=%s", dev->info.alias, dev->data.file.path);
+        virBufferVSprintf(&buf, "pipe,id=%s,path=%s", dev->info.alias, dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_STDIO:
-        virBufferVSprintf(buf, "stdio,id=%s", dev->info.alias);
+        virBufferVSprintf(&buf, "stdio,id=%s", dev->info.alias);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UDP:
-        virBufferVSprintf(buf,
+        virBufferVSprintf(&buf,
                           "udp,id=%s,host=%s,port=%s,localaddr=%s,localport=%s",
                           dev->info.alias,
                           dev->data.udp.connectHost,
@@ -2541,7 +2555,7 @@ static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev,
 
     case VIR_DOMAIN_CHR_TYPE_TCP:
         telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
-        virBufferVSprintf(buf,
+        virBufferVSprintf(&buf,
                           "socket,id=%s,host=%s,port=%s%s%s",
                           dev->info.alias,
                           dev->data.tcp.host,
@@ -2551,49 +2565,66 @@ static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev,
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UNIX:
-        virBufferVSprintf(buf,
+        virBufferVSprintf(&buf,
                           "socket,id=%s,path=%s%s",
                           dev->info.alias,
                           dev->data.nix.path,
                           dev->data.nix.listen ? ",server,nowait" : "");
         break;
     }
+
+    if (virBufferError(&buf)) {
+        virReportOOMError(NULL);
+        goto error;
+    }
+
+    return virBufferContentAndReset(&buf);
+
+error:
+    virBufferFreeAndReset(&buf);
+    return NULL;
 }
 
-static void qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
-                                           virBufferPtr buf)
+
+char *
+qemuBuildChrArgStr(virDomainChrDefPtr dev, const char *prefix)
 {
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+    if (prefix)
+        virBufferAdd(&buf, prefix, strlen(prefix));
+
     switch (dev->type) {
     case VIR_DOMAIN_CHR_TYPE_NULL:
-        virBufferAddLit(buf, "null");
+        virBufferAddLit(&buf, "null");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_VC:
-        virBufferAddLit(buf, "vc");
+        virBufferAddLit(&buf, "vc");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PTY:
-        virBufferAddLit(buf, "pty");
+        virBufferAddLit(&buf, "pty");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_DEV:
-        virBufferStrcat(buf, dev->data.file.path, NULL);
+        virBufferStrcat(&buf, dev->data.file.path, NULL);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_FILE:
-        virBufferVSprintf(buf, "file:%s", dev->data.file.path);
+        virBufferVSprintf(&buf, "file:%s", dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_PIPE:
-        virBufferVSprintf(buf, "pipe:%s", dev->data.file.path);
+        virBufferVSprintf(&buf, "pipe:%s", dev->data.file.path);
         break;
 
     case VIR_DOMAIN_CHR_TYPE_STDIO:
-        virBufferAddLit(buf, "stdio");
+        virBufferAddLit(&buf, "stdio");
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UDP:
-        virBufferVSprintf(buf, "udp:%s:%s@%s:%s",
+        virBufferVSprintf(&buf, "udp:%s:%s@%s:%s",
                           dev->data.udp.connectHost,
                           dev->data.udp.connectService,
                           dev->data.udp.bindHost,
@@ -2602,12 +2633,12 @@ static void qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
 
     case VIR_DOMAIN_CHR_TYPE_TCP:
         if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
-            virBufferVSprintf(buf, "telnet:%s:%s%s",
+            virBufferVSprintf(&buf, "telnet:%s:%s%s",
                               dev->data.tcp.host,
                               dev->data.tcp.service,
                               dev->data.tcp.listen ? ",server,nowait" : "");
         } else {
-            virBufferVSprintf(buf, "tcp:%s:%s%s",
+            virBufferVSprintf(&buf, "tcp:%s:%s%s",
                               dev->data.tcp.host,
                               dev->data.tcp.service,
                               dev->data.tcp.listen ? ",server,nowait" : "");
@@ -2615,21 +2646,32 @@ static void qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UNIX:
-        virBufferVSprintf(buf, "unix:%s%s",
+        virBufferVSprintf(&buf, "unix:%s%s",
                           dev->data.nix.path,
                           dev->data.nix.listen ? ",server,nowait" : "");
         break;
     }
+
+    if (virBufferError(&buf)) {
+        virReportOOMError(NULL);
+        goto error;
+    }
+
+    return virBufferContentAndReset(&buf);
+
+error:
+    virBufferFreeAndReset(&buf);
+    return NULL;
 }
 
 
 static int
-qemudBuildCommandLineCPU(virConnectPtr conn,
-                         const struct qemud_driver *driver,
-                         const virDomainDefPtr def,
-                         const char *emulator,
-                         const struct utsname *ut,
-                         char **opt)
+qemuBuildCpuArgStr(virConnectPtr conn,
+                   const struct qemud_driver *driver,
+                   const virDomainDefPtr def,
+                   const char *emulator,
+                   const struct utsname *ut,
+                   char **opt)
 {
     const virCPUDefPtr host = driver->caps->host.cpu;
     virCPUDefPtr guest = NULL;
@@ -2715,9 +2757,9 @@ no_memory:
 }
 
 static char *
-qemudBuildCommandLineSmp(virConnectPtr conn,
-                         const virDomainDefPtr def,
-                         int qemuCmdFlags)
+qemuBuildSmpArgStr(virConnectPtr conn,
+                   const virDomainDefPtr def,
+                   int qemuCmdFlags)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -2947,7 +2989,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
         ADD_ARG_LIT(def->os.machine);
     }
 
-    if (qemudBuildCommandLineCPU(conn, driver, def, emulator, &ut, &cpu) < 0)
+    if (qemuBuildCpuArgStr(conn, driver, def, emulator, &ut, &cpu) < 0)
         goto error;
 
     if (cpu) {
@@ -2987,7 +3029,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
     }
 
     ADD_ARG_LIT("-smp");
-    if (!(smp = qemudBuildCommandLineSmp(conn, def, qemuCmdFlags)))
+    if (!(smp = qemuBuildSmpArgStr(conn, def, qemuCmdFlags)))
         goto error;
     ADD_ARG(smp);
 
@@ -3031,25 +3073,14 @@ int qemudBuildCommandLine(virConnectPtr conn,
         ADD_ARG_LIT("-nodefaults");
 
     if (monitor_chr) {
-        virBuffer buf = VIR_BUFFER_INITIALIZER;
-
+        char *chrdev;
         /* Use -chardev if it's available */
         if (qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) {
-            qemudBuildCommandLineChrDevChardevStr(monitor_chr, &buf);
-            if (virBufferError(&buf)) {
-                virBufferFreeAndReset(&buf);
-                goto no_memory;
-            }
 
             ADD_ARG_LIT("-chardev");
-            ADD_ARG(virBufferContentAndReset(&buf));
-
-            virBufferVSprintf(&buf, "chardev=%s", monitor_chr->info.alias);
-
-            if (virBufferError(&buf)) {
-                virBufferFreeAndReset(&buf);
-                goto no_memory;
-            }
+            if (!(chrdev = qemuBuildChrChardevStr(monitor_chr)))
+                goto error;
+            ADD_ARG(chrdev);
 
             ADD_ARG_LIT("-mon");
             if (monitor_json)
@@ -3057,18 +3088,14 @@ int qemudBuildCommandLine(virConnectPtr conn,
             else
                 ADD_ARG_LIT("chardev=monitor,mode=readline");
         } else {
+            const char *prefix = NULL;
             if (monitor_json)
-                virBufferAddLit(&buf, "control,");
-
-            qemudBuildCommandLineChrDevStr(monitor_chr, &buf);
-
-            if (virBufferError(&buf)) {
-                virBufferFreeAndReset(&buf);
-                goto no_memory;
-            }
+                prefix = "control,";
 
             ADD_ARG_LIT("-monitor");
-            ADD_ARG(virBufferContentAndReset(&buf));
+            if (!(chrdev = qemuBuildChrArgStr(monitor_chr, prefix)))
+                goto error;
+            ADD_ARG(chrdev);
         }
     }
 
@@ -3250,7 +3277,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
                 } else {
                     ADD_ARG_LIT("-device");
 
-                    if (qemuBuildDriveDevStr(conn, disk, &optstr) < 0)
+                    if (!(optstr = qemuBuildDriveDevStr(conn, disk)))
                         goto error;
                     ADD_ARG(optstr);
                 }
@@ -3357,7 +3384,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
 
             if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
                 ADD_ARG_LIT("-netdev");
-                if (qemuBuildNetDevStr(conn, net, tapfd_name, &host) < 0)
+                if (!(host = qemuBuildNetDevStr(conn, net, tapfd_name)))
                     goto error;
                 ADD_ARG(host);
 
@@ -3367,13 +3394,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
                 ADD_ARG(nic);
             } else {
                 ADD_ARG_LIT("-net");
-                if (qemuBuildNicStr(conn, net, "nic,", net->vlan, &nic) < 0)
+                if (!(nic = qemuBuildNicStr(conn, net, "nic,", net->vlan)))
                     goto error;
                 ADD_ARG(nic);
 
                 ADD_ARG_LIT("-net");
-                if (qemuBuildHostNetStr(conn, net, ',',
-                                        net->vlan, tapfd_name, &host) < 0)
+                if (!(host = qemuBuildHostNetStr(conn, net, ',',
+                                                 net->vlan, tapfd_name)))
                     goto error;
                 ADD_ARG(host);
             }
@@ -3388,40 +3415,26 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
     } else {
         for (i = 0 ; i < def->nserials ; i++) {
-            virBuffer buf = VIR_BUFFER_INITIALIZER;
             virDomainChrDefPtr serial = def->serials[i];
+            char *devstr;
 
             /* Use -chardev with -device if they are available */
             if ((qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) &&
                 (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
-                qemudBuildCommandLineChrDevChardevStr(serial, &buf);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
-                    goto no_memory;
-                }
-
                 ADD_ARG_LIT("-chardev");
-                ADD_ARG(virBufferContentAndReset(&buf));
-
-                virBufferVSprintf(&buf, "isa-serial,chardev=%s", serial->info.alias);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
-                    goto no_memory;
-                }
+                if (!(devstr = qemuBuildChrChardevStr(serial)))
+                    goto error;
+                ADD_ARG(devstr);
 
                 ADD_ARG_LIT("-device");
-                ADD_ARG(virBufferContentAndReset(&buf));
-            }
-
-            else {
-                qemudBuildCommandLineChrDevStr(serial, &buf);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
+                if (virAsprintf(&devstr, "isa-serial,chardev=%s", serial->info.alias) < 0)
                     goto no_memory;
-                }
-
+                ADD_ARG(devstr);
+            } else {
                 ADD_ARG_LIT("-serial");
-                ADD_ARG(virBufferContentAndReset(&buf));
+                if (!(devstr = qemuBuildChrArgStr(serial, NULL)))
+                    goto error;
+                ADD_ARG(devstr);
             }
         }
     }
@@ -3434,47 +3447,33 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
     } else {
         for (i = 0 ; i < def->nparallels ; i++) {
-            virBuffer buf = VIR_BUFFER_INITIALIZER;
             virDomainChrDefPtr parallel = def->parallels[i];
+            char *devstr;
 
             /* Use -chardev with -device if they are available */
             if ((qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) &&
                 (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
-                qemudBuildCommandLineChrDevChardevStr(parallel, &buf);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
-                    goto no_memory;
-                }
-
                 ADD_ARG_LIT("-chardev");
-                ADD_ARG(virBufferContentAndReset(&buf));
-
-                virBufferVSprintf(&buf, "isa-parallel,chardev=%s", parallel->info.alias);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
-                    goto no_memory;
-                }
+                if (!(devstr = qemuBuildChrChardevStr(parallel)))
+                    goto error;
+                ADD_ARG(devstr);
 
                 ADD_ARG_LIT("-device");
-                ADD_ARG(virBufferContentAndReset(&buf));
-            }
-
-            else {
-                qemudBuildCommandLineChrDevStr(parallel, &buf);
-                if (virBufferError(&buf)) {
-                    virBufferFreeAndReset(&buf);
+                if (virAsprintf(&devstr, "isa-parallel,chardev=%s", parallel->info.alias) < 0)
                     goto no_memory;
-                }
-
+                ADD_ARG(devstr);
+            } else {
                 ADD_ARG_LIT("-parallel");
-                ADD_ARG(virBufferContentAndReset(&buf));
+                if (!(devstr = qemuBuildChrArgStr(parallel, NULL)))
+                      goto error;
+                ADD_ARG(devstr);
             }
         }
     }
 
     for (i = 0 ; i < def->nchannels ; i++) {
-        virBuffer buf = VIR_BUFFER_INITIALIZER;
         virDomainChrDefPtr channel = def->channels[i];
+        char *devstr;
 
         switch(channel->targetType) {
         case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
@@ -3485,30 +3484,22 @@ int qemudBuildCommandLine(virConnectPtr conn,
                 goto error;
             }
 
-            qemudBuildCommandLineChrDevChardevStr(channel, &buf);
-            if (virBufferError(&buf)) {
-                virBufferFreeAndReset(&buf);
-                goto no_memory;
-            }
-
             ADD_ARG_LIT("-chardev");
-            ADD_ARG(virBufferContentAndReset(&buf));
+            if (!(devstr = qemuBuildChrChardevStr(channel)))
+                goto error;
+            ADD_ARG(devstr);
 
-            const char *addr = virSocketFormatAddr(channel->target.addr);
+            char *addr = virSocketFormatAddr(channel->target.addr);
             int port = virSocketGetPort(channel->target.addr);
 
             ADD_ARG_LIT("-netdev");
-            virBufferVSprintf(&buf, "user,guestfwd=tcp:%s:%i,chardev=%s,id=user-%s",
-                              addr, port, channel->info.alias, channel->info.alias);
-
-            VIR_FREE(addr);
-
-            if (virBufferError(&buf)) {
-                virBufferFreeAndReset(&buf);
+            if (virAsprintf(&devstr, "user,guestfwd=tcp:%s:%i,chardev=%s,id=user-%s",
+                            addr, port, channel->info.alias, channel->info.alias) < 0) {
+                VIR_FREE(addr);
                 goto no_memory;
             }
-
-            ADD_ARG(virBufferContentAndReset(&buf));
+            VIR_FREE(addr);
+            ADD_ARG(devstr);
         }
     }
 
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 2530813..b6f128f 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -188,23 +188,51 @@ int         qemudBuildCommandLine       (virConnectPtr conn,
                                          int *ntapfds,
                                          const char *migrateFrom);
 
-int         qemuBuildHostNetStr         (virConnectPtr conn,
-                                         virDomainNetDefPtr net,
-                                         char type_sep,
-                                         int vlan,
-                                         const char *tapfd,
-                                         char **str);
+/* Legacy, pre device support */
+char * qemuBuildHostNetStr(virConnectPtr conn,
+                           virDomainNetDefPtr net,
+                           char type_sep,
+                           int vlan,
+                           const char *tapfd);
 
-int         qemuBuildNicStr             (virConnectPtr conn,
-                                         virDomainNetDefPtr net,
-                                         const char *prefix,
-                                         int vlan,
-                                         char **str);
+/* Current, best practice */
+char * qemuBuildNetDevStr(virConnectPtr conn,
+                          virDomainNetDefPtr net,
+                          const char *tapfd);
+
+
+/* Legacy, pre device support */
+char * qemuBuildNicStr(virConnectPtr conn,
+                       virDomainNetDefPtr net,
+                       const char *prefix,
+                       int vlan);
+
+/* Current, best practice */
+char * qemuBuildNicDevStr(virDomainNetDefPtr net);
+
+/* Both legacy & current support support */
+char *qemuBuildDriveStr(virDomainDiskDefPtr disk,
+                        int bootable,
+                        int qemuCmdFlags);
+
+/* Current, best practice */
+char * qemuBuildDriveDevStr(virConnectPtr conn,
+                            virDomainDiskDefPtr disk);
+/* Current, best practice */
+char * qemuBuildControllerDevStr(virDomainControllerDefPtr def);
+
+char * qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev);
+
+char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev);
+
+char * qemuBuildSoundDevStr(virDomainSoundDefPtr sound);
+
+char * qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev);
+
+char * qemuBuildChrChardevStr(virDomainChrDefPtr dev);
+char * qemuBuildChrArgStr(virDomainChrDefPtr dev, const char *prefix);
 
 
-char *      qemuBuildDriveStr           (virDomainDiskDefPtr disk,
-                                         int bootable,
-                                         int qemuCmdFlags);
 
 int         qemudNetworkIfaceConnect    (virConnectPtr conn,
                                          struct qemud_driver *driver,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 22593bf..b02c275 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5522,8 +5522,8 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
         qemuDomainObjExitMonitorWithDriver(driver, vm);
     }
 
-    if (qemuBuildHostNetStr(conn, net, ' ',
-                            net->vlan, tapfd_name, &netstr) < 0)
+    if (!(netstr = qemuBuildHostNetStr(conn, net, ' ',
+                                       net->vlan, tapfd_name)))
         goto try_tapfd_close;
 
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
@@ -5537,7 +5537,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
         close(tapfd);
     tapfd = -1;
 
-    if (qemuBuildNicStr(conn, net, NULL, net->vlan, &nicstr) < 0)
+    if (!(nicstr = qemuBuildNicStr(conn, net, NULL, net->vlan)))
         goto try_remove;
 
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
-- 
1.6.5.2




More information about the libvir-list mailing list