int RegisterXULRunner(PRBool aRegisterGlobally, nsIFile* aLocation, const GREProperty *aProperties, PRUint32 aPropertiesLen, const char *aGREMilestone) { // Register ourself in the windows registry, and record what key we created // for future unregistration. nsresult rv; PRBool irv; int i; nsCString greHome; rv = aLocation->GetNativePath(greHome); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIFile> savedInfoFile; aLocation->Clone(getter_AddRefs(savedInfoFile)); nsCOMPtr<nsILocalFile> localSaved(do_QueryInterface(savedInfoFile)); if (!localSaved) return PR_FALSE; const char *infoname = aRegisterGlobally ? kRegFileGlobal : kRegFileUser; localSaved->AppendNative(nsDependentCString(infoname)); PRFileDesc* fd = nsnull; rv = localSaved->OpenNSPRFileDesc(PR_CREATE_FILE | PR_RDWR, 0664, &fd); if (NS_FAILED(rv)) { // XXX report error? return PR_FALSE; } HKEY rootKey = NULL; char keyName[MAXPATHLEN]; PRInt32 r; if (::RegCreateKeyEx(aRegisterGlobally ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, kRegKeyRoot, NULL, NULL, 0, KEY_WRITE, NULL, &rootKey, NULL) != ERROR_SUCCESS) { irv = PR_FALSE; goto reg_end; } r = PR_Read(fd, keyName, MAXPATHLEN); if (r < 0) { irv = PR_FALSE; goto reg_end; } if (r > 0) { keyName[r] = '\0'; // There was already a .reginfo file, let's see if we are already // registered. HKEY existing = NULL; if (::RegOpenKeyEx(rootKey, keyName, NULL, KEY_QUERY_VALUE, &existing) == ERROR_SUCCESS) { fprintf(stderr, "Warning: Registry key Software\\mozilla.org\\GRE\\%s already exists.\n" "No action was performed.\n", keyName); irv = PR_FALSE; goto reg_end; } PR_Close(fd); fd = nsnull; rv = localSaved->OpenNSPRFileDesc(PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664, &fd); if (NS_FAILED(rv)) { // XXX report error? irv = PR_FALSE; goto reg_end; } } strcpy(keyName, aGREMilestone); rv = MakeVersionKey(rootKey, keyName, greHome, aProperties, aPropertiesLen, aGREMilestone); if (NS_SUCCEEDED(rv)) { PR_Write(fd, keyName, strlen(keyName)); irv = PR_TRUE; goto reg_end; } for (i = 0; i < 1000; ++i) { sprintf(keyName, "%s_%i", aGREMilestone, i); rv = MakeVersionKey(rootKey, keyName, greHome, aProperties, aPropertiesLen, aGREMilestone); if (NS_SUCCEEDED(rv)) { PR_Write(fd, keyName, strlen(keyName)); irv = PR_TRUE; goto reg_end; } } irv = PR_FALSE; reg_end: if (fd) PR_Close(fd); if (rootKey) ::RegCloseKey(rootKey); return irv; }
void UnregisterXULRunner(PRBool aRegisterGlobally, nsIFile* aLocation) { nsresult rv; char root[MAXPATHLEN] = "/etc/gre.d"; if (!aRegisterGlobally) { char *home = PR_GetEnv("HOME"); if (!home || !*home) return; PR_snprintf(root, MAXPATHLEN, "%s/.gre.d", home); } nsCOMPtr<nsIFile> savedInfoFile; aLocation->Clone(getter_AddRefs(savedInfoFile)); nsCOMPtr<nsILocalFile> localSaved (do_QueryInterface(savedInfoFile)); if (!localSaved) return; const char *infoname = aRegisterGlobally ? kRegFileGlobal : kRegFileUser; localSaved->AppendNative(nsDependentCString(infoname)); PRFileDesc* fd = nsnull; rv = localSaved->OpenNSPRFileDesc(PR_RDONLY, 0, &fd); if (NS_FAILED(rv)) { // XXX report error? return; } char keyName[MAXPATHLEN]; PRInt32 r = PR_Read(fd, keyName, MAXPATHLEN); PR_Close(fd); localSaved->Remove(PR_FALSE); if (r <= 0) return; keyName[r] = '\0'; char regFile[MAXPATHLEN]; PR_snprintf(regFile, MAXPATHLEN, "%s/%s.conf", root, keyName); nsCOMPtr<nsILocalFile> lf; rv = NS_NewNativeLocalFile(nsDependentCString(regFile), PR_FALSE, getter_AddRefs(lf)); if (NS_FAILED(rv)) return; nsINIParser p; rv = p.Init(lf); if (NS_FAILED(rv)) return; rv = p.GetString(kGREBuildID, "GRE_PATH", root, MAXPATHLEN); if (NS_FAILED(rv)) return; rv = NS_NewNativeLocalFile(nsDependentCString(root), PR_TRUE, getter_AddRefs(lf)); if (NS_FAILED(rv)) return; PRBool eq; if (NS_SUCCEEDED(aLocation->Equals(lf, &eq)) && eq) PR_Delete(regFile); }
void UnregisterXULRunner(PRBool aGlobal, nsIFile* aLocation, const char *aGREMilestone) { nsCOMPtr<nsIFile> savedInfoFile; aLocation->Clone(getter_AddRefs(savedInfoFile)); nsCOMPtr<nsILocalFile> localSaved (do_QueryInterface(savedInfoFile)); if (!localSaved) return; const char *infoname = aGlobal ? kRegFileGlobal : kRegFileUser; localSaved->AppendNative(nsDependentCString(infoname)); PRFileDesc* fd = nsnull; nsresult rv = localSaved->OpenNSPRFileDesc(PR_RDONLY, 0, &fd); if (NS_FAILED(rv)) { // XXX report error? return; } char keyName[MAXPATHLEN]; PRInt32 r = PR_Read(fd, keyName, MAXPATHLEN); PR_Close(fd); localSaved->Remove(PR_FALSE); if (r <= 0) return; keyName[r] = '\0'; HKEY rootKey = NULL; if (::RegOpenKeyEx(aGlobal ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, kRegKeyRoot, 0, KEY_READ, &rootKey) != ERROR_SUCCESS) return; HKEY subKey = NULL; if (::RegOpenKeyEx(rootKey, keyName, 0, KEY_READ, &subKey) == ERROR_SUCCESS) { char regpath[MAXPATHLEN]; DWORD reglen = MAXPATHLEN; if (::RegQueryValueEx(subKey, "GreHome", NULL, NULL, (BYTE*) regpath, ®len) == ERROR_SUCCESS) { nsCOMPtr<nsILocalFile> regpathfile; rv = NS_NewNativeLocalFile(nsDependentCString(regpath), PR_FALSE, getter_AddRefs(regpathfile)); PRBool eq; if (NS_SUCCEEDED(rv) && NS_SUCCEEDED(aLocation->Equals(regpathfile, &eq)) && !eq) { // We think we registered for this key, but it doesn't point to // us any more! fprintf(stderr, "Warning: Registry key Software\\mozilla.org\\GRE\\%s points to\n" "alternate path '%s'; unregistration was not successful.\n", keyName, regpath); ::RegCloseKey(subKey); ::RegCloseKey(rootKey); return; } } ::RegCloseKey(subKey); } ::RegDeleteKey(rootKey, keyName); ::RegCloseKey(rootKey); }
PRBool RegisterXULRunner(PRBool aRegisterGlobally, nsIFile* aLocation, const GREProperty *aProperties, PRUint32 aPropertiesLen) { // Register ourself in /etc/gre.d or ~/.gre.d/ and record what key we created // for future unregistration. nsresult rv; char root[MAXPATHLEN] = "/etc/gre.d"; if (!aRegisterGlobally) { char *home = PR_GetEnv("HOME"); if (!home || !*home) return PR_FALSE; PR_snprintf(root, MAXPATHLEN, "%s/.gre.d", home); } nsCAutoString greHome; rv = aLocation->GetNativePath(greHome); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIFile> savedInfoFile; aLocation->Clone(getter_AddRefs(savedInfoFile)); nsCOMPtr<nsILocalFile> localSaved(do_QueryInterface(savedInfoFile)); if (!localSaved) return PR_FALSE; const char *infoname = aRegisterGlobally ? kRegFileGlobal : kRegFileUser; localSaved->AppendNative(nsDependentCString(infoname)); AutoFDClose fd; rv = localSaved->OpenNSPRFileDesc(PR_CREATE_FILE | PR_RDWR, 0664, &fd); // XXX report error? if (NS_FAILED(rv)) return PR_FALSE; char keyName[MAXPATHLEN]; PRInt32 r = PR_Read(fd, keyName, MAXPATHLEN); if (r < 0) return PR_FALSE; char regfile[MAXPATHLEN]; if (r > 0) { keyName[r] = '\0'; PR_snprintf(regfile, MAXPATHLEN, "%s/%s.conf", root, keyName); // There was already a .reginfo file, let's see if we are already // registered. if (access(regfile, R_OK) == 0) { fprintf(stderr, "Warning: Configuration file '%s' already exists.\n" "No action was performed.\n", regfile); return PR_FALSE; } rv = localSaved->OpenNSPRFileDesc(PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664, &fd); if (NS_FAILED(rv)) return PR_FALSE; } if (access(root, R_OK | X_OK) && mkdir(root, 0775)) { fprintf(stderr, "Error: could not create '%s'.\n", root); return PR_FALSE; } PR_snprintf(regfile, MAXPATHLEN, "%s/%s.conf", root, kGREBuildID); if (MakeConfFile(regfile, greHome, aProperties, aPropertiesLen)) { PR_Write(fd, kGREBuildID, sizeof(kGREBuildID) - 1); return PR_TRUE; } for (int i = 0; i < UNIQ_LOOP_LIMIT; ++i) { static char buildID[30]; sprintf(buildID, "%s_%i", kGREBuildID, i); PR_snprintf(regfile, MAXPATHLEN, "%s/%s.conf", root, buildID); if (MakeConfFile(regfile, greHome, aProperties, aPropertiesLen)) { PR_Write(fd, buildID, strlen(buildID)); return PR_TRUE; } } return PR_FALSE; }