diff --git a/client/hostinfo_unix.cpp b/client/hostinfo_unix.cpp index 6f0442ed1965867538278ff2bfb83d4fdb97725a..7e47237bcf74c9f38b44047efb32169ca3db020e 100644 --- a/client/hostinfo_unix.cpp +++ b/client/hostinfo_unix.cpp @@ -1224,33 +1224,47 @@ bool isDualGPUMacBook() { // see if Virtualbox is installed // +static const struct dir_vbox_locations { + const char *dir; +} vbox_locations[] = { + { "/usr/bin/VboxManage" }, + { "/usr/local/bin/VboxManage" }, + // add other ifdefs here as necessary. + { NULL }, +}; + int HOST_INFO::get_virtualbox_version() { char path[MAXPATHLEN]; char cmd [MAXPATHLEN+35]; char buf[256]; + int i = 0; FILE* fd; - safe_strcpy(path, "/usr/bin/VBoxManage"); - - if (boinc_file_exists(path)) { - if (access(path, X_OK)) { - return 0; - } - safe_strcpy(cmd, path); - safe_strcat(cmd, " --version"); - fd = popen(cmd, "r"); - if (fd) { - if (fgets(buf, sizeof(buf), fd)) { - strip_whitespace(buf); - int n, a,b,c; - n = sscanf(buf, "%d.%d.%d", &a, &b, &c); - if (n == 3) { - strcpy(virtualbox_version, buf); - } - } - pclose(fd); - } - } + do { + safe_strcpy(path, vbox_locations[i].dir); + + if (boinc_file_exists(path)) { + if (access(path, X_OK)) { + return 0; + } + safe_strcpy(cmd, path); + safe_strcat(cmd, " --version"); + fd = popen(cmd, "r"); + if (fd) { + if (fgets(buf, sizeof(buf), fd)) { + strip_whitespace(buf); + int n, a,b,c; + n = sscanf(buf, "%d.%d.%d", &a, &b, &c); + if (n == 3) { + strcpy(virtualbox_version, buf); + } + } + pclose(fd); + } + } + + ++i; + } while (vbox_locations[i].dir != NULL); return 0; }