The basic change here is that the virDrvOpen call (the internal "open" call for drivers) now takes the parsed xmlURIPtr instead of the raw name string.

 typedef virDrvOpenStatus
        (*virDrvOpen)           (virConnectPtr conn,
-                                const char *name,
+                                xmlURIPtr uri,
                                 int flags);

So we avoid the redundant URI parsing which was going on inside all the drivers, and also the ad-hoc "does-it-look-like-a-URI" string comparisons.

That's straightforward enough except that all of the drivers were saving the name string in their private data so that they could implement the virConnectGetURI call. I've changed this so that the name is copied and saved in the main virConnect structure, and virConnectGetURI will return that unless the driver wants to override it.

You need another patch (coming shortly) to allow URIs like xen://localhost (without the trailing slash) to work, which was IIRC the original point of this discussion.

Rich.

--
Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod
Street, Windsor, Berkshire, SL4 1TE, United Kingdom.  Registered in
England and Wales under Company Registration No. 03798903
Index: src/driver.h
===================================================================
RCS file: /data/cvs/libvirt/src/driver.h,v
retrieving revision 1.38
diff -u -p -r1.38 driver.h
--- src/driver.h	15 Oct 2007 21:38:56 -0000	1.38
+++ src/driver.h	16 Oct 2007 09:53:37 -0000
@@ -9,6 +9,8 @@
 #include "libvirt/libvirt.h"
 #include "libvirt/virterror.h"
 
+#include <libxml/uri.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -74,7 +76,7 @@ typedef enum {
 
 typedef virDrvOpenStatus
 	(*virDrvOpen)			(virConnectPtr conn,
-					 const char *name,
+                     xmlURIPtr uri,
 					 int flags);
 typedef int
 	(*virDrvClose)			(virConnectPtr conn);
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/internal.h,v
retrieving revision 1.50
diff -u -p -r1.50 internal.h
--- src/internal.h	29 Sep 2007 18:16:26 -0000	1.50
+++ src/internal.h	16 Oct 2007 09:53:37 -0000
@@ -148,6 +148,7 @@ struct _virConnect {
     virHashTablePtr domains;/* hash table for known domains */
     virHashTablePtr networks;/* hash table for known domains */
     int flags;              /* a set of connection flags */
+    char *name;                 /* connection URI */
 };
 
 /**
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.103
diff -u -p -r1.103 libvirt.c
--- src/libvirt.c	15 Oct 2007 21:38:56 -0000	1.103
+++ src/libvirt.c	16 Oct 2007 09:53:39 -0000
@@ -22,6 +22,7 @@
 
 #include <libxml/parser.h>
 #include <libxml/xpath.h>
+#include <libxml/uri.h>
 
 #include "internal.h"
 #include "driver.h"
@@ -394,6 +395,7 @@ do_open (const char *name, int flags)
 {
     int i, res;
     virConnectPtr ret = NULL;
+    xmlURIPtr uri;
 
     /* Convert NULL or "" to xen:/// for back compat */
     if (!name || name[0] == '\0')
@@ -410,19 +412,28 @@ do_open (const char *name, int flags)
     ret = virGetConnect();
     if (ret == NULL) {
         virLibConnError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
+        return NULL;
+    }
+
+    uri = xmlParseURI (name);
+    if (!uri) {
+        virLibConnError (ret, VIR_ERR_INVALID_ARG,
+                         _("could not parse connection URI"));
         goto failed;
     }
 
-#ifdef ENABLE_DEBUG
-    fprintf (stderr, "libvirt: do_open: proceeding with name=%s\n", name);
-#endif
+    ret->name = strdup (name);
+    if (!ret->name) {
+        virLibConnError (ret, VIR_ERR_NO_MEMORY, "allocating conn->name");
+        goto failed;
+    }
 
     for (i = 0; i < virDriverTabCount; i++) {
 #ifdef ENABLE_DEBUG
         fprintf (stderr, "libvirt: do_open: trying driver %d (%s) ...\n",
                  i, virDriverTab[i]->name);
 #endif
-        res = virDriverTab[i]->open (ret, name, flags);
+        res = virDriverTab[i]->open (ret, uri, flags);
 #ifdef ENABLE_DEBUG
         fprintf (stderr, "libvirt: do_open: driver %d %s returned %s\n",
                  i, virDriverTab[i]->name,
@@ -444,7 +455,7 @@ do_open (const char *name, int flags)
     }
 
     for (i = 0; i < virNetworkDriverTabCount; i++) {
-        res = virNetworkDriverTab[i]->open (ret, name, flags);
+        res = virNetworkDriverTab[i]->open (ret, uri, flags);
 #ifdef ENABLE_DEBUG
         fprintf (stderr, "libvirt: do_open: network driver %d %s returned %s\n",
                  i, virNetworkDriverTab[i]->name,
@@ -468,12 +479,16 @@ do_open (const char *name, int flags)
         ret->flags = VIR_CONNECT_RO;
     }
 
+    xmlFreeURI (uri);
+
     return ret;
 
 failed:
+    if (ret->name) free (ret->name);
     if (ret->driver) ret->driver->close (ret);
+    if (uri) xmlFreeURI(uri);
 	virFreeConnect(ret);
-    return (NULL);
+    return NULL;
 }
 
 /**
@@ -536,6 +551,8 @@ virConnectClose(virConnectPtr conn)
         conn->networkDriver->close (conn);
     conn->driver->close (conn);
 
+    if (conn->name) free (conn->name);
+
     if (virFreeConnect(conn) < 0)
         return (-1);
     return (0);
@@ -666,6 +683,8 @@ virConnectGetHostname (virConnectPtr con
 char *
 virConnectGetURI (virConnectPtr conn)
 {
+    char *name;
+
     DEBUG("conn=%p", conn);
 
     if (!VIR_IS_CONNECT(conn)) {
@@ -673,11 +692,18 @@ virConnectGetURI (virConnectPtr conn)
         return NULL;
     }
 
+    /* Drivers may override getURI, but if they don't then
+     * we provide a default implementation.
+     */
     if (conn->driver->getURI)
         return conn->driver->getURI (conn);
 
-    virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
-    return NULL;
+    name = strdup (conn->name);
+    if (!name) {
+        virLibConnError (conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
+        return NULL;
+    }
+    return name;
 }
 
 /**
Index: src/proxy_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/proxy_internal.c,v
retrieving revision 1.34
diff -u -p -r1.34 proxy_internal.c
--- src/proxy_internal.c	14 Aug 2007 12:29:41 -0000	1.34
+++ src/proxy_internal.c	16 Oct 2007 09:53:40 -0000
@@ -29,7 +29,7 @@
 static int debug = 0;
 
 static int xenProxyClose(virConnectPtr conn);
-static int xenProxyOpen(virConnectPtr conn, const char *name, int flags);
+static int xenProxyOpen(virConnectPtr conn, xmlURIPtr uri, int flags);
 static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
 static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
 static char *xenProxyGetCapabilities(virConnectPtr conn);
@@ -523,7 +523,7 @@ retry:
  * Returns 0 in case of success, and -1 in case of failure
  */
 int
-xenProxyOpen(virConnectPtr conn, const char *name ATTRIBUTE_UNUSED, int flags)
+xenProxyOpen(virConnectPtr conn, xmlURIPtr uri ATTRIBUTE_UNUSED, int flags)
 {
     virProxyPacket req;
     int ret;
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.30
diff -u -p -r1.30 qemu_driver.c
--- src/qemu_driver.c	12 Oct 2007 16:05:44 -0000	1.30
+++ src/qemu_driver.c	16 Oct 2007 09:53:41 -0000
@@ -1376,15 +1376,13 @@ static int qemudMonitorCommand(struct qe
 
 
 static virDrvOpenStatus qemudOpen(virConnectPtr conn,
-                                  const char *name,
+                                  xmlURIPtr uri,
                                   int flags ATTRIBUTE_UNUSED) {
-    xmlURIPtr uri = NULL;
     uid_t uid = getuid();
 
     if (qemu_driver == NULL)
-        return VIR_DRV_OPEN_DECLINED;
+        goto decline;
 
-    uri = xmlParseURI(name);
     if (uri == NULL || uri->scheme == NULL || uri->path == NULL)
         goto decline;
 
@@ -1402,12 +1400,9 @@ static virDrvOpenStatus qemudOpen(virCon
 
     conn->privateData = qemu_driver;
 
-    xmlFreeURI(uri);
     return VIR_DRV_OPEN_SUCCESS;
 
  decline:
-    if (uri != NULL)
-        xmlFreeURI(uri);
     return VIR_DRV_OPEN_DECLINED;    
 }
 
@@ -2403,7 +2398,7 @@ static virNetworkPtr qemudNetworkLookupB
 }
 
 static virDrvOpenStatus qemudOpenNetwork(virConnectPtr conn,
-                                         const char *name ATTRIBUTE_UNUSED,
+                                         xmlURIPtr uri ATTRIBUTE_UNUSED,
                                          int flags ATTRIBUTE_UNUSED) {
     if (!qemu_driver)
         return VIR_DRV_OPEN_DECLINED;
@@ -2672,7 +2667,7 @@ static virDriver qemuDriver = {
     qemudGetType, /* type */
     qemudGetVersion, /* version */
     qemudGetHostname, /* hostname */
-    NULL, /* URI - never called because remote_internal.c answers this */
+    NULL, /* URI  */
     qemudGetMaxVCPUs, /* getMaxVcpus */
     qemudGetNodeInfo, /* nodeGetInfo */
     qemudGetCapabilities, /* getCapabilities */
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.29
diff -u -p -r1.29 remote_internal.c
--- src/remote_internal.c	15 Oct 2007 21:38:56 -0000	1.29
+++ src/remote_internal.c	16 Oct 2007 09:53:44 -0000
@@ -67,7 +67,6 @@ struct private_data {
     gnutls_session_t session;   /* GnuTLS session (if uses_tls != 0). */
     char *type;                 /* Cached return from remoteType. */
     int counter;                /* Generates serial numbers for RPC. */
-    char *uri;                  /* Original (remote) URI. */
     int networkOnly;            /* Only used for network API */
 };
 
@@ -239,15 +238,9 @@ enum virDrvOpenRemoteFlags {
 };
 
 static int
-doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str, int flags)
+doRemoteOpen (virConnectPtr conn, struct private_data *priv,
+              xmlURIPtr uri, int flags)
 {
-    if (!uri_str) return VIR_DRV_OPEN_DECLINED;
-
-    /* We have to parse the URL every time to discover whether
-     * it contains a transport or remote server name.  There's no
-     * way to get around this.
-     */
-    xmlURIPtr uri = xmlParseURI (uri_str);
     if (!uri || !uri->scheme)
         return VIR_DRV_OPEN_DECLINED; /* Decline - not a URL. */
 
@@ -644,13 +637,6 @@ doRemoteOpen (virConnectPtr conn, struct
               (xdrproc_t) xdr_void, (char *) NULL) == -1)
         goto failed;
 
-    /* Duplicate and save the uri_str. */
-    priv->uri = strdup (uri_str);
-    if (!priv->uri) {
-        error (NULL, VIR_ERR_NO_MEMORY, "allocating priv->uri");
-        goto failed;
-    }
-
     /* Successful. */
     retcode = VIR_DRV_OPEN_SUCCESS;
 
@@ -672,7 +658,6 @@ doRemoteOpen (virConnectPtr conn, struct
     }
 
     /* Free up the URL and strings. */
-    xmlFreeURI (uri);
     if (name) free (name);
     if (command) free (command);
     if (sockname) free (sockname);
@@ -693,7 +678,7 @@ doRemoteOpen (virConnectPtr conn, struct
 }
 
 static int
-remoteOpen (virConnectPtr conn, const char *uri_str, int flags)
+remoteOpen (virConnectPtr conn, xmlURIPtr uri, int flags)
 {
     struct private_data *priv = malloc (sizeof(struct private_data));
     int ret, rflags = 0;
@@ -706,10 +691,13 @@ remoteOpen (virConnectPtr conn, const ch
     if (flags & VIR_DRV_OPEN_RO)
         rflags |= VIR_DRV_OPEN_REMOTE_RO;
 
-    if (uri_str) {
-        if (STREQ (uri_str, "qemu:///system")) {
+    if (uri &&
+        uri->scheme && STREQ (uri->scheme, "qemu") &&
+        (!uri->server || STREQ (uri->server, "")) &&
+        uri->path) {
+        if (STREQ (uri->path, "/system")) {
             rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
-        } else if (STREQ (uri_str, "qemu:///session")) {
+        } else if (STREQ (uri->path, "/session")) {
             rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
             if (getuid() > 0) {
                 rflags |= VIR_DRV_OPEN_REMOTE_USER;
@@ -721,7 +709,7 @@ remoteOpen (virConnectPtr conn, const ch
     memset(priv, 0, sizeof(struct private_data));
     priv->magic = DEAD;
     priv->sock = -1;
-    ret = doRemoteOpen(conn, priv, uri_str, rflags);
+    ret = doRemoteOpen(conn, priv, uri, rflags);
     if (ret != VIR_DRV_OPEN_SUCCESS) {
         conn->privateData = NULL;
         free(priv);
@@ -1206,9 +1194,6 @@ doRemoteClose (virConnectPtr conn, struc
     /* See comment for remoteType. */
     if (priv->type) free (priv->type);
 
-    /* Free URI copy. */
-    if (priv->uri) free (priv->uri);
-
     /* Free private data. */
     priv->magic = DEAD;
 
@@ -1308,23 +1293,6 @@ remoteGetHostname (virConnectPtr conn)
     return ret.hostname;
 }
 
-/* This call is unusual because it doesn't go over RPC.  The
- * full URI is known (only) at the client end of the connection.
- */
-static char *
-remoteGetURI (virConnectPtr conn)
-{
-    GET_PRIVATE (conn, NULL);
-    char *str;
-
-    str = strdup (priv->uri);
-    if (str == NULL) {
-        error (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
-        return NULL;
-    }
-    return str;
-}
-
 static int
 remoteGetMaxVcpus (virConnectPtr conn, const char *type)
 {
@@ -2358,7 +2326,7 @@ remoteDomainInterfaceStats (virDomainPtr
 
 static int
 remoteNetworkOpen (virConnectPtr conn,
-                   const char *uri_str,
+                   xmlURIPtr uri,
                    int flags)
 {
     if (conn &&
@@ -2389,7 +2357,7 @@ remoteNetworkOpen (virConnectPtr conn,
         memset(priv, 0, sizeof(struct private_data));
         priv->magic = DEAD;
         priv->sock = -1;
-        ret = doRemoteOpen(conn, priv, uri_str, rflags);
+        ret = doRemoteOpen(conn, priv, uri, rflags);
         if (ret != VIR_DRV_OPEN_SUCCESS) {
             conn->networkPrivateData = NULL;
             free(priv);
@@ -3105,7 +3073,6 @@ static virDriver driver = {
 	.type = remoteType,
 	.version = remoteVersion,
     .getHostname = remoteGetHostname,
-    .getURI = remoteGetURI,
 	.getMaxVcpus = remoteGetMaxVcpus,
 	.nodeGetInfo = remoteNodeGetInfo,
     .getCapabilities = remoteGetCapabilities,
Index: src/test.c
===================================================================
RCS file: /data/cvs/libvirt/src/test.c,v
retrieving revision 1.50
diff -u -p -r1.50 test.c
--- src/test.c	15 Oct 2007 14:32:35 -0000	1.50
+++ src/test.c	16 Oct 2007 09:53:45 -0000
@@ -879,35 +879,23 @@ static int getNetworkIndex(virNetworkPtr
 }
 
 static int testOpen(virConnectPtr conn,
-                    const char *name,
+                    xmlURIPtr uri,
                     int flags ATTRIBUTE_UNUSED)
 {
-    xmlURIPtr uri;
     int ret;
 
-    if (!name)
+    if (!uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    uri = xmlParseURI(name);
-    if (uri == NULL) {
+    if (!uri->scheme || strcmp(uri->scheme, "test") != 0)
         return VIR_DRV_OPEN_DECLINED;
-    }
-
-    if (!uri->scheme || strcmp(uri->scheme, "test") != 0) {
-        xmlFreeURI(uri);
-        return VIR_DRV_OPEN_DECLINED;
-    }
 
     /* Remote driver should handle these. */
-    if (uri->server) {
-        xmlFreeURI(uri);
+    if (uri->server)
         return VIR_DRV_OPEN_DECLINED;
-    }
 
-    if (uri->server) {
-        xmlFreeURI(uri);
+    if (uri->server)
         return VIR_DRV_OPEN_DECLINED;
-    }
 
     /* From this point on, the connection is for us. */
     if (!uri->path
@@ -924,8 +912,6 @@ static int testOpen(virConnectPtr conn,
         ret = testOpenFromFile(conn,
                                uri->path);
 
-    xmlFreeURI(uri);
-
     return (ret);
 }
 
@@ -1655,7 +1641,7 @@ static int testDomainSetSchedulerParams(
 }
 
 static virDrvOpenStatus testOpenNetwork(virConnectPtr conn,
-                                        const char *name ATTRIBUTE_UNUSED,
+                                        xmlURIPtr uri ATTRIBUTE_UNUSED,
                                         int flags ATTRIBUTE_UNUSED) {
     if (STRNEQ(conn->driver->name, "Test"))
         return VIR_DRV_OPEN_DECLINED;
Index: src/xen_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xen_internal.c,v
retrieving revision 1.96
diff -u -p -r1.96 xen_internal.c
--- src/xen_internal.c	29 Sep 2007 18:37:47 -0000	1.96
+++ src/xen_internal.c	16 Oct 2007 09:53:47 -0000
@@ -2151,7 +2151,7 @@ xenHypervisorInit(void)
  */
 int
 xenHypervisorOpen(virConnectPtr conn,
-                  const char *name ATTRIBUTE_UNUSED,
+                  xmlURIPtr uri ATTRIBUTE_UNUSED,
                   int flags ATTRIBUTE_UNUSED)
 {
     int ret;
Index: src/xen_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xen_internal.h,v
retrieving revision 1.24
diff -u -p -r1.24 xen_internal.h
--- src/xen_internal.h	28 Sep 2007 14:28:13 -0000	1.24
+++ src/xen_internal.h	16 Oct 2007 09:53:47 -0000
@@ -30,7 +30,7 @@ char *
         xenHypervisorDomainGetOSType (virDomainPtr dom);
 
 int	xenHypervisorOpen		(virConnectPtr conn,
-					 const char *name,
+					 xmlURIPtr uri,
 					 int flags);
 int	xenHypervisorClose		(virConnectPtr conn);
 int	xenHypervisorGetVersion		(virConnectPtr conn,
Index: src/xen_unified.c
===================================================================
RCS file: /data/cvs/libvirt/src/xen_unified.c,v
retrieving revision 1.24
diff -u -p -r1.24 xen_unified.c
--- src/xen_unified.c	15 Oct 2007 21:38:56 -0000	1.24
+++ src/xen_unified.c	16 Oct 2007 09:53:48 -0000
@@ -76,42 +76,28 @@ xenUnifiedError (virConnectPtr conn, vir
  */
 
 static int
-xenUnifiedOpen (virConnectPtr conn, const char *name, int flags)
+xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, int flags)
 {
     int i, j;
     xenUnifiedPrivatePtr priv;
-    xmlURIPtr uri;
-
-    uri = xmlParseURI(name);
-    if (uri == NULL) {
-        return VIR_DRV_OPEN_DECLINED;
-    }
 
     /* Refuse any scheme which isn't "xen://" or "http://";. */
     if (uri->scheme &&
         strcasecmp(uri->scheme, "xen") != 0 &&
-        strcasecmp(uri->scheme, "http") != 0) {
-        xmlFreeURI(uri);
+        strcasecmp(uri->scheme, "http") != 0)
         return VIR_DRV_OPEN_DECLINED;
-    }
 
     /* xmlParseURI will parse a naked string like "foo" as a URI with
      * a NULL scheme.  That's not useful for us because we want to only
      * allow full pathnames (eg. ///var/lib/xen/xend-socket).  Decline
      * anything else.
      */
-    if (!uri->scheme && name[0] != '/') {
-        xmlFreeURI(uri);
+    if (!uri->scheme || !uri->path || uri->path[0] != '/')
         return VIR_DRV_OPEN_DECLINED;
-    }
 
     /* Refuse any xen:// URI with a server specified - allow remote to do it */
-    if (uri->scheme && strcasecmp(uri->scheme, "xen") == 0 && uri->server) {
-        xmlFreeURI(uri);
+    if (uri->scheme && strcasecmp(uri->scheme, "xen") == 0 && uri->server)
         return VIR_DRV_OPEN_DECLINED;
-    }
-
-    xmlFreeURI(uri);
 
     /* Allocate per-connection private data. */
     priv = calloc (1, sizeof *priv);
@@ -121,13 +107,6 @@ xenUnifiedOpen (virConnectPtr conn, cons
     }
     conn->privateData = priv;
 
-    priv->name = strdup (name);
-    if (!priv->name) {
-        xenUnifiedError (NULL, VIR_ERR_NO_MEMORY, "allocating priv->name");
-        free (priv);
-        return VIR_DRV_OPEN_ERROR;
-    }
-
     priv->handle = -1;
     priv->xendConfigVersion = -1;
     priv->type = -1;
@@ -152,7 +131,7 @@ xenUnifiedOpen (virConnectPtr conn, cons
 #ifdef ENABLE_DEBUG
             fprintf (stderr, "libvirt: xenUnifiedOpen: trying Xen sub-driver %d\n", i);
 #endif
-            if (drivers[i]->open (conn, name, flags) == VIR_DRV_OPEN_SUCCESS)
+            if (drivers[i]->open (conn, uri, flags) == VIR_DRV_OPEN_SUCCESS)
                 priv->opened[i] = 1;
 #ifdef ENABLE_DEBUG
             fprintf (stderr, "libvirt: xenUnifiedOpen: Xen sub-driver %d open %s\n",
@@ -166,7 +145,6 @@ xenUnifiedOpen (virConnectPtr conn, cons
             (getuid() == 0 || i == XEN_UNIFIED_PROXY_OFFSET)) {
             for (j = 0; j < i; ++j)
                 if (priv->opened[j]) drivers[j]->close (conn);
-            free (priv->name);
             free (priv);
             /* The assumption is that one of the underlying drivers
              * has set virterror already.
@@ -191,7 +169,6 @@ xenUnifiedClose (virConnectPtr conn)
         if (priv->opened[i] && drivers[i]->close)
             (void) drivers[i]->close (conn);
 
-    free (priv->name);
     free (conn->privateData);
     conn->privateData = NULL;
 
@@ -261,21 +238,6 @@ xenUnifiedGetHostname (virConnectPtr con
     return str;
 }
 
-/* The name is recorded (canonicalised) in xenUnifiedOpen. */
-static char *
-xenUnifiedGetURI (virConnectPtr conn)
-{
-    GET_PRIVATE(conn);
-    char *str;
-
-    str = strdup (priv->name);
-    if (str == NULL) {
-        xenUnifiedError (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
-        return NULL;
-    }
-    return str;
-}
-
 static int
 xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
 {
@@ -1103,7 +1065,6 @@ static virDriver xenUnifiedDriver = {
     .type 			= xenUnifiedType,
     .version 			= xenUnifiedVersion,
     .getHostname    = xenUnifiedGetHostname,
-    .getURI         = xenUnifiedGetURI,
     .getMaxVcpus 			= xenUnifiedGetMaxVcpus,
     .nodeGetInfo 			= xenUnifiedNodeGetInfo,
     .getCapabilities 		= xenUnifiedGetCapabilities,
Index: src/xen_unified.h
===================================================================
RCS file: /data/cvs/libvirt/src/xen_unified.h,v
retrieving revision 1.5
diff -u -p -r1.5 xen_unified.h
--- src/xen_unified.h	6 Jul 2007 15:11:22 -0000	1.5
+++ src/xen_unified.h	16 Oct 2007 09:53:48 -0000
@@ -109,9 +109,6 @@ struct _xenUnifiedPrivate {
      * xen_unified.c.
      */
     int opened[XEN_UNIFIED_NR_DRIVERS];
-
-    /* Canonical URI. */
-    char *name;
 };
 
 typedef struct _xenUnifiedPrivate *xenUnifiedPrivatePtr;
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.148
diff -u -p -r1.148 xend_internal.c
--- src/xend_internal.c	15 Oct 2007 21:38:56 -0000	1.148
+++ src/xend_internal.c	16 Oct 2007 09:53:50 -0000
@@ -2172,18 +2172,29 @@ error:
  * Returns 0 in case of success, -1 in case of error.
  */
 int
-xenDaemonOpen(virConnectPtr conn, const char *name,
+xenDaemonOpen(virConnectPtr conn, xmlURIPtr uri,
               int flags ATTRIBUTE_UNUSED)
 {
-    xmlURIPtr uri = NULL;
     int ret;
-     
-    /* If the name is just "xen" (it might originally have been NULL,
-     * see xenUnifiedOpen) or any URI beginning with "xen:///" then
-     * try default paths and methods to get to the xend socket.
+
+    /* Switch on the scheme, which we expect to be NULL (file),
+     * "http" or "xen".
      */
-    if (strcasecmp (name, "xen") == 0 ||
-        strncasecmp (name, "xen:///", 7) == 0) {
+    if (uri->scheme == NULL) {
+        /* It should be a file access */
+        if (uri->path == NULL) {
+            virXendError(NULL, VIR_ERR_NO_CONNECT, __FUNCTION__);
+            goto failed;
+        }
+        ret = xenDaemonOpen_unix(conn, uri->path);
+        if (ret < 0)
+            goto failed;
+
+        ret = xend_detect_config_version(conn);
+        if (ret == -1)
+            goto failed;
+    }
+    else if (STRCASEEQ (uri->scheme, "xen")) {
         /*
          * try first to open the unix socket
          */
@@ -2204,50 +2215,22 @@ xenDaemonOpen(virConnectPtr conn, const 
         ret = xend_detect_config_version(conn);
         if (ret == -1)
             goto failed;
-    } else {
-        /*
-         * We were given a connection name, expected to be an URL
-         */
-        uri = xmlParseURI(name);
-        if (uri == NULL) {
-            virXendError(NULL, VIR_ERR_NO_CONNECT, name);
+    } else if (STRCASEEQ (uri->scheme, "http")) {
+        ret = xenDaemonOpen_tcp(conn, uri->server, uri->port);
+        if (ret < 0)
             goto failed;
-        }
-
-        if (uri->scheme == NULL) {
-            /* It should be a file access */
-            if (uri->path == NULL) {
-                virXendError(NULL, VIR_ERR_NO_CONNECT, name);
-                goto failed;
-            }
-            ret = xenDaemonOpen_unix(conn, uri->path);
-            if (ret < 0)
-                goto failed;
-
-            ret = xend_detect_config_version(conn);
-            if (ret == -1)
-                goto failed;
-        } else if (!strcasecmp(uri->scheme, "http")) {
-            ret = xenDaemonOpen_tcp(conn, uri->server, uri->port);
-            if (ret < 0)
-                goto failed;
-            ret = xend_detect_config_version(conn);
-            if (ret == -1)
-                goto failed;
-        } else {
-            virXendError(NULL, VIR_ERR_NO_CONNECT, name);
+        ret = xend_detect_config_version(conn);
+        if (ret == -1)
             goto failed;
-        }
+    } else {
+        virXendError(NULL, VIR_ERR_NO_CONNECT, __FUNCTION__);
+        goto failed;
     }
 
  done:
-    if (uri != NULL)
-        xmlFreeURI(uri);
     return(ret);
 
 failed:
-    if (uri != NULL)
-        xmlFreeURI(uri);
     return(-1);
 }
 
Index: src/xend_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.h,v
retrieving revision 1.34
diff -u -p -r1.34 xend_internal.h
--- src/xend_internal.h	30 Sep 2007 13:09:07 -0000	1.34
+++ src/xend_internal.h	16 Oct 2007 09:53:50 -0000
@@ -181,7 +181,7 @@ char *xenDaemonDomainDumpXMLByName(virCo
   char *xend_parse_domain_sexp(virConnectPtr conn,  char *root, int xendConfigVersion);
 
 /* refactored ones */
-int xenDaemonOpen(virConnectPtr conn, const char *name, int flags);
+int xenDaemonOpen(virConnectPtr conn, xmlURIPtr uri, int flags);
 int xenDaemonClose(virConnectPtr conn);
 int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer);
 int xenDaemonNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
Index: src/xm_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xm_internal.c,v
retrieving revision 1.41
diff -u -p -r1.41 xm_internal.c
--- src/xm_internal.c	10 Oct 2007 17:55:38 -0000	1.41
+++ src/xm_internal.c	16 Oct 2007 09:53:52 -0000
@@ -471,7 +471,7 @@ static int xenXMConfigCacheRefresh (virC
  */
 int
 xenXMOpen (virConnectPtr conn ATTRIBUTE_UNUSED,
-           const char *name ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED)
+           xmlURIPtr uri ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED)
 {
     if (configCache == NULL) {
         configCache = virHashCreate(50);
Index: src/xm_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xm_internal.h,v
retrieving revision 1.5
diff -u -p -r1.5 xm_internal.h
--- src/xm_internal.h	6 Jul 2007 15:11:22 -0000	1.5
+++ src/xm_internal.h	16 Oct 2007 09:53:52 -0000
@@ -36,7 +36,7 @@ extern "C" {
 extern struct xenUnifiedDriver xenXMDriver;
 int xenXMInit (void);
 
-int xenXMOpen(virConnectPtr conn, const char *name, int flags);
+int xenXMOpen(virConnectPtr conn, xmlURIPtr uri, int flags);
 int xenXMClose(virConnectPtr conn);
 const char *xenXMGetType(virConnectPtr conn);
 int xenXMDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
Index: src/xs_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.c,v
retrieving revision 1.49
diff -u -p -r1.49 xs_internal.c
--- src/xs_internal.c	29 Sep 2007 18:37:47 -0000	1.49
+++ src/xs_internal.c	16 Oct 2007 09:53:52 -0000
@@ -327,7 +327,7 @@ virConnectCheckStoreID(virConnectPtr con
  */
 int
 xenStoreOpen(virConnectPtr conn,
-             const char *name ATTRIBUTE_UNUSED,
+             xmlURIPtr uri ATTRIBUTE_UNUSED,
              int flags ATTRIBUTE_UNUSED)
 {
     xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
Index: src/xs_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.h,v
retrieving revision 1.11
diff -u -p -r1.11 xs_internal.h
--- src/xs_internal.h	10 Aug 2007 18:25:15 -0000	1.11
+++ src/xs_internal.h	16 Oct 2007 09:53:52 -0000
@@ -21,7 +21,7 @@ extern struct xenUnifiedDriver xenStoreD
 int xenStoreInit (void);
 
 int		xenStoreOpen		(virConnectPtr conn,
-					 const char *name,
+					 xmlURIPtr uri,
 					 int flags);
 int		xenStoreClose		(virConnectPtr conn);
 int		xenStoreGetDomainInfo	(virDomainPtr domain,

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

--
Libvir-list mailing list
Libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to