From 0d7909a3f98e1a9a1337115892aa2c309b38734d Mon Sep 17 00:00:00 2001 From: Charlie Fenton Date: Fri, 7 Mar 2014 04:28:32 -0800 Subject: [PATCH] Mac uninstaller: Fixes for fast user switching support --- mac_installer/uninstall.cpp | 51 ++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/mac_installer/uninstall.cpp b/mac_installer/uninstall.cpp index a1a38495b1..fe2f319caf 100644 --- a/mac_installer/uninstall.cpp +++ b/mac_installer/uninstall.cpp @@ -105,7 +105,7 @@ int main(int argc, char *argv[]) } strlcpy(pathToVBoxUninstallTool, pathToSelf, sizeof(pathToVBoxUninstallTool)); - strlcat(pathToVBoxUninstallTool, "/Contents/Resources/VirtualBox_Uninstall.tool", sizeof(pathToVBoxUninstallTool)); + strlcat(pathToVBoxUninstallTool, "/Contents/Resources/VirtualBox_Uninstall.tool", sizeof(pathToVBoxUninstallTool)); // To allow for branding, assume name of executable inside bundle is same as name of bundle p = strrchr(pathToSelf, '/'); // Assume name of executable inside bundle is same as name of bundle @@ -319,6 +319,7 @@ int main(int argc, char *argv[]) static OSStatus DoUninstall(void) { pid_t coreClientPID = 0; + pid_t BOINCManagerPID = 0; char cmd[1024]; char *p; passwd *pw; @@ -334,8 +335,36 @@ static OSStatus DoUninstall(void) { ShowMessage(false, false, false, "Permission OK after relaunch"); #endif - QuitOneProcess('BNC!'); // Quit any old instance of BOINC manager - sleep(2); + //TODO: It would be nice to get the app name from the bundle ID or signature + // so we don't have to try all 4 and to allow for future branded versions + + for (;;) { + BOINCManagerPID = FindProcessPID("BOINCManager", 0); + if (BOINCManagerPID == 0) break; + kill(BOINCManagerPID, SIGTERM); + sleep(2); + } + + for (;;) { + BOINCManagerPID = FindProcessPID("GridRepublic Desktop", 0); + if (BOINCManagerPID == 0) break; + kill(BOINCManagerPID, SIGTERM); + sleep(2); + } + + for (;;) { + BOINCManagerPID = FindProcessPID("Progress Thru Processors Desktop", 0); + if (BOINCManagerPID == 0) break; + kill(BOINCManagerPID, SIGTERM); + sleep(2); + } + + for (;;) { + BOINCManagerPID = FindProcessPID("Charity Engine Desktop", 0); + if (BOINCManagerPID == 0) break; + kill(BOINCManagerPID, SIGTERM); + sleep(2); + } // Core Client may still be running if it was started without Manager coreClientPID = FindProcessPID("boinc", 0); @@ -395,6 +424,10 @@ static OSStatus DoUninstall(void) { // Phase 4: Delete our files and directories at our installer's default locations // Remove everything we've installed, whether BOINC, GridRepublic, Progress Thru Processors or // Charity Engine + + //TODO: It would be nice to get the app name from the bundle ID or signature + // so we don't have to try all 4 and to allow for future branded versions + // These first 4 should already have been deleted by the above code, but do them anyway for safety system ("rm -rf /Applications/BOINCManager.app"); system ("rm -rf \"/Library/Screen Savers/BOINCSaver.saver\""); @@ -402,11 +435,11 @@ static OSStatus DoUninstall(void) { system ("rm -rf \"/Applications/GridRepublic Desktop.app\""); system ("rm -rf \"/Library/Screen Savers/GridRepublic.saver\""); - system ("rm -rf \"/Applications/Progress\\ Thru\\ Processors\\ Desktop.app\""); - system ("rm -rf \"/Library/Screen Savers/Progress\\ Thru\\ Processors.saver\""); + system ("rm -rf \"/Applications/Progress Thru Processors Desktop.app\""); + system ("rm -rf \"/Library/Screen Savers/Progress Thru Processors.saver\""); - system ("rm -rf \"/Applications/Charity\\ Engine\\ Desktop.app\""); - system ("rm -rf \"/Library/Screen Savers/Charity\\ Engine.saver\""); + system ("rm -rf \"/Applications/Charity Engine Desktop.app\""); + system ("rm -rf \"/Library/Screen Savers/Charity Engine.saver\""); // Delete any receipt from an older installer (which had // a wrapper application around the installer package.) @@ -736,6 +769,10 @@ static OSStatus CleanupAllVisibleUsers(void) // sprintf(s, "rm -f \"/Users/%s/Library/Preferences/BOINC Manager Preferences\"", human_user_name); // system (s); + // Delete per-user BOINC Manager and screensaver files + sprintf(s, "rm -fR \"/Users/%s/Library/Application Support/BOINC\"", human_user_name); + system (s); + // Set screensaver to "Computer Name" default screensaver only // if it was BOINC, GridRepublic, Progress Thru Processors or Charity Engine. changeSaver = false;