Browse Source

b=596951, r=mfinkle, Relative path support for webapp and profile

matthew.gertner@gmail.com 14 years ago
parent
commit
5f6170a0dd
1 changed files with 25 additions and 13 deletions
  1. 25 13
      client/stub/nsPrismStub.cpp

+ 25 - 13
client/stub/nsPrismStub.cpp

@@ -49,6 +49,7 @@
 #elif defined(XP_MACOSX)
 #include <CFBundle.h>
 #include <unistd.h>
+#include <sys/stat.h>
 #define PATH_SEPARATOR_CHAR '/'
 #elif defined (XP_OS2)
 #define INCL_DOS
@@ -129,26 +130,38 @@ private:
   nsXREAppData* mAppData;
 };
 
+PRBool gEnvSet = PR_FALSE;
+
 PRBool PR_CALLBACK SetEnvironmentVariable(const char* aString, const char* aValue, void* aClosure)
 {
-  if (aClosure) {
-    // Let the caller know that we set something
-    *((PRBool *) aClosure) = PR_TRUE;
-  }
+  gEnvSet = PR_TRUE;
 
-  // Only need this on OS X
-#if defined(XP_MACOSX)
-  setenv(aString, aValue, 1);
-#endif
 #if defined(XP_WIN)
   char buffer[4096];
   sprintf(buffer, "%s=%s", aString, aValue);
   putenv(buffer);
+#else
+  // Check whether we are setting a variable that needs to support relative paths
+  char resolvedPath[MAXPATHLEN];
+  if (aValue[0] != '/' && aClosure &&
+    (!strcmp(aString, "GRE_HOME") || !strcmp(aString, "PRISM_HOME") || !strcmp(aString, "XRE_PROFILE_PATH"))) {
+    char* basePath = (char *) aClosure;
+    char path[MAXPATHLEN];
+    strcpy(path, basePath);
+    // Get the path relative to the parent of the base path, since the base path is the full path of application.ini including the filename component
+    strcat(path, "/../");
+    strcat(path, aValue);
+    if (realpath(path, resolvedPath)) {
+      aValue = resolvedPath;
+    }
+  }
+
+  setenv(aString, aValue, 1);
 #endif
+
   return PR_TRUE;
 }
 
-
 XRE_CreateAppDataType XRE_CreateAppData;
 XRE_FreeAppDataType XRE_FreeAppData;
 XRE_mainType XRE_main;
@@ -368,13 +381,12 @@ main(int argc, char **argv)
   }
   
   // Register any environment variables. This is Prism-specific.
-  PRBool found = PR_FALSE;
-  parser.GetStrings("Environment", SetEnvironmentVariable, &found);
-  if (!found && strlen(overridePath) > 0) {
+  parser.GetStrings("Environment", SetEnvironmentVariable, iniPath);
+  if (!gEnvSet && strlen(overridePath) > 0) {
     // Look in override.ini as well
     nsINIParser overrideParser;
     if (NS_SUCCEEDED(overrideParser.Init(overridePath))) {
-      overrideParser.GetStrings("Environment", SetEnvironmentVariable, nsnull);
+      overrideParser.GetStrings("Environment", SetEnvironmentVariable, iniPath);
     }
   }