summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/uinfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r--winsup/cygwin/uinfo.cc237
1 files changed, 152 insertions, 85 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 20171c497..9bb0b69b2 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -37,7 +37,7 @@ internal_getlogin (cygheap_user &user)
struct passwd *pw = NULL;
if (!GetUserName (username, &username_len))
- user.set_name ("unknown");
+ user.set_name (NULL);
else
user.set_name (username);
debug_printf ("GetUserName() = %s", user.name ());
@@ -50,7 +50,7 @@ internal_getlogin (cygheap_user &user)
user.set_logsrv (NULL);
/* First trying to get logon info from environment */
- if ((env = getenv ("USERNAME")) != NULL)
+ if (!*user.name () && (env = getenv ("USERNAME")) != NULL)
user.set_name (env);
if ((env = getenv ("USERDOMAIN")) != NULL)
user.set_domain (env);
@@ -73,58 +73,10 @@ internal_getlogin (cygheap_user &user)
}
if (!user.logsrv () && user.domain() &&
get_logon_server(user.domain(), buf, NULL))
- {
- user.set_logsrv (buf + 2);
- setenv ("LOGONSERVER", buf, 1);
- }
+ user.set_logsrv (buf + 2);
debug_printf ("Domain: %s, Logon Server: %s, Windows Username: %s",
user.domain (), user.logsrv (), user.name ());
- /* NetUserGetInfo() can be slow in NT domain environment, thus we
- * only obtain HOMEDRIVE and HOMEPATH if they are not already set
- * in the environment. */
- if (!getenv ("HOMEPATH") || !getenv ("HOMEDRIVE"))
- {
- LPUSER_INFO_3 ui = NULL;
- WCHAR wuser[UNLEN + 1];
-
- sys_mbstowcs (wuser, user.name (), sizeof (wuser) / sizeof (*wuser));
- if ((ret = NetUserGetInfo (NULL, wuser, 3, (LPBYTE *)&ui)))
- {
- if (user.logsrv ())
- {
- WCHAR wlogsrv[INTERNET_MAX_HOST_NAME_LENGTH + 3];
- strcat (strcpy (buf, "\\\\"), user.logsrv ());
-
- sys_mbstowcs (wlogsrv, buf,
- sizeof (wlogsrv) / sizeof(*wlogsrv));
- ret = NetUserGetInfo (wlogsrv, wuser, 3,(LPBYTE *)&ui);
- }
- }
- if (!ret)
- {
- sys_wcstombs (buf, ui->usri3_home_dir, MAX_PATH);
- if (!buf[0])
- {
- sys_wcstombs (buf, ui->usri3_home_dir_drive, MAX_PATH);
- if (buf[0])
- strcat (buf, "\\");
- else
- {
- env = getenv ("SYSTEMDRIVE");
- if (env && *env)
- strcat (strcpy (buf, env), "\\");
- else
- GetSystemDirectoryA (buf, MAX_PATH);
- }
- }
- setenv ("HOMEPATH", buf + 2, 1);
- buf[2] = '\0';
- setenv ("HOMEDRIVE", buf, 1);
- }
- if (ui)
- NetApiBufferFree (ui);
- }
HANDLE ptok = user.token; /* Which is INVALID_HANDLE_VALUE if no
impersonation took place. */
@@ -181,21 +133,13 @@ internal_getlogin (cygheap_user &user)
gsid = NO_SID;
break;
}
- if (!strcasematch (user.name (), "SYSTEM")
- && user.domain () && user.logsrv ())
- {
- if (get_registry_hive_path (user.sid (), buf))
- setenv ("USERPROFILE", buf, 1);
- else
- unsetenv ("USERPROFILE");
- }
}
/* If this process is started from a non Cygwin process,
set token owner to the same value as token user and
primary group to the group which is set as primary group
in /etc/passwd. */
- if (ptok != INVALID_HANDLE_VALUE && myself->ppid == 1)
+ if (ptok != INVALID_HANDLE_VALUE && !myself->ppid_handle)
{
if (!SetTokenInformation (ptok, TokenOwner, &tu, sizeof tu))
debug_printf ("SetTokenInformation(TokenOwner): %E");
@@ -213,26 +157,11 @@ internal_getlogin (cygheap_user &user)
debug_printf ("Cygwins Username: %s", user.name ());
if (!pw)
- pw = getpwnam(user.name ());
- if (!getenv ("HOME"))
- {
- const char *homedrive, *homepath;
- if (pw && pw->pw_dir && *pw->pw_dir)
- {
- setenv ("HOME", pw->pw_dir, 1);
- debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir);
- }
- else if ((homedrive = getenv ("HOMEDRIVE"))
- && (homepath = getenv ("HOMEPATH")))
- {
- char home[MAX_PATH];
- strcpy (buf, homedrive);
- strcat (buf, homepath);
- cygwin_conv_to_full_posix_path (buf, home);
- setenv ("HOME", home, 1);
- debug_printf ("Set HOME (from HOMEDRIVE/HOMEPATH) to %s", home);
- }
- }
+ pw = getpwnam (user.name ());
+
+ if (!myself->ppid_handle)
+ (void) cygheap->user.ontherange (CH_HOME, pw);
+
return pw;
}
@@ -336,13 +265,151 @@ getegid (void)
extern "C" char *
cuserid (char *src)
{
- if (src)
+ if (!src)
+ return getlogin ();
+
+ strcpy (src, getlogin ());
+ return src;
+}
+
+const char *
+cygheap_user::ontherange (homebodies what, struct passwd *pw)
+{
+ static char buf[MAX_PATH + 1];
+ static char homedrive_buf[3];
+ LPUSER_INFO_3 ui = NULL;
+ WCHAR wuser[UNLEN + 1];
+ NET_API_STATUS ret;
+
+ if (what == CH_HOME)
+ {
+ char *p;
+ if ((p = getenv ("HOMEDRIVE")))
+ {
+ memcpy (homedrive_buf, p, 2);
+ homedrive = homedrive_buf;
+ }
+ if ((p = getenv ("HOMEPATH")))
+ {
+ strcpy (buf, p);
+ homepath = buf;
+ }
+ if ((p = getenv ("HOME")))
+ debug_printf ("HOME is already in the environment %s", p);
+ else
+ {
+ if (!pw)
+ pw = getpwnam (name ());
+ if (pw && pw->pw_dir && *pw->pw_dir)
+ {
+ setenv ("HOME", pw->pw_dir, 1);
+ debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir);
+ }
+ else if (homedrive && homepath)
+ {
+ char home[MAX_PATH];
+ strcpy (buf, homedrive);
+ strcat (buf, homepath);
+ cygwin_conv_to_full_posix_path (buf, home);
+ setenv ("HOME", home, 1);
+ debug_printf ("Set HOME (from HOMEDRIVE/HOMEPATH) to %s", home);
+ }
+ }
+ }
+
+ if (homedrive == NULL)
{
- strcpy (src, getlogin ());
- return src;
+ if (!pw)
+ pw = getpwnam (name ());
+ if (pw && pw->pw_dir && *pw->pw_dir)
+ cygwin_conv_to_full_win32_path (pw->pw_dir, buf);
+ else
+ {
+ sys_mbstowcs (wuser, name (), sizeof (wuser) / sizeof (*wuser));
+ if ((ret = NetUserGetInfo (NULL, wuser, 3, (LPBYTE *)&ui)))
+ {
+ if (logsrv ())
+ {
+ WCHAR wlogsrv[INTERNET_MAX_HOST_NAME_LENGTH + 3];
+ strcat (strcpy (buf, "\\\\"), logsrv ());
+ sys_mbstowcs (wlogsrv, buf, sizeof (wlogsrv) / sizeof(*wlogsrv));
+ ret = NetUserGetInfo (wlogsrv, wuser, 3,(LPBYTE *)&ui);
+ }
+ }
+ if (!ret)
+ {
+ char *p;
+ sys_wcstombs (buf, ui->usri3_home_dir, MAX_PATH);
+ if (!buf[0])
+ {
+ sys_wcstombs (buf, ui->usri3_home_dir_drive, MAX_PATH);
+ if (buf[0])
+ strcat (buf, "\\");
+ else if (!GetSystemDirectory (buf, MAX_PATH))
+ strcpy (buf, "c:\\");
+ else if ((p = strchr (buf, '\\')))
+ p[1] = '\0';
+ }
+ }
+ if (ui)
+ NetApiBufferFree (ui);
+ }
+
+ if (buf[1] != ':')
+ {
+ homedrive_buf[0] = homedrive_buf[1] = '\0';
+ homepath = buf;
+ }
+ else
+ {
+ homedrive_buf[0] = buf[0];
+ homedrive_buf[1] = buf[1];
+ homepath = buf + 2;
+ }
+ homedrive = homedrive_buf;
}
- else
+
+ switch (what)
{
- return getlogin ();
+ case CH_HOMEDRIVE:
+ return homedrive;
+ case CH_HOMEPATH:
+ return homepath;
+ default:
+ return homepath;
}
}
+
+const char *
+cygheap_user::env_logsrv ()
+{
+ char *p = plogsrv - 2;
+
+ *p = p[1] = '\\';
+ return p;
+}
+
+const char *
+cygheap_user::env_userprofile ()
+{
+ static char buf[512]; /* FIXME: This shouldn't be static. */
+ if (strcasematch (name (), "SYSTEM") || !domain () || !logsrv ())
+ return NULL;
+
+ if (get_registry_hive_path (sid (), buf))
+ return buf;
+ else
+ return NULL;
+}
+
+const char *
+cygheap_user::env_homepath ()
+{
+ return ontherange (CH_HOMEPATH);
+}
+
+const char *
+cygheap_user::env_homedrive ()
+{
+ return ontherange (CH_HOMEDRIVE);
+}