]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
hyperv: Report an error for acceptable URI schemes with a transport
authorMatthias Bolte <matthias.bolte@googlemail.com>
Tue, 27 Sep 2011 11:11:14 +0000 (13:11 +0200)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Thu, 29 Sep 2011 08:26:18 +0000 (10:26 +0200)
Before, URIs such as hyperv+ssh:// have been declined by the Hyper-V
driver resulting in the remote driver trying to connect to an
non-existing libvirtd.

Now such URIs trigger an error in the yper-V driver suggesting to
try again without the transport part in the scheme.

src/hyperv/hyperv_driver.c

index b022fee7f29f5c0f8e6497425f2528d0d7efb4e6..39b55f8330fbcd2a6ac87e794f17313d33c1781f 100644 (file)
@@ -69,6 +69,7 @@ static virDrvOpenStatus
 hypervOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
 {
     virDrvOpenStatus result = VIR_DRV_OPEN_ERROR;
+    char *plus;
     hypervPrivate *priv = NULL;
     char *username = NULL;
     char *password = NULL;
@@ -77,12 +78,30 @@ hypervOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
 
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
-    /* Decline if the URI is NULL or the scheme is not hyperv */
-    if (conn->uri == NULL || conn->uri->scheme == NULL ||
-        STRCASENEQ(conn->uri->scheme, "hyperv")) {
+    /* Decline if the URI is NULL or the scheme is NULL */
+    if (conn->uri == NULL || conn->uri->scheme == 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;
+        }
+
+        HYPERV_ERROR(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) {
         HYPERV_ERROR(VIR_ERR_INVALID_ARG, "%s",