This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Path: Compute user.home properly on MinGW


Hi All,

This attempts to fix the issues computing user.home
which Taras reported here:

http://gcc.gnu.org/ml/java/2003-10/msg00046.html

It also attempts to support legacy versions of
Windows (9X and NT).

Taras: Can you take a glance at this?

-- Mohan
http://www.thisiscool.com/
http://www.animalsong.org/

ChangeLog
2003-10-14  Mohan Embar  <gnustuff@thisiscool.com>

	* win32.cc: (dirExists) Internal helper function to
	test for directory existence.
	(computeUserHome) New helper function refactored out
	of _Jv_platform_initProperties. Uses USERPROFILE
	instead of HOMEDIR and attempts to support Win9X and NT.
	(_Jv_platform_initProperties) Use computeUserHome.

Index: win32.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/win32.cc,v
retrieving revision 1.16
diff -u -2 -r1.16 win32.cc
--- win32.cc	29 Aug 2003 04:21:00 -0000	1.16
+++ win32.cc	14 Oct 2003 11:01:01 -0000
@@ -177,4 +177,41 @@
 }
 
+static bool dirExists (const char* dir)
+{
+  DWORD dwAttrs = ::GetFileAttributes (dir);
+  return dwAttrs != 0xFFFFFFFF &&
+    (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) != 0;
+}
+
+static void computeUserHome(char* userHome, const char* userId)
+{
+  char* uh = ::getenv ("USERPROFILE");
+  if (uh)
+    {
+      strcpy(userHome, uh);
+    }
+  else
+    {
+      // Make a half-hearted attempt to support this
+      // legacy version of Windows. Try %WINDIR%\Profiles\%USERNAME%
+      // and failing this, use %WINDIR%.
+      //
+      // See:http://java.sun.com/docs/books/tutorial/security1.2/summary/files.html#UserPolicy
+      //
+      // To do this correctly, we'd have to factor in the
+      // Windows version, but if we did that, then this attempt
+      // wouldn't be half-hearted.
+      char userHomePath[MAX_PATH], winHome[MAX_PATH];
+      ::GetWindowsDirectory(winHome, MAX_PATH);
+        // assume this call always succeeds
+
+      sprintf(userHomePath, "%s\\Profiles\\%s", winHome, userId);
+      if (dirExists (userHomePath))
+        strcpy(userHome, userHomePath);
+      else
+        strcpy(userHome, winHome);
+    }
+}
+
 // Set platform-specific System properties.
 void
@@ -205,35 +242,12 @@
   // Use GetUserName to set 'user.name'.
   buflen = 257;  // UNLEN + 1
-  buffer = (char *) _Jv_MallocUnchecked (buflen);
-  if (buffer != NULL)
-    {
-      if (GetUserName (buffer, &buflen))
-        SET ("user.name", buffer);
-      _Jv_Free (buffer);
-    }
-
-  // According to the api documentation for 'GetWindowsDirectory()', the
-  // environmental variable HOMEPATH always specifies the user's home
-  // directory or a default directory.  On the 3 windows machines I checked
-  // only 1 had it set.  If it's not set, JDK1.3.1 seems to set it to
-  // the windows directory, so we'll do the same.
-  char *userHome = NULL;
-  if ((userHome = ::getenv ("HOMEPATH")) == NULL )
-    {
-      // Check HOME since it's what I use.
-      if ((userHome = ::getenv ("HOME")) == NULL )
-        {
-          // Not found - use the windows directory like JDK1.3.1 does.
-          char *winHome = (char *) _Jv_MallocUnchecked (MAX_PATH);
-          if (winHome != NULL)
-            {
-              if (GetWindowsDirectory (winHome, MAX_PATH))
-        SET ("user.home", winHome);
-              _Jv_Free (winHome);
-            }
-        }
-     }
-  if (userHome != NULL)
-    SET ("user.home", userHome);
+  char userName[buflen];
+  if (GetUserName (userName, &buflen))
+    SET ("user.name", userName);
+
+  // Set user.home
+  char userHome[MAX_PATH];
+  computeUserHome(userHome, userName);
+  SET ("user.home", userHome);
 
   // Get and set some OS info.




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]