]> xenbits.xensource.com Git - libvirt.git/commitdiff
Push URI probing logic down into individual drivers
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Nov 2008 11:44:51 +0000 (11:44 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Nov 2008 11:44:51 +0000 (11:44 +0000)
30 files changed:
ChangeLog
proxy/libvirt_proxy.c
qemud/remote.c
qemud/remote_dispatch_localvars.h
qemud/remote_dispatch_proc_switch.h
qemud/remote_dispatch_prototypes.h
qemud/remote_protocol.c
qemud/remote_protocol.h
qemud/remote_protocol.x
src/datatypes.c
src/datatypes.h
src/driver.h
src/libvirt.c
src/lxc_driver.c
src/network_driver.c
src/openvz_driver.c
src/proxy_internal.c
src/qemu_driver.c
src/remote_internal.c
src/storage_driver.c
src/test.c
src/xen_internal.c
src/xen_internal.h
src/xen_unified.c
src/xend_internal.c
src/xend_internal.h
src/xm_internal.c
src/xm_internal.h
src/xs_internal.c
src/xs_internal.h

index b1f92a91c149a6d9cf32aebd133fd59763e43b4d..0496516b6e086133c6fd029b7ef06e0f3f5600d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+Mon Nov 17 11:40:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
+
+       Push URI probing down into individual drivers' open methods
+       * qemud/remote.c: Implement virConnectGetURI dispatcher
+       * qemud/remote_protocol.x: Add API definition for virConnectGetURI
+       * qemud/remote_dispatch_localvars.h, qemud/remote_dispatch_proc_switch.h,
+       qemud/remote_dispatch_prototypes.h, qemud/remote_protocol.c,
+       qemud/remote_protocol.h: Re-generate from protocol definition
+       * src/datatypes.c, src/datatypes.h: Store connection name as a
+       xmlURIPtr object instead of char *
+       * src/driver.h: Remove explicit URI parameter to open function
+       * src/libvirt.c: Delegrate URI probing into drivers
+       * src/lxc_driver.c, src/network_driver.c, src/openvz_driver.c,
+       src/proxy_internal.c, src/qemu_driver.c, src/remote_internal.c,
+       src/storage_driver.c, src/test.c, src/xen_internal.c,
+       src/xen_internal.h, src/xen_unified.c, src/xend_internal.c,
+       src/xend_internal.h, src/xm_internal.c, src/xm_internal.h,
+       src/xs_internal.c, src/xs_internal.h: Refactor open driver
+       methods to deal with automatic URI probing as required
+       * proxy/libvirt_proxy.c: Remove extra args to xs/xen driver
+       open calls
+
 Mon Nov 17 11:19:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
 
        Refactor storage backend to remove dependancy from
index b9de42534d31c764ddd17cd54b03982a3ca7ddaf..3b0dc42d95fb343b920c0a2d7f4164b0b3eae348 100644 (file)
@@ -82,7 +82,7 @@ proxyInitXen(void) {
     priv->xshandle = NULL;
     priv->proxy = -1;
 
-    ret = xenHypervisorOpen(conn, NULL, NULL, 0);
+    ret = xenHypervisorOpen(conn, NULL, 0);
     if (ret < 0) {
         fprintf(stderr, "Failed to open Xen hypervisor\n");
         return(-1);
@@ -98,7 +98,7 @@ proxyInitXen(void) {
         fprintf(stderr, "Failed to connect to Xen daemon\n");
         return(-1);
     }
-    ret = xenStoreOpen(conn, NULL, NULL, VIR_CONNECT_RO);
+    ret = xenStoreOpen(conn, NULL, VIR_CONNECT_RO);
     if (ret < 0) {
         fprintf(stderr, "Failed to open XenStore connection");
         return (-1);
index a3dd7ecba5c2f38479410508b0a322c6710d457b..035c9e231493784193cd2f7c9b71a541e171e03f 100644 (file)
@@ -550,6 +550,23 @@ remoteDispatchGetHostname (struct qemud_server *server ATTRIBUTE_UNUSED,
     return 0;
 }
 
+static int
+remoteDispatchGetUri (struct qemud_server *server ATTRIBUTE_UNUSED,
+                      struct qemud_client *client,
+                      remote_message_header *req,
+                      void *args ATTRIBUTE_UNUSED,
+                      remote_get_uri_ret *ret)
+{
+    char *uri;
+    CHECK_CONN(client);
+
+    uri = virConnectGetURI (client->conn);
+    if (uri == NULL) return -1;
+
+    ret->uri = uri;
+    return 0;
+}
+
 static int
 remoteDispatchGetMaxVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
                            struct qemud_client *client,
index a669dd8e49754be98f80cf93b6db23a03a67b574..84134dfc8930e8f5f771a082901aefc650c4dae1 100644 (file)
@@ -142,6 +142,7 @@ remote_storage_vol_get_path_args lv_remote_storage_vol_get_path_args;
 remote_storage_vol_get_path_ret lv_remote_storage_vol_get_path_ret;
 remote_domain_lookup_by_id_args lv_remote_domain_lookup_by_id_args;
 remote_domain_lookup_by_id_ret lv_remote_domain_lookup_by_id_ret;
+remote_get_uri_ret lv_remote_get_uri_ret;
 remote_domain_attach_device_args lv_remote_domain_attach_device_args;
 remote_num_of_networks_ret lv_remote_num_of_networks_ret;
 remote_storage_pool_get_info_args lv_remote_storage_pool_get_info_args;
index 30193ef630e965b318a06e863b84aa56c8e1302c..3c788a47de8bae0c346f7027a0451b13df738705 100644 (file)
@@ -407,6 +407,12 @@ case REMOTE_PROC_GET_TYPE:
         ret = (char *) &lv_remote_get_type_ret;
         memset (&lv_remote_get_type_ret, 0, sizeof lv_remote_get_type_ret);
         break;
+case REMOTE_PROC_GET_URI:
+        fn = (dispatch_fn) remoteDispatchGetUri;
+        ret_filter = (xdrproc_t) xdr_remote_get_uri_ret;
+        ret = (char *) &lv_remote_get_uri_ret;
+        memset (&lv_remote_get_uri_ret, 0, sizeof lv_remote_get_uri_ret);
+        break;
 case REMOTE_PROC_GET_VERSION:
         fn = (dispatch_fn) remoteDispatchGetVersion;
         ret_filter = (xdrproc_t) xdr_remote_get_version_ret;
index e949ed9ea9e0749334989a5459aac762bb095f77..ae504169631b6ee0218df95ca16a74f00a201875 100644 (file)
@@ -57,6 +57,7 @@ static int remoteDispatchGetCapabilities (struct qemud_server *server, struct qe
 static int remoteDispatchGetHostname (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_hostname_ret *ret);
 static int remoteDispatchGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_get_max_vcpus_args *args, remote_get_max_vcpus_ret *ret);
 static int remoteDispatchGetType (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_type_ret *ret);
+static int remoteDispatchGetUri (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_uri_ret *ret);
 static int remoteDispatchGetVersion (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_version_ret *ret);
 static int remoteDispatchListDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_defined_domains_args *args, remote_list_defined_domains_ret *ret);
 static int remoteDispatchListDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_defined_networks_args *args, remote_list_defined_networks_ret *ret);
index 5ee58c1c499f0b4af9b3091a45812d89071727b6..5e573fe878bdf4ed3683114b7acf09cfa11705e7 100644 (file)
@@ -275,6 +275,15 @@ xdr_remote_get_hostname_ret (XDR *xdrs, remote_get_hostname_ret *objp)
         return TRUE;
 }
 
+bool_t
+xdr_remote_get_uri_ret (XDR *xdrs, remote_get_uri_ret *objp)
+{
+
+         if (!xdr_remote_nonnull_string (xdrs, &objp->uri))
+                 return FALSE;
+        return TRUE;
+}
+
 bool_t
 xdr_remote_get_max_vcpus_args (XDR *xdrs, remote_get_max_vcpus_args *objp)
 {
index 52151166c6fe91cbdcf936b16418955457b5f2fd..a0e8a9df568f2e1fad7a0a6bfd7687cebccf3f20 100644 (file)
@@ -154,6 +154,11 @@ struct remote_get_hostname_ret {
 };
 typedef struct remote_get_hostname_ret remote_get_hostname_ret;
 
+struct remote_get_uri_ret {
+        remote_nonnull_string uri;
+};
+typedef struct remote_get_uri_ret remote_get_uri_ret;
+
 struct remote_get_max_vcpus_args {
         remote_string type;
 };
@@ -1245,6 +1250,7 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_EVENT = 107,
         REMOTE_PROC_DOMAIN_MIGRATE_PREPARE2 = 108,
         REMOTE_PROC_DOMAIN_MIGRATE_FINISH2 = 109,
+        REMOTE_PROC_GET_URI = 110,
 };
 typedef enum remote_procedure remote_procedure;
 
@@ -1297,6 +1303,7 @@ extern  bool_t xdr_remote_supports_feature_ret (XDR *, remote_supports_feature_r
 extern  bool_t xdr_remote_get_type_ret (XDR *, remote_get_type_ret*);
 extern  bool_t xdr_remote_get_version_ret (XDR *, remote_get_version_ret*);
 extern  bool_t xdr_remote_get_hostname_ret (XDR *, remote_get_hostname_ret*);
+extern  bool_t xdr_remote_get_uri_ret (XDR *, remote_get_uri_ret*);
 extern  bool_t xdr_remote_get_max_vcpus_args (XDR *, remote_get_max_vcpus_args*);
 extern  bool_t xdr_remote_get_max_vcpus_ret (XDR *, remote_get_max_vcpus_ret*);
 extern  bool_t xdr_remote_node_get_info_ret (XDR *, remote_node_get_info_ret*);
@@ -1485,6 +1492,7 @@ extern bool_t xdr_remote_supports_feature_ret ();
 extern bool_t xdr_remote_get_type_ret ();
 extern bool_t xdr_remote_get_version_ret ();
 extern bool_t xdr_remote_get_hostname_ret ();
+extern bool_t xdr_remote_get_uri_ret ();
 extern bool_t xdr_remote_get_max_vcpus_args ();
 extern bool_t xdr_remote_get_max_vcpus_ret ();
 extern bool_t xdr_remote_node_get_info_ret ();
index 4190cce7d7b9156a0f2eaa8c94a4116ccd3dda7e..e337944a346c0c138ec8d7ffed23862bc79a667b 100644 (file)
@@ -245,6 +245,10 @@ struct remote_get_hostname_ret {
     remote_nonnull_string hostname;
 };
 
+struct remote_get_uri_ret {
+    remote_nonnull_string uri;
+};
+
 struct remote_get_max_vcpus_args {
     /* The only backend which supports this call is Xen HV, and
      * there the type is ignored so it could be NULL.
@@ -1128,16 +1132,14 @@ enum remote_procedure {
 
     REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY = 101,
     REMOTE_PROC_NODE_GET_FREE_MEMORY = 102,
-
     REMOTE_PROC_DOMAIN_BLOCK_PEEK = 103,
     REMOTE_PROC_DOMAIN_MEMORY_PEEK = 104,
-
     REMOTE_PROC_DOMAIN_EVENTS_REGISTER = 105,
     REMOTE_PROC_DOMAIN_EVENTS_DEREGISTER = 106,
     REMOTE_PROC_DOMAIN_EVENT = 107,
-
     REMOTE_PROC_DOMAIN_MIGRATE_PREPARE2 = 108,
-    REMOTE_PROC_DOMAIN_MIGRATE_FINISH2 = 109
+    REMOTE_PROC_DOMAIN_MIGRATE_FINISH2 = 109,
+    REMOTE_PROC_GET_URI = 110
 };
 
 /* Custom RPC structure. */
index e8cb5b445f8bf88cd0e3246ee6a6a6caef305aa2..560154b86ab07e26f5b7aca20d1f1e9cd01ed649 100644 (file)
@@ -174,7 +174,7 @@ failed:
  */
 static void
 virReleaseConnect(virConnectPtr conn) {
-    DEBUG("release connection %p %s", conn, conn->name);
+    DEBUG("release connection %p", conn);
     if (conn->domains != NULL)
         virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName);
     if (conn->networks != NULL)
@@ -188,7 +188,7 @@ virReleaseConnect(virConnectPtr conn) {
     if (virLastErr.conn == conn)
         virLastErr.conn = NULL;
 
-    VIR_FREE(conn->name);
+    xmlFreeURI(conn->uri);
 
     pthread_mutex_unlock(&conn->lock);
     pthread_mutex_destroy(&conn->lock);
@@ -213,7 +213,7 @@ virUnrefConnect(virConnectPtr conn) {
         return(-1);
     }
     pthread_mutex_lock(&conn->lock);
-    DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+    DEBUG("unref connection %p %d", conn, conn->refs);
     conn->refs--;
     refs = conn->refs;
     if (refs == 0) {
@@ -322,7 +322,7 @@ virReleaseDomain(virDomainPtr domain) {
     VIR_FREE(domain->name);
     VIR_FREE(domain);
 
-    DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+    DEBUG("unref connection %p %d", conn, conn->refs);
     conn->refs--;
     if (conn->refs == 0) {
         virReleaseConnect(conn);
@@ -458,7 +458,7 @@ virReleaseNetwork(virNetworkPtr network) {
     VIR_FREE(network->name);
     VIR_FREE(network);
 
-    DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+    DEBUG("unref connection %p %d", conn, conn->refs);
     conn->refs--;
     if (conn->refs == 0) {
         virReleaseConnect(conn);
@@ -591,7 +591,7 @@ virReleaseStoragePool(virStoragePoolPtr pool) {
     VIR_FREE(pool->name);
     VIR_FREE(pool);
 
-    DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+    DEBUG("unref connection %p %d", conn, conn->refs);
     conn->refs--;
     if (conn->refs == 0) {
         virReleaseConnect(conn);
@@ -729,7 +729,7 @@ virReleaseStorageVol(virStorageVolPtr vol) {
     VIR_FREE(vol->pool);
     VIR_FREE(vol);
 
-    DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+    DEBUG("unref connection %p %d", conn, conn->refs);
     conn->refs--;
     if (conn->refs == 0) {
         virReleaseConnect(conn);
index 7bb4d92ed0c1cfd1d631a385843c184b7df09610..f06f41f6397d4d507f609fc15571ebeff08de0ef 100644 (file)
@@ -87,7 +87,7 @@
 struct _virConnect {
     unsigned int magic;     /* specific value to check */
     int flags;              /* a set of connection flags */
-    char *name;                 /* connection URI */
+    xmlURIPtr uri;          /* connection URI */
 
     /* The underlying hypervisor driver and network driver. */
     virDriverPtr      driver;
index 013cad8b613d099668d327cbd5bec2005b9f60ff..98a2763d0f2a6f8ef1ba05aa7c31489102e24c99 100644 (file)
@@ -68,11 +68,8 @@ typedef enum {
 #define VIR_DRV_SUPPORTS_FEATURE(drv,conn,feature)                      \
     ((drv)->supports_feature ? (drv)->supports_feature((conn),(feature)) : 0)
 
-typedef const char *
-        (*virDrvProbe)                 (void);
 typedef virDrvOpenStatus
         (*virDrvOpen)                  (virConnectPtr conn,
-                             xmlURIPtr uri,
                              virConnectAuthPtr auth,
                              int flags);
 typedef int
@@ -329,7 +326,6 @@ struct _virDriver {
     int               no;      /* the number virDrvNo */
     const char * name; /* the name of the driver */
     unsigned long ver; /* the version of the backend */
-    virDrvProbe                        probe;
     virDrvOpen                 open;
     virDrvClose                        close;
     virDrvDrvSupportsFeature   supports_feature;
index 9c7e5a9e42d092b294b96bba638c3a5d233c1825..10e9142e088ab835b5be308d483dffcc06d8705d 100644 (file)
@@ -685,8 +685,11 @@ do_open (const char *name,
          int flags)
 {
     int i, res;
-    virConnectPtr ret = NULL;
-    xmlURIPtr uri;
+    virConnectPtr ret;
+
+    ret = virGetConnect();
+    if (ret == NULL)
+        return NULL;
 
     /*
      *  If no URI is passed, then check for an environment string if not
@@ -699,74 +702,43 @@ do_open (const char *name,
             DEBUG("Using LIBVIRT_DEFAULT_URI %s", defname);
             name = defname;
         } else {
-            const char *use = NULL;
-            const char *latest;
-            int probes = 0;
-            for (i = 0; i < virDriverTabCount; i++) {
-                if ((virDriverTab[i]->probe != NULL) &&
-                    ((latest = virDriverTab[i]->probe()) != NULL)) {
-                    probes++;
-
-                    DEBUG("Probed %s", latest);
-                    /*
-                     * if running a xen kernel, give it priority over
-                     * QEmu emulation
-                     */
-                    if (STREQ(latest, "xen:///"))
-                        use = latest;
-                    else if (use == NULL)
-                        use = latest;
-                }
-            }
-            if (use == NULL) {
-                name = "xen:///";
-                DEBUG("Could not probe any hypervisor defaulting to %s",
-                      name);
-            } else {
-                name = use;
-                DEBUG("Using %s as default URI, %d hypervisor found",
-                      use, probes);
-            }
+            name = NULL;
         }
     }
 
-    /* Convert xen -> xen:/// for back compat */
-    if (STRCASEEQ(name, "xen"))
-        name = "xen:///";
+    if (name) {
+        /* Convert xen -> xen:/// for back compat */
+        if (STRCASEEQ(name, "xen"))
+            name = "xen:///";
 
-    /* Convert xen:// -> xen:/// because xmlParseURI cannot parse the
-     * former.  This allows URIs such as xen://localhost to work.
-     */
-    if (STREQ (name, "xen://"))
-        name = "xen:///";
-
-    ret = virGetConnect();
-    if (ret == NULL)
-        return NULL;
-
-    uri = xmlParseURI (name);
-    if (!uri) {
-        virLibConnError (ret, VIR_ERR_INVALID_ARG,
-                         _("could not parse connection URI"));
-        goto failed;
-    }
+        /* Convert xen:// -> xen:/// because xmlParseURI cannot parse the
+         * former.  This allows URIs such as xen://localhost to work.
+         */
+        if (STREQ (name, "xen://"))
+            name = "xen:///";
+
+        ret->uri = xmlParseURI (name);
+        if (!ret->uri) {
+            virLibConnError (ret, VIR_ERR_INVALID_ARG,
+                             _("could not parse connection URI"));
+            goto failed;
+        }
 
-    DEBUG("name \"%s\" to URI components:\n"
-          "  scheme %s\n"
-          "  opaque %s\n"
-          "  authority %s\n"
-          "  server %s\n"
-          "  user %s\n"
-          "  port %d\n"
-          "  path %s\n",
-          name,
-          uri->scheme, uri->opaque, uri->authority, uri->server,
-          uri->user, uri->port, uri->path);
-
-    ret->name = strdup (name);
-    if (!ret->name) {
-        virLibConnError (ret, VIR_ERR_NO_MEMORY, _("allocating conn->name"));
-        goto failed;
+        DEBUG("name \"%s\" to URI components:\n"
+              "  scheme %s\n"
+              "  opaque %s\n"
+              "  authority %s\n"
+              "  server %s\n"
+              "  user %s\n"
+              "  port %d\n"
+              "  path %s\n",
+              name,
+              ret->uri->scheme, ret->uri->opaque,
+              ret->uri->authority, ret->uri->server,
+              ret->uri->user, ret->uri->port,
+              ret->uri->path);
+    } else {
+        DEBUG0("no name, allowing driver auto-select");
     }
 
     /* Cleansing flags */
@@ -775,7 +747,7 @@ do_open (const char *name,
     for (i = 0; i < virDriverTabCount; i++) {
         DEBUG("trying driver %d (%s) ...",
               i, virDriverTab[i]->name);
-        res = virDriverTab[i]->open (ret, uri, auth, flags);
+        res = virDriverTab[i]->open (ret, auth, flags);
         DEBUG("driver %d %s returned %s",
               i, virDriverTab[i]->name,
               res == VIR_DRV_OPEN_SUCCESS ? "SUCCESS" :
@@ -795,7 +767,7 @@ do_open (const char *name,
     }
 
     for (i = 0; i < virNetworkDriverTabCount; i++) {
-        res = virNetworkDriverTab[i]->open (ret, uri, auth, flags);
+        res = virNetworkDriverTab[i]->open (ret, auth, flags);
         DEBUG("network driver %d %s returned %s",
               i, virNetworkDriverTab[i]->name,
               res == VIR_DRV_OPEN_SUCCESS ? "SUCCESS" :
@@ -816,7 +788,7 @@ do_open (const char *name,
 
     /* Secondary driver for storage. Optional */
     for (i = 0; i < virStorageDriverTabCount; i++) {
-        res = virStorageDriverTab[i]->open (ret, uri, auth, flags);
+        res = virStorageDriverTab[i]->open (ret, auth, flags);
 #ifdef ENABLE_DEBUG
         DEBUG("storage driver %d %s returned %s",
               i, virStorageDriverTab[i]->name,
@@ -836,13 +808,10 @@ do_open (const char *name,
         }
     }
 
-    xmlFreeURI (uri);
-
     return ret;
 
 failed:
     if (ret->driver) ret->driver->close (ret);
-    if (uri) xmlFreeURI(uri);
 
     /* If no global error was set, copy any error set
        in the connection object we're about to dispose of */
@@ -1103,7 +1072,7 @@ virConnectGetURI (virConnectPtr conn)
     if (conn->driver->getURI)
         return conn->driver->getURI (conn);
 
-    name = strdup (conn->name);
+    name = (char *)xmlSaveUri(conn->uri);
     if (!name) {
         virLibConnError (conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
         return NULL;
index fbfa60add52a2fec71d013168210795b6181e3a4..4e7ae10efa48c702d97bbd3c8cb4aeea6596e473 100644 (file)
@@ -55,36 +55,34 @@ static lxc_driver_t *lxc_driver = NULL;
 
 /* Functions */
 
-static const char *lxcProbe(void)
+static int lxcProbe(void)
 {
-    if (lxcContainerAvailable(0) < 0)
-        return NULL;
+    if (getuid() != 0 ||
+        lxcContainerAvailable(0) < 0)
+        return 0;
 
-    return("lxc:///");
+    return 1;
 }
 
 static virDrvOpenStatus lxcOpen(virConnectPtr conn,
-                                xmlURIPtr uri,
                                 virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                 int flags ATTRIBUTE_UNUSED)
 {
-    uid_t uid = getuid();
-
-    /* Check that the user is root */
-    if (0 != uid) {
+    if (!lxcProbe())
         goto declineConnection;
-    }
 
     if (lxc_driver == NULL)
         goto declineConnection;
 
     /* Verify uri was specified */
-    if ((NULL == uri) || (NULL == uri->scheme)) {
-        goto declineConnection;
-    }
-
-    /* Check that the uri scheme is lxc */
-    if (STRNEQ(uri->scheme, "lxc")) {
+    if (conn->uri == NULL) {
+        conn->uri = xmlParseURI("lxc:///");
+        if (!conn->uri) {
+            lxcError(conn, NULL, VIR_ERR_NO_MEMORY, NULL);
+            return VIR_DRV_OPEN_ERROR;
+        }
+    } else if (conn->uri->scheme == NULL ||
+               STRNEQ(conn->uri->scheme, "lxc")) {
         goto declineConnection;
     }
 
@@ -1226,7 +1224,6 @@ static virDriver lxcDriver = {
     VIR_DRV_LXC, /* the number virDrvNo */
     "LXC", /* the name of the driver */
     LIBVIR_VERSION_NUMBER, /* the version of the backend */
-    lxcProbe, /* probe */
     lxcOpen, /* open */
     lxcClose, /* close */
     NULL, /* supports_feature */
index 0026606166bcae7e366a423a2e940784ded78609..96d3ddf7ec5a8149c800331357673f4f5805ec38 100644 (file)
@@ -836,7 +836,6 @@ static virNetworkPtr networkLookupByName(virConnectPtr conn ATTRIBUTE_UNUSED,
 }
 
 static virDrvOpenStatus networkOpenNetwork(virConnectPtr conn,
-                                           xmlURIPtr uri ATTRIBUTE_UNUSED,
                                            virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                            int flags ATTRIBUTE_UNUSED) {
     if (!driverState)
index 95631eebac39befed7c39c68ded2831acb3ebb6e..6ea35576859a09c8c9b62cfa778f0499b32b5180 100644 (file)
@@ -861,35 +861,33 @@ static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
     return 0;
 }
 
-static const char *openvzProbe(void)
+static int openvzProbe(void)
 {
-#ifdef __linux__
-    if ((geteuid() == 0) && (virFileExists("/proc/vz")))
-        return("openvz:///system");
-#endif
-    return(NULL);
+    if (geteuid() == 0 &&
+        virFileExists("/proc/vz"))
+        return 1;
+
+    return 0;
 }
 
 static virDrvOpenStatus openvzOpen(virConnectPtr conn,
-                                 xmlURIPtr uri,
-                                 virConnectAuthPtr auth ATTRIBUTE_UNUSED,
-                                 int flags ATTRIBUTE_UNUSED)
+                                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+                                   int flags ATTRIBUTE_UNUSED)
 {
     struct openvz_driver *driver;
-    /*Just check if the user is root. Nothing really to open for OpenVZ */
-    if (geteuid()) { // OpenVZ tools can only be used by r00t
+    if (!openvzProbe())
         return VIR_DRV_OPEN_DECLINED;
-    } else {
-        if (uri == NULL ||
-            uri->scheme == NULL ||
-            uri->path == NULL ||
-            STRNEQ (uri->scheme, "openvz") ||
-            STRNEQ (uri->path, "/system"))
-            return VIR_DRV_OPEN_DECLINED;
-    }
-    /* See if we are running an OpenVZ enabled kernel */
-    if(access("/proc/vz/veinfo", F_OK) == -1 ||
-       access("/proc/user_beancounters", F_OK) == -1) {
+
+    if (conn->uri == NULL) {
+        conn->uri = xmlParseURI("openvz:///system");
+        if (conn->uri == NULL) {
+            openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
+            return VIR_DRV_OPEN_ERROR;
+        }
+    } else if (conn->uri->scheme == NULL ||
+               conn->uri->path == NULL ||
+               STRNEQ (conn->uri->scheme, "openvz") ||
+               STRNEQ (conn->uri->path, "/system")) {
         return VIR_DRV_OPEN_DECLINED;
     }
 
@@ -1086,7 +1084,6 @@ static virDriver openvzDriver = {
     VIR_DRV_OPENVZ,
     "OPENVZ",
     LIBVIR_VERSION_NUMBER,
-    openvzProbe, /* probe */
     openvzOpen, /* open */
     openvzClose, /* close */
     NULL, /* supports_feature */
index ca717f5dd724403e30743c3cf0320330ca3c3bb0..2e801d972554878b7f7f9b0da52eacddbcb0f82f 100644 (file)
@@ -36,7 +36,7 @@
 static int debug = 0;
 
 static int xenProxyClose(virConnectPtr conn);
-static int xenProxyOpen(virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags);
+static int xenProxyOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags);
 static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
 static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
 static char *xenProxyGetCapabilities(virConnectPtr conn);
@@ -480,7 +480,6 @@ retry:
  */
 int
 xenProxyOpen(virConnectPtr conn,
-             xmlURIPtr uri ATTRIBUTE_UNUSED,
              virConnectAuthPtr auth ATTRIBUTE_UNUSED,
              int flags)
 {
index 47167b7249fa412c1a0b25e6f849991926e3dc6c..9cf625d263c274ece6d18e68fe427dc37dd1a8f3 100644 (file)
@@ -1153,22 +1153,17 @@ qemudMonitorCommand (const struct qemud_driver *driver ATTRIBUTE_UNUSED,
  * Probe for the availability of the qemu driver, assume the
  * presence of QEmu emulation if the binaries are installed
  */
-static const char *qemudProbe(void)
+static int qemudProbe(void)
 {
     if ((virFileExists("/usr/bin/qemu")) ||
         (virFileExists("/usr/bin/qemu-kvm")) ||
-        (virFileExists("/usr/bin/xenner"))) {
-        if (getuid() == 0) {
-            return("qemu:///system");
-        } else {
-            return("qemu:///session");
-        }
-    }
-    return(NULL);
+        (virFileExists("/usr/bin/xenner")))
+        return 1;
+
+    return 0;
 }
 
 static virDrvOpenStatus qemudOpen(virConnectPtr conn,
-                                  xmlURIPtr uri,
                                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                   int flags ATTRIBUTE_UNUSED) {
     uid_t uid = getuid();
@@ -1176,18 +1171,28 @@ static virDrvOpenStatus qemudOpen(virConnectPtr conn,
     if (qemu_driver == NULL)
         goto decline;
 
-    if (uri == NULL || uri->scheme == NULL || uri->path == NULL)
+    if (!qemudProbe())
+        goto decline;
+
+    if (conn->uri == NULL) {
+        conn->uri = xmlParseURI(uid ? "qemu:///session" : "qemu:///system");
+        if (!conn->uri) {
+            qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,NULL);
+            return VIR_DRV_OPEN_ERROR;
+        }
+    } else if (conn->uri->scheme == NULL ||
+               conn->uri->path == NULL)
         goto decline;
 
-    if (STRNEQ (uri->scheme, "qemu"))
+    if (STRNEQ (conn->uri->scheme, "qemu"))
         goto decline;
 
     if (uid != 0) {
-        if (STRNEQ (uri->path, "/session"))
+        if (STRNEQ (conn->uri->path, "/session"))
             goto decline;
     } else { /* root */
-        if (STRNEQ (uri->path, "/system") &&
-            STRNEQ (uri->path, "/session"))
+        if (STRNEQ (conn->uri->path, "/system") &&
+            STRNEQ (conn->uri->path, "/session"))
             goto decline;
     }
 
@@ -3625,7 +3630,6 @@ static virDriver qemuDriver = {
     VIR_DRV_QEMU,
     "QEMU",
     LIBVIR_VERSION_NUMBER,
-    qemudProbe, /* probe */
     qemudOpen, /* open */
     qemudClose, /* close */
     qemudSupportsFeature, /* supports_feature */
index ffe80742dbd39becf9e66bd0a2d3bfe34b4949d7..9b85242c4adda643700ccd6a13f2c7cd5a41abd4 100644 (file)
@@ -273,46 +273,51 @@ enum virDrvOpenRemoteFlags {
     VIR_DRV_OPEN_REMOTE_AUTOSTART = (1 << 3),
 };
 
+/* What transport? */
+enum {
+    trans_tls,
+    trans_unix,
+    trans_ssh,
+    trans_ext,
+    trans_tcp,
+} transport;
+
+
 static int
 doRemoteOpen (virConnectPtr conn,
               struct private_data *priv,
-              xmlURIPtr uri,
               virConnectAuthPtr auth ATTRIBUTE_UNUSED,
               int flags)
 {
-    if (!uri || !uri->scheme)
-        return VIR_DRV_OPEN_DECLINED; /* Decline - not a URL. */
-
-    char *transport_str = get_transport_from_scheme (uri->scheme);
-
-    /* What transport? */
-    enum {
-        trans_tls,
-        trans_unix,
-        trans_ssh,
-        trans_ext,
-        trans_tcp,
-    } transport;
-
-    if (!transport_str || STRCASEEQ (transport_str, "tls"))
-        transport = trans_tls;
-    else if (STRCASEEQ (transport_str, "unix"))
-        transport = trans_unix;
-    else if (STRCASEEQ (transport_str, "ssh"))
-        transport = trans_ssh;
-    else if (STRCASEEQ (transport_str, "ext"))
-        transport = trans_ext;
-    else if (STRCASEEQ (transport_str, "tcp"))
-        transport = trans_tcp;
-    else {
-        error (conn, VIR_ERR_INVALID_ARG,
-               _("remote_open: transport in URL not recognised "
-                 "(should be tls|unix|ssh|ext|tcp)"));
-        return VIR_DRV_OPEN_ERROR;
+    char *transport_str = NULL;
+
+    if (conn->uri) {
+        if (!conn->uri->scheme)
+            return VIR_DRV_OPEN_DECLINED;
+
+        transport_str = get_transport_from_scheme (conn->uri->scheme);
+
+        if (!transport_str || STRCASEEQ (transport_str, "tls"))
+            transport = trans_tls;
+        else if (STRCASEEQ (transport_str, "unix"))
+            transport = trans_unix;
+        else if (STRCASEEQ (transport_str, "ssh"))
+            transport = trans_ssh;
+        else if (STRCASEEQ (transport_str, "ext"))
+            transport = trans_ext;
+        else if (STRCASEEQ (transport_str, "tcp"))
+            transport = trans_tcp;
+        else {
+            error (conn, VIR_ERR_INVALID_ARG,
+                   _("remote_open: transport in URL not recognised "
+                     "(should be tls|unix|ssh|ext|tcp)"));
+            return VIR_DRV_OPEN_ERROR;
+        }
     }
 
-    if (!uri->server && !transport_str) {
-        if (flags & VIR_DRV_OPEN_REMOTE_UNIX)
+    if (!transport_str) {
+        if ((!conn->uri || !conn->uri->server) &&
+            (flags & VIR_DRV_OPEN_REMOTE_UNIX))
             transport = trans_unix;
         else
             return VIR_DRV_OPEN_DECLINED; /* Decline - not a remote URL. */
@@ -330,8 +335,8 @@ doRemoteOpen (virConnectPtr conn,
     int retcode = VIR_DRV_OPEN_ERROR;
 
     /* Remote server defaults to "localhost" if not specified. */
-    if (uri->port != 0) {
-        if (asprintf (&port, "%d", uri->port) == -1) goto out_of_memory;
+    if (conn->uri && conn->uri->port != 0) {
+        if (asprintf (&port, "%d", conn->uri->port) == -1) goto out_of_memory;
     } else if (transport == trans_tls) {
         port = strdup (LIBVIRTD_TLS_PORT);
         if (!port) goto out_of_memory;
@@ -345,11 +350,12 @@ doRemoteOpen (virConnectPtr conn,
         port = NULL;           /* Port not used for unix, ext. */
 
 
-    priv->hostname = strdup (uri->server ? uri->server : "localhost");
+    priv->hostname = strdup (conn->uri && conn->uri->server ?
+                             conn->uri->server : "localhost");
     if (!priv->hostname)
         goto out_of_memory;
-    if (uri->user) {
-        username = strdup (uri->user);
+    if (conn->uri && conn->uri->user) {
+        username = strdup (conn->uri->user);
         if (!username)
             goto out_of_memory;
     }
@@ -363,97 +369,101 @@ doRemoteOpen (virConnectPtr conn,
     struct qparam *var;
     int i;
     char *query;
-#ifdef HAVE_XMLURI_QUERY_RAW
-    query = uri->query_raw;
-#else
-    query = uri->query;
-#endif
-    vars = qparam_query_parse (query);
-    if (vars == NULL) goto failed;
-
-    for (i = 0; i < vars->n; i++) {
-        var = &vars->p[i];
-        if (STRCASEEQ (var->name, "name")) {
-            name = strdup (var->value);
-            if (!name) goto out_of_memory;
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "command")) {
-            command = strdup (var->value);
-            if (!command) goto out_of_memory;
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "socket")) {
-            sockname = strdup (var->value);
-            if (!sockname) goto out_of_memory;
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "auth")) {
-            authtype = strdup (var->value);
-            if (!authtype) goto out_of_memory;
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "netcat")) {
-            netcat = strdup (var->value);
-            if (!netcat) goto out_of_memory;
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "no_verify")) {
-            no_verify = atoi (var->value);
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "no_tty")) {
-            no_tty = atoi (var->value);
-            var->ignore = 1;
-        } else if (STRCASEEQ (var->name, "debug")) {
-            if (var->value &&
-                STRCASEEQ (var->value, "stdout"))
-                priv->debugLog = stdout;
-            else
-                priv->debugLog = stderr;
-        } else
-            DEBUG("passing through variable '%s' ('%s') to remote end",
-                  var->name, var->value);
-    }
 
+    if (conn->uri) {
 #ifdef HAVE_XMLURI_QUERY_RAW
-    xmlFree (uri->query_raw);
+        query = conn->uri->query_raw;
 #else
-    xmlFree (uri->query);
+        query = conn->uri->query;
 #endif
+        vars = qparam_query_parse (query);
+        if (vars == NULL) goto failed;
+
+        for (i = 0; i < vars->n; i++) {
+            var = &vars->p[i];
+            if (STRCASEEQ (var->name, "name")) {
+                name = strdup (var->value);
+                if (!name) goto out_of_memory;
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "command")) {
+                command = strdup (var->value);
+                if (!command) goto out_of_memory;
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "socket")) {
+                sockname = strdup (var->value);
+                if (!sockname) goto out_of_memory;
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "auth")) {
+                authtype = strdup (var->value);
+                if (!authtype) goto out_of_memory;
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "netcat")) {
+                netcat = strdup (var->value);
+                if (!netcat) goto out_of_memory;
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "no_verify")) {
+                no_verify = atoi (var->value);
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "no_tty")) {
+                no_tty = atoi (var->value);
+                var->ignore = 1;
+            } else if (STRCASEEQ (var->name, "debug")) {
+                if (var->value &&
+                    STRCASEEQ (var->value, "stdout"))
+                    priv->debugLog = stdout;
+                else
+                    priv->debugLog = stderr;
+            } else
+                DEBUG("passing through variable '%s' ('%s') to remote end",
+                      var->name, var->value);
+        }
 
+        /* Construct the original name. */
+        if (!name) {
+            xmlURI tmpuri = {
+                .scheme = conn->uri->scheme,
 #ifdef HAVE_XMLURI_QUERY_RAW
-    uri->query_raw =
+                .query_raw = qparam_get_query (vars),
 #else
-    uri->query =
+                .query = qparam_get_query (vars),
 #endif
-         qparam_get_query (vars);
-
-    free_qparam_set (vars);
+                .path = conn->uri->path,
+                .fragment = conn->uri->fragment,
+            };
+
+            /* Evil, blank out transport scheme temporarily */
+            if (transport_str) {
+                assert (transport_str[-1] == '+');
+                transport_str[-1] = '\0';
+            }
 
-    /* For ext transport, command is required. */
-    if (transport == trans_ext && !command) {
-        error (conn, VIR_ERR_INVALID_ARG,
-               _("remote_open: for 'ext' transport, command is required"));
-        goto failed;
-    }
+            name = (char *) xmlSaveUri (&tmpuri);
 
-    /* Construct the original name. */
-    if (!name) {
-        /* Remove the transport (if any) from the scheme. */
-        if (transport_str) {
-            assert (transport_str[-1] == '+');
-            transport_str[-1] = '\0';
+            /* Restore transport scheme */
+            if (transport_str)
+                transport_str[-1] = '+';
         }
-        /* Remove the username, server name and port number. */
-        xmlFree (uri->user);
-        uri->user = 0;
 
-        xmlFree (uri->server);
-        uri->server = 0;
-
-        uri->port = 0;
+        free_qparam_set (vars);
+    } else {
+        /* Probe URI server side */
+        name = strdup("");
+    }
 
-        name = (char *) xmlSaveUri (uri);
+    if (!name) {
+        error(conn, VIR_ERR_NO_MEMORY, NULL);
+        goto failed;
     }
 
-    assert (name);
     DEBUG("proceeding with name = %s", name);
 
+    /* For ext transport, command is required. */
+    if (transport == trans_ext && !command) {
+        error (conn, VIR_ERR_INVALID_ARG,
+               _("remote_open: for 'ext' transport, command is required"));
+        goto failed;
+    }
+
     /* Connect to the remote service. */
     switch (transport) {
     case trans_tls:
@@ -702,6 +712,38 @@ doRemoteOpen (virConnectPtr conn,
               (xdrproc_t) xdr_void, (char *) NULL) == -1)
         goto failed;
 
+    /* Now try and find out what URI the daemon used */
+    if (conn->uri == NULL) {
+        remote_get_uri_ret uriret;
+        int urierr;
+
+        memset (&uriret, 0, sizeof uriret);
+        urierr = call (conn, priv,
+                       REMOTE_CALL_IN_OPEN | REMOTE_CALL_QUIET_MISSING_RPC,
+                       REMOTE_PROC_GET_URI,
+                       (xdrproc_t) xdr_void, (char *) NULL,
+                       (xdrproc_t) xdr_remote_get_uri_ret, (char *) &uriret);
+        if (urierr == -2) {
+            /* Should not really happen, since we only probe local libvirtd's,
+               & the library should always match the daemon. Only case is post
+               RPM upgrade where an old daemon instance is still running with
+               new client. Too bad. It is not worth the hassle to fix this */
+            error (conn, VIR_ERR_INTERNAL_ERROR, _("unable to auto-detect URI"));
+            goto failed;
+        }
+        if (urierr == -1) {
+            goto failed;
+        }
+
+        DEBUG("Auto-probed URI is %s", uriret.uri);
+        conn->uri = xmlParseURI(uriret.uri);
+        VIR_FREE(uriret.uri);
+        if (!conn->uri) {
+            error (conn, VIR_ERR_NO_MEMORY, NULL);
+            goto failed;
+        }
+    }
+
     if(VIR_ALLOC(priv->callbackList)<0) {
         error(conn, VIR_ERR_INVALID_ARG, _("Error allocating callbacks list"));
         goto failed;
@@ -788,7 +830,6 @@ doRemoteOpen (virConnectPtr conn,
 
 static int
 remoteOpen (virConnectPtr conn,
-            xmlURIPtr uri,
             virConnectAuthPtr auth,
             int flags)
 {
@@ -806,40 +847,54 @@ remoteOpen (virConnectPtr conn,
     if (flags & VIR_CONNECT_RO)
         rflags |= VIR_DRV_OPEN_REMOTE_RO;
 
-#if WITH_QEMU
-    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->path, "/session")) {
-            rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
-            if (getuid() > 0) {
-                rflags |= VIR_DRV_OPEN_REMOTE_USER;
-                rflags |= VIR_DRV_OPEN_REMOTE_AUTOSTART;
-            }
-        }
-    }
-#endif
-#if WITH_XEN
-    if (uri &&
-        uri->scheme && STREQ (uri->scheme, "xen") &&
-        (!uri->server || STREQ (uri->server, "")) &&
-        (!uri->path || STREQ(uri->path, "/"))) {
+    /*
+     * If no servername is given, and no +XXX
+     * transport is listed, then force to a
+     * local UNIX socket connection
+     */
+    if (conn->uri &&
+        !conn->uri->server &&
+        !strchr(conn->uri->scheme, '+')) {
+        DEBUG0("Auto-remote UNIX socket");
         rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
     }
-#endif
-#if WITH_LXC
-    if (uri &&
-        uri->scheme && STREQ (uri->scheme, "lxc")) {
+
+    /*
+     * If no servername is given, and no +XXX
+     * transport is listed, or transport is unix,
+     * and path is /session, and uid is unprivileged
+     * then auto-spawn a daemon.
+     */
+    if (conn->uri &&
+        !conn->uri->server &&
+        conn->uri->path &&
+        ((strchr(conn->uri->scheme, '+') == 0)||
+         (strstr(conn->uri->scheme, "+unix") != NULL)) &&
+        STREQ(conn->uri->path, "/session") &&
+        getuid() > 0) {
+        DEBUG0("Auto-spawn user daemon instance");
+        rflags |= VIR_DRV_OPEN_REMOTE_USER;
+        rflags |= VIR_DRV_OPEN_REMOTE_AUTOSTART;
+    }
+
+    /*
+     * If URI is NULL, then do a UNIX connection
+     * possibly auto-spawning unprivileged server
+     * and probe remote server for URI
+     */
+    if (!conn->uri) {
+        DEBUG0("Auto-probe remote URI");
         rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
+        if (getuid() > 0) {
+            DEBUG0("Auto-spawn user daemon instance");
+            rflags |= VIR_DRV_OPEN_REMOTE_USER;
+            rflags |= VIR_DRV_OPEN_REMOTE_AUTOSTART;
+        }
     }
-#endif
 
     priv->magic = DEAD;
     priv->sock = -1;
-    ret = doRemoteOpen(conn, priv, uri, auth, rflags);
+    ret = doRemoteOpen(conn, priv, auth, rflags);
     if (ret != VIR_DRV_OPEN_SUCCESS) {
         conn->privateData = NULL;
         VIR_FREE(priv);
@@ -2553,7 +2608,6 @@ remoteDomainMemoryPeek (virDomainPtr domain,
 
 static int
 remoteNetworkOpen (virConnectPtr conn,
-                   xmlURIPtr uri,
                    virConnectAuthPtr auth,
                    int flags)
 {
@@ -2587,7 +2641,7 @@ remoteNetworkOpen (virConnectPtr conn,
 
         priv->magic = DEAD;
         priv->sock = -1;
-        ret = doRemoteOpen(conn, priv, uri, auth, rflags);
+        ret = doRemoteOpen(conn, priv, auth, rflags);
         if (ret != VIR_DRV_OPEN_SUCCESS) {
             conn->networkPrivateData = NULL;
             VIR_FREE(priv);
@@ -2954,7 +3008,6 @@ remoteNetworkSetAutostart (virNetworkPtr network, int autostart)
 
 static int
 remoteStorageOpen (virConnectPtr conn,
-                   xmlURIPtr uri,
                    virConnectAuthPtr auth,
                    int flags)
 {
@@ -2993,7 +3046,7 @@ remoteStorageOpen (virConnectPtr conn,
 
         priv->magic = DEAD;
         priv->sock = -1;
-        ret = doRemoteOpen(conn, priv, uri, auth, rflags);
+        ret = doRemoteOpen(conn, priv, auth, rflags);
         if (ret != VIR_DRV_OPEN_SUCCESS) {
             conn->storagePrivateData = NULL;
             VIR_FREE(priv);
@@ -5002,7 +5055,6 @@ static virDriver driver = {
     .no = VIR_DRV_REMOTE,
     .name = "remote",
     .ver = REMOTE_PROTOCOL_VERSION,
-    .probe = NULL,
     .open = remoteOpen,
     .close = remoteClose,
     .supports_feature = remoteSupportsFeature,
index 6e7623882c3bfa8c3542625b6fad49cce0860413..366820b623612e64622260e974db47e91733a0a2 100644 (file)
@@ -294,7 +294,6 @@ storagePoolLookupByVolume(virStorageVolPtr vol) {
 
 static virDrvOpenStatus
 storageOpen(virConnectPtr conn,
-            xmlURIPtr uri ATTRIBUTE_UNUSED,
             virConnectAuthPtr auth ATTRIBUTE_UNUSED,
             int flags ATTRIBUTE_UNUSED) {
     if (!driverState)
index 11e57f66472f90488feb4af6fcdd61108714cbb8..3648c05788518fba5a89fa8341bf671dc11466f0 100644 (file)
@@ -635,39 +635,38 @@ static int testOpenFromFile(virConnectPtr conn,
 
 
 static int testOpen(virConnectPtr conn,
-                    xmlURIPtr uri,
                     virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                     int flags ATTRIBUTE_UNUSED)
 {
     int ret;
 
-    if (!uri)
+    if (!conn->uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (!uri->scheme || STRNEQ(uri->scheme, "test"))
+    if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "test"))
         return VIR_DRV_OPEN_DECLINED;
 
     /* Remote driver should handle these. */
-    if (uri->server)
+    if (conn->uri->server)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (uri->server)
+    if (conn->uri->server)
         return VIR_DRV_OPEN_DECLINED;
 
     /* From this point on, the connection is for us. */
-    if (!uri->path
-        || uri->path[0] == '\0'
-        || (uri->path[0] == '/' && uri->path[1] == '\0')) {
+    if (!conn->uri->path
+        || conn->uri->path[0] == '\0'
+        || (conn->uri->path[0] == '/' && conn->uri->path[1] == '\0')) {
         testError (NULL, VIR_ERR_INVALID_ARG,
                    "%s", _("testOpen: supply a path or use test:///default"));
         return VIR_DRV_OPEN_ERROR;
     }
 
-    if (STREQ(uri->path, "/default"))
+    if (STREQ(conn->uri->path, "/default"))
         ret = testOpenDefault(conn);
     else
         ret = testOpenFromFile(conn,
-                               uri->path);
+                               conn->uri->path);
 
     return (ret);
 }
@@ -713,19 +712,6 @@ static char *testGetHostname (virConnectPtr conn)
     return str;
 }
 
-static char * testGetURI (virConnectPtr conn)
-{
-    char *uri;
-    GET_CONNECTION(conn);
-
-    if (asprintf (&uri, "test://%s", privconn->path) == -1) {
-        testError (conn, VIR_ERR_SYSTEM_ERROR, "%s",
-                   strerror (errno));
-        return NULL;
-    }
-    return uri;
-}
-
 static int testGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
                            const char *type ATTRIBUTE_UNUSED)
 {
@@ -1398,7 +1384,6 @@ static int testDomainSetSchedulerParams(virDomainPtr domain,
 }
 
 static virDrvOpenStatus testOpenNetwork(virConnectPtr conn,
-                                        xmlURIPtr uri ATTRIBUTE_UNUSED,
                                         virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                         int flags ATTRIBUTE_UNUSED) {
     if (STRNEQ(conn->driver->name, "Test"))
@@ -1631,7 +1616,6 @@ static int testStoragePoolObjSetDefaults(virStoragePoolObjPtr pool) {
 }
 
 static virDrvOpenStatus testStorageOpen(virConnectPtr conn,
-                                        xmlURIPtr uri ATTRIBUTE_UNUSED,
                                         virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                         int flags ATTRIBUTE_UNUSED) {
     if (STRNEQ(conn->driver->name, "Test"))
@@ -2211,14 +2195,13 @@ static virDriver testDriver = {
     VIR_DRV_TEST,
     "Test",
     LIBVIR_VERSION_NUMBER,
-    NULL, /* probe */
     testOpen, /* open */
     testClose, /* close */
     NULL, /* supports_feature */
     NULL, /* type */
     testGetVersion, /* version */
     testGetHostname, /* hostname */
-    testGetURI, /* URI */
+    NULL, /* URI */
     testGetMaxVCPUs, /* getMaxVcpus */
     testNodeGetInfo, /* nodeGetInfo */
     testGetCapabilities, /* getCapabilities */
index 04b41b4ac7ed6c18102f6a865f0abf68b1857d51..89081eaa663b558f39b49dec64eb357b41bc45fa 100644 (file)
@@ -2033,7 +2033,6 @@ xenHypervisorInit(void)
  */
 int
 xenHypervisorOpen(virConnectPtr conn,
-                  xmlURIPtr uri ATTRIBUTE_UNUSED,
                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                   int flags ATTRIBUTE_UNUSED)
 {
index c00d4d8651f9f70d85da80782ed43378a93205ef..16b1495439142ce27cb4fd88819880e9720e13b7 100644 (file)
@@ -33,7 +33,6 @@ char *
         xenHypervisorDomainGetOSType (virDomainPtr dom);
 
 int    xenHypervisorOpen               (virConnectPtr conn,
-                                         xmlURIPtr uri,
                                          virConnectAuthPtr auth,
                                          int flags);
 int    xenHypervisorClose              (virConnectPtr conn);
index dd3887580d75d52583e836a882cf51c5d454a7db..20c413abe971edc39945a26b2761b56bf29101aa 100644 (file)
@@ -200,34 +200,45 @@ done:
  * in the low level drivers directly.
  */
 
-static const char *
+static int
 xenUnifiedProbe (void)
 {
 #ifdef __linux__
     if (virFileExists("/proc/xen"))
-        return("xen:///");
+        return 1;
 #endif
 #ifdef __sun__
     FILE *fh;
 
     if (fh = fopen("/dev/xen/domcaps", "r")) {
         fclose(fh);
-        return("xen:///");
+        return 1;
     }
 #endif
-    return(NULL);
+    return 0;
 }
 
 static int
-xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags)
+xenUnifiedOpen (virConnectPtr conn, virConnectAuthPtr auth, int flags)
 {
     int i, ret = VIR_DRV_OPEN_DECLINED;
     xenUnifiedPrivatePtr priv;
 
+    if (conn->uri == NULL) {
+        if (!xenUnifiedProbe())
+            return VIR_DRV_OPEN_DECLINED;
+
+        conn->uri = xmlParseURI("xen:///");
+        if (!conn->uri) {
+            xenUnifiedError (NULL, VIR_ERR_NO_MEMORY, NULL);
+            return VIR_DRV_OPEN_ERROR;
+        }
+    }
+
     /* Refuse any scheme which isn't "xen://" or "http://". */
-    if (uri->scheme &&
-        STRCASENEQ(uri->scheme, "xen") &&
-        STRCASENEQ(uri->scheme, "http"))
+    if (conn->uri->scheme &&
+        STRCASENEQ(conn->uri->scheme, "xen") &&
+        STRCASENEQ(conn->uri->scheme, "http"))
         return VIR_DRV_OPEN_DECLINED;
 
     /* xmlParseURI will parse a naked string like "foo" as a URI with
@@ -235,11 +246,11 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f
      * allow full pathnames (eg. ///var/lib/xen/xend-socket).  Decline
      * anything else.
      */
-    if (!uri->scheme && (!uri->path || uri->path[0] != '/'))
+    if (!conn->uri->scheme && (!conn->uri->path || conn->uri->path[0] != '/'))
         return VIR_DRV_OPEN_DECLINED;
 
     /* Refuse any xen:// URI with a server specified - allow remote to do it */
-    if (uri->scheme && STRCASEEQ(uri->scheme, "xen") && uri->server)
+    if (conn->uri->scheme && STRCASEEQ(conn->uri->scheme, "xen") && conn->uri->server)
         return VIR_DRV_OPEN_DECLINED;
 
     /* Allocate per-connection private data. */
@@ -261,7 +272,7 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f
     /* Hypervisor is only run as root & required to succeed */
     if (getuid() == 0) {
         DEBUG0("Trying hypervisor sub-driver");
-        if (drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->open(conn, uri, auth, flags) ==
+        if (drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->open(conn, auth, flags) ==
             VIR_DRV_OPEN_SUCCESS) {
             DEBUG0("Activated hypervisor sub-driver");
             priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] = 1;
@@ -272,7 +283,7 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f
      * If it fails as non-root, then the proxy driver may take over
      */
     DEBUG0("Trying XenD sub-driver");
-    if (drivers[XEN_UNIFIED_XEND_OFFSET]->open(conn, uri, auth, flags) ==
+    if (drivers[XEN_UNIFIED_XEND_OFFSET]->open(conn, auth, flags) ==
         VIR_DRV_OPEN_SUCCESS) {
         DEBUG0("Activated XenD sub-driver");
         priv->opened[XEN_UNIFIED_XEND_OFFSET] = 1;
@@ -281,14 +292,14 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f
          * succeed if root, optional otherwise */
         if (priv->xendConfigVersion <= 2) {
             DEBUG0("Trying XM sub-driver");
-            if (drivers[XEN_UNIFIED_XM_OFFSET]->open(conn, uri, auth, flags) ==
+            if (drivers[XEN_UNIFIED_XM_OFFSET]->open(conn, auth, flags) ==
                 VIR_DRV_OPEN_SUCCESS) {
                 DEBUG0("Activated XM sub-driver");
                 priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
             }
         }
         DEBUG0("Trying XS sub-driver");
-        if (drivers[XEN_UNIFIED_XS_OFFSET]->open(conn, uri, auth, flags) ==
+        if (drivers[XEN_UNIFIED_XS_OFFSET]->open(conn, auth, flags) ==
             VIR_DRV_OPEN_SUCCESS) {
             DEBUG0("Activated XS sub-driver");
             priv->opened[XEN_UNIFIED_XS_OFFSET] = 1;
@@ -302,7 +313,7 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f
         } else {
 #if WITH_PROXY
             DEBUG0("Trying proxy sub-driver");
-            if (drivers[XEN_UNIFIED_PROXY_OFFSET]->open(conn, uri, auth, flags) ==
+            if (drivers[XEN_UNIFIED_PROXY_OFFSET]->open(conn, auth, flags) ==
                 VIR_DRV_OPEN_SUCCESS) {
                 DEBUG0("Activated proxy sub-driver");
                 priv->opened[XEN_UNIFIED_PROXY_OFFSET] = 1;
@@ -1292,7 +1303,6 @@ static virDriver xenUnifiedDriver = {
     .no = VIR_DRV_XEN_UNIFIED,
     .name = "Xen",
     .ver = HV_VERSION,
-    .probe                     = xenUnifiedProbe,
     .open                      = xenUnifiedOpen,
     .close                     = xenUnifiedClose,
     .supports_feature   = xenUnifiedSupportsFeature,
index 6d2291b78ecc67957a3199c53a0c60f9c643a343..55eaf94302de577502cb7a3c4fc869472088170b 100644 (file)
@@ -2706,7 +2706,6 @@ error:
  */
 int
 xenDaemonOpen(virConnectPtr conn,
-              xmlURIPtr uri,
               virConnectAuthPtr auth ATTRIBUTE_UNUSED,
               int flags ATTRIBUTE_UNUSED)
 {
@@ -2715,13 +2714,13 @@ xenDaemonOpen(virConnectPtr conn,
     /* Switch on the scheme, which we expect to be NULL (file),
      * "http" or "xen".
      */
-    if (uri->scheme == NULL) {
+    if (conn->uri->scheme == NULL) {
         /* It should be a file access */
-        if (uri->path == NULL) {
+        if (conn->uri->path == NULL) {
             virXendError(NULL, VIR_ERR_NO_CONNECT, __FUNCTION__);
             goto failed;
         }
-        ret = xenDaemonOpen_unix(conn, uri->path);
+        ret = xenDaemonOpen_unix(conn, conn->uri->path);
         if (ret < 0)
             goto failed;
 
@@ -2729,7 +2728,7 @@ xenDaemonOpen(virConnectPtr conn,
         if (ret == -1)
             goto failed;
     }
-    else if (STRCASEEQ (uri->scheme, "xen")) {
+    else if (STRCASEEQ (conn->uri->scheme, "xen")) {
         /*
          * try first to open the unix socket
          */
@@ -2750,8 +2749,8 @@ xenDaemonOpen(virConnectPtr conn,
         ret = xend_detect_config_version(conn);
         if (ret == -1)
             goto failed;
-    } else if (STRCASEEQ (uri->scheme, "http")) {
-        ret = xenDaemonOpen_tcp(conn, uri->server, uri->port);
+    } else if (STRCASEEQ (conn->uri->scheme, "http")) {
+        ret = xenDaemonOpen_tcp(conn, conn->uri->server, conn->uri->port);
         if (ret < 0)
             goto failed;
         ret = xend_detect_config_version(conn);
index a2515eed843f7f1c5c44f6c35ae1f497638538dd..20645fb79fc20d3e7168819e9a33ffb6b54c1149 100644 (file)
@@ -129,7 +129,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
 
 
 /* refactored ones */
-int xenDaemonOpen(virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags);
+int xenDaemonOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags);
 int xenDaemonClose(virConnectPtr conn);
 int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer);
 int xenDaemonNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
index c298888a9b9eafd4404d29266a419bfabfde60a3..b899454853ec065ea42a60daa2e7ba5e63187181 100644 (file)
@@ -529,7 +529,6 @@ static int xenXMConfigCacheRefresh (virConnectPtr conn) {
  */
 int
 xenXMOpen (virConnectPtr conn ATTRIBUTE_UNUSED,
-           xmlURIPtr uri ATTRIBUTE_UNUSED,
            virConnectAuthPtr auth ATTRIBUTE_UNUSED,
            int flags ATTRIBUTE_UNUSED)
 {
index 012a8fced600d735bec2651fbb0db60f60423c75..e3cea0052041eb59c405850fc531dd8ce51d847a 100644 (file)
@@ -32,7 +32,7 @@
 extern struct xenUnifiedDriver xenXMDriver;
 int xenXMInit (void);
 
-int xenXMOpen(virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags);
+int xenXMOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags);
 int xenXMClose(virConnectPtr conn);
 const char *xenXMGetType(virConnectPtr conn);
 int xenXMDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
index b096acdeb25d58adfecb55116f939832353675cd..f43a217e69691f3f6d6fab6059783cc35da17b84 100644 (file)
@@ -276,7 +276,6 @@ virDomainGetVMInfo(virDomainPtr domain, const char *vm, const char *name)
  */
 int
 xenStoreOpen(virConnectPtr conn,
-             xmlURIPtr uri ATTRIBUTE_UNUSED,
              virConnectAuthPtr auth ATTRIBUTE_UNUSED,
              int flags ATTRIBUTE_UNUSED)
 {
index 6163ebc80b240d121c8bd265c7fee00ea9cfc9bd..c3c402fe3e110b910472a0c33d6bae9c0882f98e 100644 (file)
@@ -17,7 +17,6 @@ extern struct xenUnifiedDriver xenStoreDriver;
 int xenStoreInit (void);
 
 int            xenStoreOpen            (virConnectPtr conn,
-                                         xmlURIPtr uri,
                                          virConnectAuthPtr auth,
                                          int flags);
 int            xenStoreClose           (virConnectPtr conn);