This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Path: Compute user.home properly on MinGW
- From: Mohan Embar <gnustuff at thisiscool dot com>
- To: GCJ Patches <java-patches at gcc dot gnu dot org>
- Cc: taras dot judge at shaw dot ca
- Date: Tue, 14 Oct 2003 06:03:10 -0500
- Subject: Path: Compute user.home properly on MinGW
- Reply-to: gnustuff at thisiscool dot com
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.