201 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* 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)
 | 
						|
 |