[libvirt] [PATCH 5/8] driver: declare supported URI schemes in virConnectDriver struct

Daniel P. Berrangé berrange at redhat.com
Mon Apr 9 15:45:48 UTC 2018


Declare what URI schemes a driver supports in its virConnectDriver
struct. This allows us to skip trying to open the driver entirely
if the URI scheme doesn't match.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/bhyve/bhyve_driver.c                |  4 +---
 src/driver.h                            |  6 ++++++
 src/esx/esx_driver.c                    | 27 ++-------------------------
 src/hyperv/hyperv_driver.c              | 22 ++--------------------
 src/interface/interface_backend_netcf.c |  4 +---
 src/interface/interface_backend_udev.c  |  4 +---
 src/libvirt.c                           | 24 ++++++++++++++++++++++++
 src/libxl/libxl_driver.c                |  5 +----
 src/lxc/lxc_driver.c                    |  5 +----
 src/network/bridge_driver.c             |  4 +---
 src/node_device/node_device_driver.c    |  3 ---
 src/node_device/node_device_hal.c       |  1 +
 src/node_device/node_device_udev.c      |  1 +
 src/nwfilter/nwfilter_driver.c          |  4 +---
 src/openvz/openvz_driver.c              |  6 +-----
 src/phyp/phyp_driver.c                  |  4 +---
 src/qemu/qemu_driver.c                  |  8 +-------
 src/secret/secret_driver.c              |  4 +---
 src/storage/storage_driver.c            |  4 +---
 src/test/test_driver.c                  |  4 +---
 src/uml/uml_driver.c                    |  5 +----
 src/vbox/vbox_common.c                  |  4 ----
 src/vbox/vbox_driver.c                  |  5 ++---
 src/vmware/vmware_driver.c              |  7 +------
 src/vz/vz_driver.c                      | 15 ++-------------
 src/xenapi/xenapi_driver.c              |  5 ++---
 26 files changed, 57 insertions(+), 128 deletions(-)

diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index cc1d4ba6fb..21754dfc10 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -202,9 +202,6 @@ bhyveConnectOpen(virConnectPtr conn,
      if (conn->uri == NULL) {
          return VIR_DRV_OPEN_DECLINED;
      } else {
-         if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "bhyve"))
-             return VIR_DRV_OPEN_DECLINED;
-
          if (STRNEQ_NULLABLE(conn->uri->path, "/system")) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Unexpected bhyve URI path '%s', try bhyve:///system"),
@@ -1752,6 +1749,7 @@ static virHypervisorDriver bhyveHypervisorDriver = {
 
 static virConnectDriver bhyveConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "bhyve", NULL },
     .hypervisorDriver = &bhyveHypervisorDriver,
 };
 
diff --git a/src/driver.h b/src/driver.h
index 5fb0b523c8..b071a3a782 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -81,6 +81,12 @@ typedef virConnectDriver *virConnectDriverPtr;
 struct _virConnectDriver {
     /* Wether driver permits a server in the URI */
     bool localOnly;
+    /*
+     * NULL terminated list of supported URI schemes.
+     *  - Single element { NULL } list indicates no supported schemes
+     *  - NULL list indicates wildcard supportnig all schemes
+     */
+    const char **uriSchemes;
     virHypervisorDriverPtr hypervisorDriver;
     virInterfaceDriverPtr interfaceDriver;
     virNetworkDriverPtr networkDriver;
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 927267f1cc..9b6944ba59 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -845,7 +845,6 @@ esxConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
                unsigned int flags)
 {
     virDrvOpenStatus result = VIR_DRV_OPEN_ERROR;
-    char *plus;
     esxPrivate *priv = NULL;
     char *potentialVCenterIPAddress = NULL;
     char vCenterIPAddress[NI_MAXHOST] = "";
@@ -853,32 +852,9 @@ esxConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
     /* Decline if the URI is NULL or the scheme is NULL */
-    if (!conn->uri || !conn->uri->scheme)
+    if (!conn->uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    /* Decline if the scheme is not one of {vpx|esx|gsx} */
-    plus = strchr(conn->uri->scheme, '+');
-
-    if (!plus) {
-        if (STRCASENEQ(conn->uri->scheme, "vpx") &&
-            STRCASENEQ(conn->uri->scheme, "esx") &&
-            STRCASENEQ(conn->uri->scheme, "gsx")) {
-            return VIR_DRV_OPEN_DECLINED;
-        }
-    } else {
-        if (plus - conn->uri->scheme != 3 ||
-            (STRCASENEQLEN(conn->uri->scheme, "vpx", 3) &&
-             STRCASENEQLEN(conn->uri->scheme, "esx", 3) &&
-             STRCASENEQLEN(conn->uri->scheme, "gsx", 3))) {
-            return VIR_DRV_OPEN_DECLINED;
-        }
-
-        virReportError(VIR_ERR_INVALID_ARG,
-                       _("Transport '%s' in URI scheme is not supported, try again "
-                         "without the transport part"), plus + 1);
-        return VIR_DRV_OPEN_ERROR;
-    }
-
     if (STRCASENEQ(conn->uri->scheme, "vpx") &&
         conn->uri->path && STRNEQ(conn->uri->path, "/")) {
         VIR_WARN("Ignoring unexpected path '%s' for non-vpx scheme '%s'",
@@ -5262,6 +5238,7 @@ static virHypervisorDriver esxHypervisorDriver = {
 
 
 static virConnectDriver esxConnectDriver = {
+    .uriSchemes = (const char *[]){ "vpx", "esx", "gsx", NULL },
     .hypervisorDriver = &esxHypervisorDriver,
     .interfaceDriver = &esxInterfaceDriver,
     .networkDriver = &esxNetworkDriver,
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index e512b626ea..4ad8855dcc 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -122,7 +122,6 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
                   unsigned int flags)
 {
     virDrvOpenStatus result = VIR_DRV_OPEN_ERROR;
-    char *plus;
     hypervPrivate *priv = NULL;
     char *username = NULL;
     char *password = NULL;
@@ -130,27 +129,9 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
     /* Decline if the URI is NULL or the scheme is NULL */
-    if (conn->uri == NULL || conn->uri->scheme == NULL)
+    if (conn->uri == NULL)
         return VIR_DRV_OPEN_DECLINED;
 
-    /* Decline if the scheme is not hyperv */
-    plus = strchr(conn->uri->scheme, '+');
-
-    if (plus == NULL) {
-        if (STRCASENEQ(conn->uri->scheme, "hyperv"))
-            return VIR_DRV_OPEN_DECLINED;
-    } else {
-        if (plus - conn->uri->scheme != 6 ||
-            STRCASENEQLEN(conn->uri->scheme, "hyperv", 6)) {
-            return VIR_DRV_OPEN_DECLINED;
-        }
-
-        virReportError(VIR_ERR_INVALID_ARG,
-                       _("Transport '%s' in URI scheme is not supported, try again "
-                         "without the transport part"), plus + 1);
-        return VIR_DRV_OPEN_ERROR;
-    }
-
     /* Require server part */
     if (conn->uri->server == NULL) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -1685,6 +1666,7 @@ hypervDebugHandler(const char *message, debug_level_e level,
 
 
 static virConnectDriver hypervConnectDriver = {
+    .uriSchemes = (const char *[]){ "hyperv", NULL },
     .hypervisorDriver = &hypervHypervisorDriver,
 };
 
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 3da958980f..ff3443c8e6 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -164,9 +164,6 @@ netcfConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "interface"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("interface state driver is not active"));
@@ -1221,6 +1218,7 @@ static virHypervisorDriver interfaceHypervisorDriver = {
 
 static virConnectDriver interfaceConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "interface", NULL },
     .hypervisorDriver = &interfaceHypervisorDriver,
     .interfaceDriver = &interfaceDriver,
 };
diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index 2b8a9da682..743aafd8ba 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -1208,9 +1208,6 @@ udevConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "interface"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("interface state driver is not active"));
@@ -1292,6 +1289,7 @@ static virHypervisorDriver udevHypervisorDriver = {
 
 static virConnectDriver udevConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "interface", NULL },
     .hypervisorDriver = &udevHypervisorDriver,
     .interfaceDriver = &udevIfaceDriver,
 };
diff --git a/src/libvirt.c b/src/libvirt.c
index 2b2b3ed425..cc1387341a 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1073,6 +1073,30 @@ virConnectOpenInternal(const char *name,
             continue;
         }
 
+        /* Filter drivers based on declared URI schemes */
+        if (virConnectDriverTab[i]->uriSchemes && ret->uri) {
+            bool matchScheme = false;
+            size_t s;
+            if (!ret->uri->scheme) {
+                VIR_DEBUG("No URI scheme, skipping driver with URI whitelist");
+                continue;
+            }
+            VIR_DEBUG("Checking for supported URI schemes");
+            for (s = 0; virConnectDriverTab[i]->uriSchemes[s] != NULL; s++) {
+                if (STREQ(ret->uri->scheme, virConnectDriverTab[i]->uriSchemes[s])) {
+                    VIR_DEBUG("Matched URI scheme '%s'", ret->uri->scheme);
+                    matchScheme = true;
+                    break;
+                }
+            }
+            if (!matchScheme) {
+                VIR_DEBUG("No matching URI scheme");
+                continue;
+            }
+        } else {
+            VIR_DEBUG("Matching any URI scheme for '%s'", ret->uri ? ret->uri->scheme : "");
+        }
+
         ret->driver = virConnectDriverTab[i]->hypervisorDriver;
         ret->interfaceDriver = virConnectDriverTab[i]->interfaceDriver;
         ret->networkDriver = virConnectDriverTab[i]->networkDriver;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index ce4741cf4c..872790e743 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -848,10 +848,6 @@ libxlConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL) {
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        /* Only xen scheme */
-        if (conn->uri->scheme == NULL || STRNEQ(conn->uri->scheme, "xen"))
-            return VIR_DRV_OPEN_DECLINED;
-
         /* Error if xen or libxl scheme specified but driver not started. */
         if (libxl_driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -6579,6 +6575,7 @@ static virHypervisorDriver libxlHypervisorDriver = {
 
 static virConnectDriver libxlConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "xen", NULL },
     .hypervisorDriver = &libxlHypervisorDriver,
 };
 
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 7a3e720d16..8b01abf75f 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -173,10 +173,6 @@ static virDrvOpenStatus lxcConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL) {
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (conn->uri->scheme == NULL ||
-            STRNEQ(conn->uri->scheme, "lxc"))
-            return VIR_DRV_OPEN_DECLINED;
-
         /* If path isn't '/' then they typoed, tell them correct path */
         if (conn->uri->path != NULL &&
             STRNEQ(conn->uri->path, "/") &&
@@ -5630,6 +5626,7 @@ static virHypervisorDriver lxcHypervisorDriver = {
 
 static virConnectDriver lxcConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "lxc", NULL },
     .hypervisorDriver = &lxcHypervisorDriver,
 };
 
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index ca48a0358c..98754d4471 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -883,9 +883,6 @@ networkConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "network"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (network_driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("network state driver is not active"));
@@ -5613,6 +5610,7 @@ static virHypervisorDriver networkHypervisorDriver = {
 
 static virConnectDriver networkConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "network", NULL },
     .hypervisorDriver = &networkHypervisorDriver,
     .networkDriver = &networkDriver,
 };
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index ad4938fcd6..a3e3d76dfc 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -59,9 +59,6 @@ nodeConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "nodedev"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("nodedev state driver is not active"));
diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c
index 4c251da88a..2101101bc6 100644
--- a/src/node_device/node_device_hal.c
+++ b/src/node_device/node_device_hal.c
@@ -784,6 +784,7 @@ static virHypervisorDriver halHypervisorDriver = {
 
 static virConnectDriver halConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "nodedev", NULL },
     .hypervisorDriver = &halHypervisorDriver,
     .nodeDeviceDriver = &halNodeDeviceDriver,
 };
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index d89b5ff7cc..de01816402 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1958,6 +1958,7 @@ static virHypervisorDriver udevHypervisorDriver = {
 
 static virConnectDriver udevConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "nodedev", NULL },
     .hypervisorDriver = &udevHypervisorDriver,
     .nodeDeviceDriver = &udevNodeDeviceDriver,
 };
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
index 71aca5a968..76289265a2 100644
--- a/src/nwfilter/nwfilter_driver.c
+++ b/src/nwfilter/nwfilter_driver.c
@@ -376,9 +376,6 @@ nwfilterConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "nwfilter"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("nwfilter state driver is not active"));
@@ -709,6 +706,7 @@ static virHypervisorDriver nwfilterHypervisorDriver = {
 
 static virConnectDriver nwfilterConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "nwfilter", NULL },
     .hypervisorDriver = &nwfilterHypervisorDriver,
     .nwfilterDriver = &nwfilterDriver,
 };
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index a56476475e..3eab3e47df 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1446,11 +1446,6 @@ static virDrvOpenStatus openvzConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL) {
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        /* If scheme isn't 'openvz', then its for another driver */
-        if (conn->uri->scheme == NULL ||
-            STRNEQ(conn->uri->scheme, "openvz"))
-            return VIR_DRV_OPEN_DECLINED;
-
         /* If path isn't /system, then they typoed, so tell them correct path */
         if (conn->uri->path == NULL ||
             STRNEQ(conn->uri->path, "/system")) {
@@ -2656,6 +2651,7 @@ static virHypervisorDriver openvzHypervisorDriver = {
 
 static virConnectDriver openvzConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "openvz", NULL },
     .hypervisorDriver = &openvzHypervisorDriver,
 };
 
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index cce7448abc..ddbd9144bc 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -1144,9 +1144,6 @@ phypConnectOpen(virConnectPtr conn,
     if (!conn || !conn->uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (conn->uri->scheme == NULL || STRNEQ(conn->uri->scheme, "phyp"))
-        return VIR_DRV_OPEN_DECLINED;
-
     if (conn->uri->server == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        "%s", _("Missing server name in phyp:// URI"));
@@ -3766,6 +3763,7 @@ static virInterfaceDriver phypInterfaceDriver = {
 };
 
 static virConnectDriver phypConnectDriver = {
+    .uriSchemes = (const char *[]){ "phyp", NULL },
     .hypervisorDriver = &phypHypervisorDriver,
     .interfaceDriver = &phypInterfaceDriver,
     .storageDriver = &phypStorageDriver,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ef890916dc..8a6d3f9af0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1146,13 +1146,6 @@ static virDrvOpenStatus qemuConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL) {
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        /* If URI isn't 'qemu' its definitely not for us */
-        if (conn->uri->scheme == NULL ||
-            STRNEQ(conn->uri->scheme, "qemu")) {
-            ret = VIR_DRV_OPEN_DECLINED;
-            goto cleanup;
-        }
-
         if (qemu_driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("qemu state driver is not active"));
@@ -21568,6 +21561,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
 
 static virConnectDriver qemuConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "qemu", NULL },
     .hypervisorDriver = &qemuHypervisorDriver,
 };
 
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index 06d116f07f..aedfa10dcc 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -529,9 +529,6 @@ secretConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "secret"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("secret state driver is not active"));
@@ -659,6 +656,7 @@ static virHypervisorDriver secretHypervisorDriver = {
 
 static virConnectDriver secretConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "secret", NULL },
     .hypervisorDriver = &secretHypervisorDriver,
     .secretDriver = &secretDriver,
 };
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 7eb5fad929..1a81733842 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -389,9 +389,6 @@ storageConnectOpen(virConnectPtr conn,
         /* Only hypervisor drivers are permitted to auto-open on NULL uri */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (STRNEQ_NULLABLE(conn->uri->scheme, "storage"))
-            return VIR_DRV_OPEN_DECLINED;
-
         if (driver == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("storage state driver is not active"));
@@ -2852,6 +2849,7 @@ static virHypervisorDriver storageHypervisorDriver = {
 
 static virConnectDriver storageConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "storage", NULL },
     .hypervisorDriver = &storageHypervisorDriver,
     .storageDriver = &storageDriver,
 };
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index de3943406e..7f9c7f751e 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1457,9 +1457,6 @@ testConnectOpen(virConnectPtr conn,
     if (!conn->uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "test"))
-        return VIR_DRV_OPEN_DECLINED;
-
     /* From this point on, the connection is for us. */
     if (!conn->uri->path
         || conn->uri->path[0] == '\0'
@@ -7062,6 +7059,7 @@ static virNodeDeviceDriver testNodeDeviceDriver = {
 
 static virConnectDriver testConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "test", NULL },
     .hypervisorDriver = &testHypervisorDriver,
     .interfaceDriver = &testInterfaceDriver,
     .networkDriver = &testNetworkDriver,
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 7fae561aff..2315cd4d15 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -1206,10 +1206,6 @@ static virDrvOpenStatus umlConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL) {
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (conn->uri->scheme == NULL ||
-            STRNEQ(conn->uri->scheme, "uml"))
-            return VIR_DRV_OPEN_DECLINED;
-
         /* Check path and tell them correct path if they made a mistake */
         if (uml_driver->privileged) {
             if (STRNEQ(conn->uri->path, "/system") &&
@@ -3014,6 +3010,7 @@ static virHypervisorDriver umlHypervisorDriver = {
 
 static virConnectDriver umlConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "uml", NULL },
     .hypervisorDriver = &umlHypervisorDriver,
 };
 
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 886b41b0b9..4c4c80d45b 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -520,10 +520,6 @@ vboxConnectOpen(virConnectPtr conn,
     if (conn->uri == NULL)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (conn->uri->scheme == NULL ||
-        STRNEQ(conn->uri->scheme, "vbox"))
-        return VIR_DRV_OPEN_DECLINED;
-
     if (conn->uri->path == NULL || STREQ(conn->uri->path, "")) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("no VirtualBox driver path specified (try vbox:///session)"));
diff --git a/src/vbox/vbox_driver.c b/src/vbox/vbox_driver.c
index e3880b4826..395fa8e3d6 100644
--- a/src/vbox/vbox_driver.c
+++ b/src/vbox/vbox_driver.c
@@ -58,9 +58,7 @@ static virDrvOpenStatus dummyConnectOpen(virConnectPtr conn,
 
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
-    if (conn->uri == NULL ||
-        conn->uri->scheme == NULL ||
-        STRNEQ(conn->uri->scheme, "vbox"))
+    if (conn->uri == NULL)
         return VIR_DRV_OPEN_DECLINED;
 
     if (conn->uri->path == NULL || STREQ(conn->uri->path, "")) {
@@ -96,6 +94,7 @@ static virHypervisorDriver vboxDriverDummy = {
 
 static virConnectDriver vboxConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "vbox", NULL },
     .hypervisorDriver = NULL,
 };
 
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
index 435b9ee6ff..6118e6fa13 100644
--- a/src/vmware/vmware_driver.c
+++ b/src/vmware/vmware_driver.c
@@ -134,12 +134,6 @@ vmwareConnectOpen(virConnectPtr conn,
         /* @TODO accept */
         return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (conn->uri->scheme == NULL ||
-            (STRNEQ(conn->uri->scheme, "vmwareplayer") &&
-             STRNEQ(conn->uri->scheme, "vmwarews") &&
-             STRNEQ(conn->uri->scheme, "vmwarefusion")))
-            return VIR_DRV_OPEN_DECLINED;
-
         /* If path isn't /session, then they typoed, so tell them correct path */
         if (conn->uri->path == NULL || STRNEQ(conn->uri->path, "/session")) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -1268,6 +1262,7 @@ static virHypervisorDriver vmwareHypervisorDriver = {
 
 static virConnectDriver vmwareConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "vmwareplayer", "vmwarews", "vmwarefusion", NULL },
     .hypervisorDriver = &vmwareHypervisorDriver,
 };
 
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 8842056ea4..f3047cad6c 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -361,19 +361,6 @@ vzConnectOpen(virConnectPtr conn,
     if (!conn->uri)
         return VIR_DRV_OPEN_DECLINED;
 
-    if (!conn->uri->scheme)
-        return VIR_DRV_OPEN_DECLINED;
-
-    if (STRNEQ(conn->uri->scheme, "vz") &&
-        STRNEQ(conn->uri->scheme, "parallels"))
-        return VIR_DRV_OPEN_DECLINED;
-
-    if (STREQ(conn->uri->scheme, "vz") && STRNEQ(conn->driver->name, "vz"))
-        return VIR_DRV_OPEN_DECLINED;
-
-    if (STREQ(conn->uri->scheme, "parallels") && STRNEQ(conn->driver->name, "Parallels"))
-        return VIR_DRV_OPEN_DECLINED;
-
     /* From this point on, the connection is for us. */
     if (STRNEQ_NULLABLE(conn->uri->path, "/system")) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -4140,6 +4127,7 @@ static virHypervisorDriver vzHypervisorDriver = {
 
 static virConnectDriver vzConnectDriver = {
     .localOnly = true,
+    .uriSchemes = (const char *[]){ "vz", NULL },
     .hypervisorDriver = &vzHypervisorDriver,
 };
 
@@ -4209,6 +4197,7 @@ vzRegister(void)
     parallelsHypervisorDriver.name = "Parallels";
     parallelsConnectDriver = vzConnectDriver;
     parallelsConnectDriver.hypervisorDriver = ¶llelsHypervisorDriver;
+    parallelsConnectDriver.uriSchemes = (const char *[]){ "parallels", NULL },
     if (virRegisterConnectDriver(&parallelsConnectDriver, true) < 0)
         return -1;
 
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index fb462cd3a1..86f9e7706d 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -146,10 +146,8 @@ xenapiConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
 
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
-    if (conn->uri == NULL || conn->uri->scheme == NULL ||
-        STRCASENEQ(conn->uri->scheme, "XenAPI")) {
+    if (conn->uri == NULL)
         return VIR_DRV_OPEN_DECLINED;
-    }
 
     if (conn->uri->server == NULL) {
         xenapiSessionErrorHandler(conn, VIR_ERR_INVALID_ARG,
@@ -2075,6 +2073,7 @@ static virHypervisorDriver xenapiHypervisorDriver = {
 
 
 static virConnectDriver xenapiConnectDriver = {
+    .uriSchemes = (const char *[]){ "xenapi", NULL },
     .hypervisorDriver = &xenapiHypervisorDriver,
 };
 
-- 
2.14.3




More information about the libvir-list mailing list