diff options
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r-- | winsup/cygwin/uinfo.cc | 237 |
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); +} |