Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r--winsup/cygwin/uinfo.cc41
1 files changed, 31 insertions, 10 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 60db38e76..8ea3e1ab0 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -38,14 +38,16 @@ void
cygheap_user::init ()
{
WCHAR user_name[UNLEN + 1];
- DWORD user_name_len = UNLEN + 1;
+ DWORD user_name_len;
- if (!GetUserNameW (user_name, &user_name_len))
- wcpcpy (user_name, L"unknown");
-
- char mb_user_name[user_name_len = sys_wcstombs (NULL, 0, user_name)];
- sys_wcstombs (mb_user_name, user_name_len, user_name);
- set_name (mb_user_name);
+ user_name_len = GetEnvironmentVariableW (L"USERNAME", user_name, UNLEN + 1);
+ if (user_name_len)
+ {
+ user_name[UNLEN] = L'\0';
+ char mb_user_name[user_name_len = sys_wcstombs (NULL, 0, user_name)];
+ sys_wcstombs (mb_user_name, user_name_len, user_name);
+ set_name (mb_user_name);
+ }
DWORD siz;
PSECURITY_DESCRIPTOR psd;
@@ -96,10 +98,29 @@ internal_getlogin (cygheap_user &user)
{
struct passwd *pw = NULL;
- cygpsid psid = user.sid ();
- pw = internal_getpwsid (psid);
+ /* Handle a border case. If neither $USERNAME, nor /etc/passwd exists,
+ we tryto fetch the username from the system now. */
+ if (!user.name () || !*user.name ())
+ {
+ WCHAR user_name[UNLEN + 1];
+ DWORD user_name_len = UNLEN + 1;
+
+ if (GetUserNameW (user_name, &user_name_len))
+ {
+ char mb_user_name[user_name_len = sys_wcstombs (NULL, 0, user_name)];
+ sys_wcstombs (mb_user_name, user_name_len, user_name);
+ user.set_name (mb_user_name);
+ }
+ else
+ user.set_name ("unknown");
+ }
+ else
+ {
+ cygpsid psid = user.sid ();
+ pw = internal_getpwsid (psid);
+ }
- if (!pw && !(pw = internal_getpwnam (user.name ()))
+ if (!pw && !(pw = internal_getpwnam (user.name (), true))
&& !(pw = internal_getpwuid (DEFAULT_UID)))
debug_printf ("user not found in augmented /etc/passwd");
else