[Pkg-libvirt-commits] [SCM] Libguestfs Debian packaging branch, experimental, updated. debian/1%1.21.40-1

Richard W.M. Jones rjones at redhat.com
Sat Jun 1 11:04:39 UTC 2013


The following commit has been merged in the experimental branch:
commit 914d3e68ec272436f91080f47ddfe4db8f1d8751
Author: Richard W.M. Jones <rjones at redhat.com>
Date:   Sat May 11 13:23:48 2013 +0100

    drives: Use libxml2 to construct safely quoted URIs for qemu.

diff --git a/src/drives.c b/src/drives.c
index 4067464..b52d8df 100644
--- a/src/drives.c
+++ b/src/drives.c
@@ -36,6 +36,8 @@
 
 #include <pcre.h>
 
+#include <libxml/uri.h>
+
 #include "c-ctype.h"
 #include "ignore-value.h"
 
@@ -1124,6 +1126,30 @@ guestfs___copy_drive_source (guestfs_h *g,
   }
 }
 
+static char *
+make_uri (guestfs_h *g, const char *scheme, const char *user,
+          struct drive_server *server, const char *path)
+{
+  xmlURI uri = { .scheme = (char *) scheme,
+                 .path = (char *) path,
+                 .user = (char *) user };
+  CLEANUP_FREE char *query = NULL;
+
+  switch (server->transport) {
+  case drive_transport_none:
+  case drive_transport_tcp:
+    uri.server = server->u.hostname;
+    uri.port = server->port;
+    break;
+  case drive_transport_unix:
+    query = safe_asprintf (g, "socket=%s", server->u.socket);
+    uri.query_raw = query;
+    break;
+  }
+
+  return (char *) xmlSaveUri (&uri);
+}
+
 char *
 guestfs___drive_source_qemu_param (guestfs_h *g, const struct drive_source *src)
 {
@@ -1138,37 +1164,16 @@ guestfs___drive_source_qemu_param (guestfs_h *g, const struct drive_source *src)
   case drive_protocol_gluster:
     switch (src->servers[0].transport) {
     case drive_transport_none:
-      /* XXX quoting */
-      return safe_asprintf (g, "gluster://%s:%d/%s",
-                            src->servers[0].u.hostname, src->servers[0].port,
-                            src->u.exportname);
+      return make_uri (g, "gluster", NULL, &src->servers[0], src->u.exportname);
     case drive_transport_tcp:
-      /* XXX quoting */
-      return safe_asprintf (g, "gluster+tcp://%s:%d/%s",
-                            src->servers[0].u.hostname, src->servers[0].port,
-                            src->u.exportname);
+      return make_uri (g, "gluster+tcp",
+                       NULL, &src->servers[0], src->u.exportname);
     case drive_transport_unix:
-      /* XXX quoting */
-      return safe_asprintf (g, "gluster+unix:///%s?socket=%s",
-                            src->u.exportname, src->servers[0].u.socket);
+      return make_uri (g, "gluster+unix", NULL, &src->servers[0], NULL);
     }
 
-  case drive_protocol_iscsi: {
-    char *ret;
-
-    /* XXX quoting */
-    if (src->servers[0].port == 0)
-      ret = safe_asprintf (g, "iscsi://%s/%s",
-                           src->servers[0].u.hostname,
-                           src->u.exportname);
-    else
-      ret = safe_asprintf (g, "iscsi://%s:%d/%s",
-                           src->servers[0].u.hostname,
-                           src->servers[0].port,
-                           src->u.exportname);
-
-    return ret;
-  }
+  case drive_protocol_iscsi:
+    return make_uri (g, "iscsi", NULL, &src->servers[0], src->u.exportname);
 
   case drive_protocol_nbd: {
     CLEANUP_FREE char *p = NULL;
@@ -1252,20 +1257,9 @@ guestfs___drive_source_qemu_param (guestfs_h *g, const struct drive_source *src)
                             src->servers[0].u.hostname, src->servers[0].port,
                             src->u.exportname);
 
-  case drive_protocol_ssh: {
-    CLEANUP_FREE char *username = NULL, *port = NULL;
-
-    if (src->username)
-      username = safe_asprintf (g, "%s@", src->username);
-    if (src->servers[0].port != 0)
-      port = safe_asprintf (g, ":%d", src->servers[0].port);
-
-    return safe_asprintf (g, "ssh://%s%s%s/%s",
-                          username ? username : "",
-                          src->servers[0].u.hostname,
-                          port ? port : "",
-                          src->u.exportname);
-  }
+  case drive_protocol_ssh:
+    return make_uri (g, "ssh", src->username,
+                     &src->servers[0], src->u.exportname);
   }
 
   abort ();

-- 
Libguestfs Debian packaging



More information about the Pkg-libvirt-commits mailing list