<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
Hi Alan,<br><br>I am still convinced that inability to get user name is not a good reason to terminate execution (with exception or fatal error). I am afraid that this could break existing programs that perform well when user name is not known. They can be even unconscious that they work in such strange conditions.<br><br>Looking at code near I can see that there is not consistent approach. Solaris/Linux part fails with exception if current directory is not known, while Windows part is optimistic about this. Maybe the best approach is somewhere between these extreme ones.<br><br>Just an idea: what about to put diagnostic message just in system property? So it may look something like<br><br>    user.name="?: GetUserName failed, GetLastError=1115: A system shutdown is in progress."<br><br>This way we provide better diagnostics than if we report plain "unknown" and at the same time we let application ignore failure if it is not relevant for it.<br><br><br>By the way, getting current directory on Windows is also slippery.<br>In code we inform GetCurrentDirectory that our buffer is twice longer than we actually reserved.<br><br>    /* Current directory */<br>    {<br>        WCHAR buf[MAX_PATH];<br>        GetCurrentDirectoryW(sizeof(buf), buf);<br>        sprops.user_dir = _wcsdup(buf);<br>    }<br><br>Again, this can be not an issue since it's not easy to create directory longer than MAX_PATH.<br><br>Regards,<br>Dmytro<br><br><hr id="stopSpelling">Date: Wed, 9 Feb 2011 12:50:04 +0000<br>From: Alan.Bateman@oracle.com<br>To: dmytro_sheyko@hotmail.com<br>CC: core-libs-dev@openjdk.java.net<br>Subject: Re: Some issues on identifying user.name on Windows<br><br>


<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<meta name="Generator" content="Microsoft SafeHTML">
  


Dmytro Sheyko wrote:
<blockquote cite="mid:SNT137-w12EBA64BB03D0FECDCAC128AED0@phx.gbl">
  <style>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Tahoma;}

</style>Hi,<br>
  <br>
Maybe it makes sense to use environment variables on Linux (and
Solaris) as well in order to minimize failure of "user.name" and
"user.home" detection, doesn't it?<br>
</blockquote>
Yes, I think this makes sense. Typically USER and LOGNAME are set (we
might just need to think about the sudo case).<br>
<br>
<blockquote cite="mid:SNT137-w12EBA64BB03D0FECDCAC128AED0@phx.gbl"><br>
As for Windows, many Win32 functions fail when system is shutting down,
and GetUserName shouldn't be an exception. But I don't know other
conditions till now.<br>
  <br>
I believe that JVM shouldn't stop working if user name can't be
determined because many applications do not need to know it at all.<br>
</blockquote>
The counter argument is that applications that do require it could fail
in unpredictable ways. I've seen a couple of cases but never Windows.
Another suggestion is to emit a warning, something that might be
feasible for debug/fastdebug builds (probably not product because
messages coming from the runtime can cause other problems, and can
confuse tests). Minimally we need something to make it easier to
diagnose.<br>
<br>
<blockquote cite="mid:SNT137-w12EBA64BB03D0FECDCAC128AED0@phx.gbl">Actually system properties don't seems very reliable
source for those applications that DO need user name. One can easily
cheat them by setting env var USERNAME (on Windows)<br>
or just passing -Duser.name in command line explicitly. I think this
kind of application needs separate API that provides true system
information and better diagnostics<br>
in problematic cases.<br>
  <br>
As for default value for "user.name" I changed my mind. I think we
shouldn't place "user.name" to system properties at all if user name
cannot be determined.<br>
(Of course, documenting this behavior well in System.getProperties()
javadoc)<br>
</blockquote>
I don't think this is an option because it would break existing code
that assumes user.name is set.<br>
<br>
<blockquote cite="mid:SNT137-w12EBA64BB03D0FECDCAC128AED0@phx.gbl">It would be easier to handle quite rare problematic cases
with following code<br>
  <br>
    String username = System.getProperty("user.name",
fallbackUsernameValue);<br>
  <br>
than with<br>
  <br>
    String username = System.getProperty("user.name");<br>
    if (username.equals("?") || username.equals("unknown")) {<br>
        username = fallbackUsernameValue;<br>
    }<br>
</blockquote>
We don't document "?" or "unknown" but it would not surprise me to find
code like this.<br>
<br>
Anyway back to your original patch, what would you think about
modifying it so that it throws an exception if GetUserNameW fails
rather than defaulting to "unknown"? You mentioned the "Windows is
shutting down" case (and you may be right on that) but I can't think of
any others except period insufficient resources in which case we'll
probably keel over anyway.  We can separate this from the Solaris/Linux
changes as that is the most likely places where it might fail and
default to "?" today.<br>
<br>
-Alan<br>
<br>
<br>                                        </body>
</html>