From 748e241eab69462ae57751a8b8ce58bba4ceb520 Mon Sep 17 00:00:00 2001 From: Mohan Embar Date: Fri, 31 Oct 2003 03:31:54 +0000 Subject: win32.cc: (dirExists) Internal helper function to test for directory existence. * win32.cc: (dirExists) Internal helper function to test for directory existence. (getUserHome) 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 getUserHome. From-SVN: r73117 --- libjava/ChangeLog | 9 +++++++ libjava/win32.cc | 76 ++++++++++++++++++++++++++++++++----------------------- 2 files changed, 54 insertions(+), 31 deletions(-) (limited to 'libjava') diff --git a/libjava/ChangeLog b/libjava/ChangeLog index db88090..7385af6 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,14 @@ 2003-10-30 Mohan Embar + * win32.cc: (dirExists) Internal helper function to + test for directory existence. + (getUserHome) 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 getUserHome. + +2003-10-30 Mohan Embar + PR libgcj/11521: * gnu/java/net/natPlainSocketImplWin32.cc (bind): Don't use SO_REUSEADDR diff --git a/libjava/win32.cc b/libjava/win32.cc index e44b7b2..3bf1391 100644 --- a/libjava/win32.cc +++ b/libjava/win32.cc @@ -177,6 +177,43 @@ __mingwthr_key_dtor (DWORD, void (*) (void *)) return 0; } +static bool dirExists (const char* dir) +{ + DWORD dwAttrs = ::GetFileAttributes (dir); + return dwAttrs != 0xFFFFFFFF && + (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) != 0; +} + +static void getUserHome(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 _Jv_platform_initProperties (java::util::Properties* newprops) @@ -205,37 +242,14 @@ _Jv_platform_initProperties (java::util::Properties* newprops) // 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]; + getUserHome(userHome, userName); + SET ("user.home", userHome); // Get and set some OS info. OSVERSIONINFO osvi; -- cgit v1.1