]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
VMware: Store vmrun binary's path in the driver
authorDoug Goldstein <cardoe@cardoe.com>
Sun, 15 Sep 2013 04:28:20 +0000 (23:28 -0500)
committerDoug Goldstein <cardoe@cardoe.com>
Fri, 20 Sep 2013 13:23:31 +0000 (08:23 -0500)
Rather than looking up the path to vmrun each time we call it, look it
up once and save it. This sets up the ability for us to detect where the
path is on Mac OS X and not have to look it up each time we execute it.

src/vmware/vmware_conf.c
src/vmware/vmware_conf.h
src/vmware/vmware_driver.c

index 3bb5610d2fea3e72f60b39f1d8447eed08ffbc5a..b33bddc11c36d8bff4284272319e4b96b9f68c5a 100644 (file)
@@ -50,6 +50,7 @@ vmwareFreeDriver(struct vmware_driver *driver)
     virObjectUnref(driver->domains);
     virObjectUnref(driver->caps);
     virObjectUnref(driver->xmlopt);
+    VIR_FREE(driver->vmrun);
     VIR_FREE(driver);
 }
 
@@ -144,7 +145,7 @@ vmwareLoadDomains(struct vmware_driver *driver)
 
     ctx.parseFileName = vmwareCopyVMXFileName;
 
-    cmd = virCommandNewArgList(VMRUN, "-T",
+    cmd = virCommandNewArgList(driver->vmrun, "-T",
                                vmwareDriverTypeToString(driver->type),
                                "list", NULL);
     virCommandSetOutputBuffer(cmd, &outbuf);
index 978f22bb57afe0c38e8fe49b3c492d89d03cd3ea..4b99d8e449eff0398906d67d8e4d08aeec4f083d 100644 (file)
@@ -21,7 +21,6 @@
 #ifndef VMWARE_CONF_H
 # define VMWARE_CONF_H
 
-# define VMRUN "vmrun"
 # define NOGUI "nogui"
 
 # include "internal.h"
@@ -48,6 +47,7 @@ struct vmware_driver {
     virDomainObjListPtr domains;
     int version;
     int type;
+    char *vmrun;
 };
 
 typedef struct _vmwareDomain {
index 9d674b61a37059ba90e4cd45894e1daeb05ae3a7..4e56971961834dcd93991547a896d8b90dd30216 100644 (file)
 #include "vmware_driver.h"
 #include "virstring.h"
 
+/* Various places we may find the "vmrun" binary,
+ * without a leading / it will be searched in PATH
+ */
+static const char * const vmrun_candidates[] = {
+    "vmrun",
+};
+
 static void
 vmwareDriverLock(struct vmware_driver *driver)
 {
@@ -85,7 +92,7 @@ vmwareConnectOpen(virConnectPtr conn,
                   unsigned int flags)
 {
     struct vmware_driver *driver;
-    char * vmrun = NULL;
+    size_t i;
 
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
@@ -114,18 +121,25 @@ vmwareConnectOpen(virConnectPtr conn,
     /* We now know the URI is definitely for this driver, so beyond
      * here, don't return DECLINED, always use ERROR */
 
-    vmrun = virFindFileInPath(VMRUN);
-
-    if (vmrun == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("%s utility is missing"), VMRUN);
+    if (VIR_ALLOC(driver) < 0)
         return VIR_DRV_OPEN_ERROR;
-    } else {
-        VIR_FREE(vmrun);
+
+    /* Find vmrun, which is what this driver uses to communicate to
+     * the VMware hypervisor. We look this up first since we use it
+     * for auto detection of the backend
+     */
+    for (i = 0; i < ARRAY_CARDINALITY(vmrun_candidates); i++) {
+        driver->vmrun = virFindFileInPath(vmrun_candidates[i]);
+        /* If we found one, we can stop looking */
+        if (driver->vmrun)
+            break;
     }
 
-    if (VIR_ALLOC(driver) < 0)
-        return VIR_DRV_OPEN_ERROR;
+    if (driver->vmrun == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("vmrun utility is missing"));
+        goto cleanup;
+    }
 
     if (virMutexInit(&driver->lock) < 0)
         goto cleanup;
@@ -200,7 +214,7 @@ vmwareUpdateVMStatus(struct vmware_driver *driver, virDomainObjPtr vm)
     int newState;
     int ret = -1;
 
-    cmd = virCommandNewArgList(VMRUN, "-T",
+    cmd = virCommandNewArgList(driver->vmrun, "-T",
                                vmwareDriverTypeToString(driver->type),
                                "list", NULL);
     virCommandSetOutputBuffer(cmd, &outbuf);
@@ -251,7 +265,7 @@ vmwareStopVM(struct vmware_driver *driver,
              virDomainShutoffReason reason)
 {
     const char *cmd[] = {
-        VMRUN, "-T", PROGRAM_SENTINEL, "stop",
+        driver->vmrun, "-T", PROGRAM_SENTINEL, "stop",
         PROGRAM_SENTINEL, "soft", NULL
     };
 
@@ -272,7 +286,7 @@ static int
 vmwareStartVM(struct vmware_driver *driver, virDomainObjPtr vm)
 {
     const char *cmd[] = {
-        VMRUN, "-T", PROGRAM_SENTINEL, "start",
+        driver->vmrun, "-T", PROGRAM_SENTINEL, "start",
         PROGRAM_SENTINEL, PROGRAM_SENTINEL, NULL
     };
     const char *vmxPath = ((vmwareDomainPtr) vm->privateData)->vmxPath;
@@ -445,7 +459,7 @@ vmwareDomainSuspend(virDomainPtr dom)
 
     virDomainObjPtr vm;
     const char *cmd[] = {
-      VMRUN, "-T", PROGRAM_SENTINEL, "pause",
+      driver->vmrun, "-T", PROGRAM_SENTINEL, "pause",
       PROGRAM_SENTINEL, NULL
     };
     int ret = -1;
@@ -494,7 +508,7 @@ vmwareDomainResume(virDomainPtr dom)
 
     virDomainObjPtr vm;
     const char *cmd[] = {
-        VMRUN, "-T", PROGRAM_SENTINEL, "unpause", PROGRAM_SENTINEL,
+        driver->vmrun, "-T", PROGRAM_SENTINEL, "unpause", PROGRAM_SENTINEL,
         NULL
     };
     int ret = -1;
@@ -543,7 +557,7 @@ vmwareDomainReboot(virDomainPtr dom, unsigned int flags)
     const char * vmxPath = NULL;
     virDomainObjPtr vm;
     const char *cmd[] = {
-        VMRUN, "-T", PROGRAM_SENTINEL,
+        driver->vmrun, "-T", PROGRAM_SENTINEL,
         "reset", PROGRAM_SENTINEL, "soft", NULL
     };
     int ret = -1;