diff -r 0121f12aeb0e src/libvirt.c --- a/src/libvirt.c Tue Jun 19 21:15:44 2007 -0400 +++ b/src/libvirt.c Tue Jun 19 22:05:43 2007 -0400 @@ -67,9 +67,6 @@ virInitialize(void) * Note that the order is important: the first ones have a higher * priority when calling virConnectOpen. */ -#ifdef WITH_REMOTE - if (remoteRegister () == -1) return -1; -#endif #ifdef WITH_TEST if (testRegister() == -1) return -1; #endif @@ -78,6 +75,9 @@ virInitialize(void) #endif #ifdef WITH_XEN if (xenUnifiedRegister () == -1) return -1; +#endif +#ifdef WITH_REMOTE + if (remoteRegister () == -1) return -1; #endif return(0); diff -r 0121f12aeb0e src/test.c --- a/src/test.c Tue Jun 19 21:15:44 2007 -0400 +++ b/src/test.c Tue Jun 19 22:00:39 2007 -0400 @@ -730,6 +730,11 @@ int testOpen(virConnectPtr conn, return VIR_DRV_OPEN_DECLINED; } + if (uri->server) { + xmlFreeURI(uri); + return VIR_DRV_OPEN_DECLINED; + } + /* From this point on, the connection is for us. */ if (!uri->path || uri->path[0] == '\0' diff -r 0121f12aeb0e src/xen_unified.c --- a/src/xen_unified.c Tue Jun 19 21:15:44 2007 -0400 +++ b/src/xen_unified.c Tue Jun 19 22:04:50 2007 -0400 @@ -30,6 +30,7 @@ #include #include #include +#include #include "internal.h" @@ -86,12 +87,36 @@ xenUnifiedOpen (virConnectPtr conn, cons { int i, j; xenUnifiedPrivatePtr priv; - - /* If name == NULL, name == "", or begins with "xen", then it's for us. */ + xmlURIPtr uri; + + /* Convert NULL or "" to xen:// for back compat */ if (!name || name[0] == '\0') - name = "Xen"; - if (strncasecmp (name, "Xen", 3) != 0) + name = "xen:///"; + + /* Convert xen -> xen:/// for back compat */ + if (!strcasecmp(name, "xen")) + name = "xen:///"; + + uri = xmlParseURI(name); + if (uri == NULL) { + xenUnifiedError(NULL, VIR_ERR_NO_SUPPORT, name); return VIR_DRV_OPEN_DECLINED; + } + + /* Refuse any URI which doesn't start xen:///, / or http:// */ + if (uri->scheme && + strcasecmp(uri->scheme, "xen") != 0 && + strcasecmp(uri->scheme, "http")) { + xmlFreeURI(uri); + 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") && uri->server) { + xmlFreeURI(uri); + return VIR_DRV_OPEN_DECLINED; + } + xmlFreeURI(uri); /* Allocate per-connection private data. */ priv = malloc (sizeof *priv);