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(a)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 = ¨HypervisorDriver,
};
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(¶llelsConnectDriver, 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