* win32.cc: (dirExists) Internal helper function to
authormembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Oct 2003 03:31:54 +0000 (03:31 +0000)
committermembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Oct 2003 03:31:54 +0000 (03:31 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73117 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/win32.cc

index db88090..7385af6 100644 (file)
@@ -1,5 +1,14 @@
 2003-10-30  Mohan Embar  <gnustuff@thisiscool.com>
 
+       * 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  <gnustuff@thisiscool.com>
+
        PR libgcj/11521:
        * gnu/java/net/natPlainSocketImplWin32.cc
        (bind): Don't use SO_REUSEADDR
index e44b7b2..3bf1391 100644 (file)
@@ -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;