[libvirt] [PATCH 05/11] Switch the virsh XML generation to use virBuffer instead of virAsprintf

Daniel P. Berrange berrange at redhat.com
Fri Nov 12 16:22:38 UTC 2010


The code generating XML for storage pool source discovery is
hardcoded to only allow a hostname and optional port number.
Refactor this code to make it easier to add support for extra
parameters.

* tools/virsh.c: Refactor XML generator
---
 tools/virsh.c |   26 ++++++++++----------------
 1 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index d15a8df..6fc1b47 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -5767,7 +5767,6 @@ cmdPoolDiscoverSourcesAs(vshControl * ctl, const vshCmd * cmd ATTRIBUTE_UNUSED)
     if (host) {
         size_t hostlen = strlen(host);
         char *port = vshCommandOptString(cmd, "port", &found);
-        int ret;
         if (!found) {
             port = strrchr(host, ':');
             if (port) {
@@ -5777,23 +5776,18 @@ cmdPoolDiscoverSourcesAs(vshControl * ctl, const vshCmd * cmd ATTRIBUTE_UNUSED)
                     port = NULL;
             }
         }
-        ret = port ?
-            virAsprintf(&srcSpec,
-                        "<source><host name='%.*s' port='%s'/></source>",
-                        (int)hostlen, host, port) :
-            virAsprintf(&srcSpec,
-                        "<source><host name='%.*s'/></source>",
-                        (int)hostlen, host);
-        if (ret < 0) {
-            switch (errno) {
-            case ENOMEM:
-                vshError(ctl, "%s", _("Out of memory"));
-                break;
-            default:
-                vshError(ctl, _("virAsprintf failed (errno %d)"), errno);
-            }
+        virBuffer buf = VIR_BUFFER_INITIALIZER;
+        virBufferAddLit(&buf, "<source>\n");
+        virBufferVSprintf(&buf, "  <host name='%.*s'",(int)hostlen, host);
+        if (port)
+            virBufferVSprintf(&buf, " port='%s'", port);
+        virBufferAddLit(&buf, "/>\n");
+        virBufferAddLit(&buf, "</source>\n");
+        if (virBufferError(&buf)) {
+            vshError(ctl, "%s", _("Out of memory"));
             return FALSE;
         }
+        srcSpec = virBufferContentAndReset(&buf);
     }
 
     srcList = virConnectFindStoragePoolSources(ctl->conn, type, srcSpec, 0);
-- 
1.7.2.3




More information about the libvir-list mailing list