diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
commit | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (patch) | |
tree | dc4fcf1e5e22a040716ef92c496b8d94959b2baa /winsup/cygwin/uinfo.cc | |
parent | 369d8a8fd5e887eca547bf34bccfdf755c9e5397 (diff) | |
download | newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.zip newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.gz newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.bz2 |
import winsup-2000-02-17 snapshot
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r-- | winsup/cygwin/uinfo.cc | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc new file mode 100644 index 0000000..fbf2eca --- /dev/null +++ b/winsup/cygwin/uinfo.cc @@ -0,0 +1,200 @@ +/* uinfo.cc: user info (uid, gid, etc...) + + Copyright 1996, 1997, 1998 Cygnus Solutions. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#include <pwd.h> +#include "winsup.h" +#include <utmp.h> +#include <limits.h> +#include <unistd.h> +#include "autoload.h" +#include <stdlib.h> +#include <wchar.h> +#include <lm.h> + +/* FIXME: shouldn't violate internal object space -- these two + should be static inside grp.cc */ +void read_etc_group (); +extern int group_in_memory_p; + +char * +internal_getlogin (struct pinfo *pi) +{ + DWORD username_len = MAX_USER_NAME; + LPWKSTA_USER_INFO_1 ui = NULL; + + if (! pi) + api_fatal ("pinfo pointer is NULL!\n"); + + if (os_being_run == winNT) + { + int ret = NetWkstaUserGetInfo (NULL, 1, (LPBYTE *)&ui); + if (! ret) + { + wcstombs (pi->domain, + ui->wkui1_logon_domain, + (wcslen (ui->wkui1_logon_domain) + 1) * sizeof (WCHAR)); + debug_printf ("Domain: %s", pi->domain); + wcstombs (pi->logsrv, + ui->wkui1_logon_server, + (wcslen (ui->wkui1_logon_server) + 1) * sizeof (WCHAR)); + if (! *pi->logsrv) + { + LPWSTR logon_srv = NULL; + + if (!NetGetAnyDCName (NULL, + ui->wkui1_logon_domain, + (LPBYTE *)&logon_srv)) + wcstombs (pi->logsrv, + logon_srv, // filter leading double backslashes + (wcslen (logon_srv) + 1) * sizeof (WCHAR)); + if (logon_srv) + NetApiBufferFree (logon_srv); + debug_printf ("AnyDC Server: %s", pi->logsrv); + } + else + debug_printf ("Logon Server: %s", pi->logsrv); + wcstombs (pi->username, + ui->wkui1_username, + (wcslen (ui->wkui1_username) + 1) * sizeof (WCHAR)); + debug_printf ("Windows Username: %s", pi->username); + NetApiBufferFree (ui); + } + else + { + debug_printf ("%d = NetWkstaUserGetInfo ()\n", ret); + if (! GetUserName (pi->username, &username_len)) + strcpy (pi->username, "unknown"); + } + if (!lookup_name (pi->username, pi->logsrv, pi->psid)) + { + debug_printf ("myself->psid = NULL"); + pi->psid = NULL; + } + else if (allow_ntsec) + { + extern BOOL get_pw_sid (PSID, struct passwd*); + struct passwd *pw; + char psidbuf[40]; + PSID psid = (PSID) psidbuf; + + while ((pw = getpwent ()) != NULL) + if (get_pw_sid (psid, pw) && EqualSid (pi->psid, psid)) + { + strcpy (pi->username, pw->pw_name); + break; + } + endpwent (); + } + } + else + { + debug_printf ("myself->psid = NULL"); + pi->psid = NULL; + if (! GetUserName (pi->username, &username_len)) + strcpy (pi->username, "unknown"); + } + debug_printf ("Cygwins Username: %s\n", pi->username); + return pi->username; +} + +void +uinfo_init () +{ + struct passwd *p; + + if (myself->username[0]) + return; + + myself->psid = (PSID) myself->sidbuf; + if ((p = getpwnam (internal_getlogin (myself))) != NULL) + { + /* calling getpwnam assures us that /etc/password has been + read in, but we can't be sure about /etc/group */ + + if (!group_in_memory_p) + read_etc_group (); + + myself->uid = p->pw_uid; + myself->gid = p->pw_gid; + } + else + { + myself->uid = DEFAULT_UID; + myself->gid = DEFAULT_GID; + } +} + +extern "C" char * +getlogin (void) +{ +#ifdef _MT_SAFE + char *this_username=_reent_winsup()->_username; +#else + static NO_COPY char this_username[MAX_USER_NAME]; +#endif + + uinfo_init (); + return strcpy (this_username, myself->username); +} + +extern "C" uid_t +getuid (void) +{ + return myself->uid; +} + +extern "C" gid_t +getgid (void) +{ + return myself->gid; +} + +extern "C" uid_t +geteuid (void) +{ + return getuid (); +} + +extern "C" gid_t +getegid (void) +{ + return getgid (); +} + +/* Not quite right - cuserid can change, getlogin can't */ +extern "C" char * +cuserid (char *src) +{ + if (src) + { + strcpy (src, getlogin ()); + return src; + } + else + { + return getlogin (); + } +} + +LoadDLLinitfunc (netapi32) +{ + HANDLE h; + + if ((h = LoadLibrary ("netapi32.dll")) != NULL) + netapi32_handle = h; + else if (! netapi32_handle) + api_fatal ("could not load netapi32.dll. %d", GetLastError ()); + return 0; +} +LoadDLLinit (netapi32) +LoadDLLfunc (NetWkstaUserGetInfo, NetWkstaUserGetInfo@12, netapi32) +LoadDLLfunc (NetGetAnyDCName, NetGetAnyDCName@12, netapi32) +LoadDLLfunc (NetApiBufferFree, NetApiBufferFree@4, netapi32) + |