[libvirt] [PATCH 1/2] VMware: Support more than 2 driver backends

Doug Goldstein cardoe at cardoe.com
Fri Sep 20 20:06:50 UTC 2013


Currently the VMware version check code only supports two types of
VMware backends, Workstation and Player. But in the near future we will
have an additional one so we need to support more. Additionally, we
discover and cache the path to the vmrun binary so we should use that
path when using the cooresponding binary from the VMware VIX SDK.
---
 src/vmware/vmware_conf.c   | 23 ++++++++++++++++++++---
 src/vmware/vmware_driver.c | 20 ++++++++++++++++++--
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c
index 261a4f6..d7ea8c4 100644
--- a/src/vmware/vmware_conf.c
+++ b/src/vmware/vmware_conf.c
@@ -257,10 +257,25 @@ vmwareExtractVersion(struct vmware_driver *driver)
 {
     unsigned long version = 0;
     int ret = -1;
-    virCommandPtr cmd;
+    virCommandPtr cmd = NULL;
     char * outbuf = NULL;
-    const char * bin = (driver->type == VMWARE_DRIVER_PLAYER) ?
-                 "vmplayer" : "vmware";
+    char *bin = NULL;
+    char *vmwarePath = NULL;
+
+    if ((vmwarePath = mdir_name(driver->vmrun)) == NULL)
+        goto cleanup;
+
+    switch (driver->type) {
+        case VMWARE_DRIVER_PLAYER:
+            if (virAsprintf(&bin, "%s/%s", vmwarePath, "vmplayer"))
+                goto cleanup;
+            break;
+
+        case VMWARE_DRIVER_WORKSTATION:
+            if (virAsprintf(&bin, "%s/%s", vmwarePath, "vmware"))
+                goto cleanup;
+            break;
+    }
 
     cmd = virCommandNewArgList(bin, "-v", NULL);
     virCommandSetOutputBuffer(cmd, &outbuf);
@@ -276,6 +291,8 @@ vmwareExtractVersion(struct vmware_driver *driver)
 cleanup:
     virCommandFree(cmd);
     VIR_FREE(outbuf);
+    VIR_FREE(bin);
+    VIR_FREE(vmwarePath);
     return ret;
 }
 
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
index 4e56971..01d65ed 100644
--- a/src/vmware/vmware_driver.c
+++ b/src/vmware/vmware_driver.c
@@ -93,6 +93,7 @@ vmwareConnectOpen(virConnectPtr conn,
 {
     struct vmware_driver *driver;
     size_t i;
+    char *tmp;
 
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
@@ -144,8 +145,23 @@ vmwareConnectOpen(virConnectPtr conn,
     if (virMutexInit(&driver->lock) < 0)
         goto cleanup;
 
-    driver->type = STRNEQ(conn->uri->scheme, "vmwareplayer") ?
-      VMWARE_DRIVER_WORKSTATION : VMWARE_DRIVER_PLAYER;
+    if ((tmp = STRSKIP(conn->uri->scheme, "vmware")) == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to parse URI "
+                       "scheme '%s'"), conn->uri->scheme);
+        goto cleanup;
+    }
+
+    driver->type = -1;
+    for (i = 0; i < VMWARE_DRIVER_LAST; i++) {
+        if (STREQ(tmp, vmwareDriverTypeToString(i)))
+            driver->type = i;
+    }
+
+    if (driver->type == -1) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to find valid "
+                       "requested VMware backend '%s'"), tmp);
+        goto cleanup;
+    }
 
     if (!(driver->domains = virDomainObjListNew()))
         goto cleanup;
-- 
1.8.1.5




More information about the libvir-list mailing list