OSDN Git Service

Initial checkin of text Corinna sent to cygwin-announce.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / uinfo.cc
index 66cab12..ee90e52 100644 (file)
@@ -40,49 +40,67 @@ cygheap_user::init ()
   WCHAR user_name[UNLEN + 1];
   DWORD user_name_len = UNLEN + 1;
 
-  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);
+  /* This code is only run if a Cygwin process gets started by a native
+     Win32 process.  We try to get the username from the environment,
+     first USERNAME (Win32), then USER (POSIX).  If that fails (which is
+     very unlikely), it only has an impact if we don't have an entry in
+     /etc/passwd for this user either.  In that case the username sticks
+     to "unknown".  Since this is called early in initialization, and
+     since we don't want pull in a dependency to any other DLL except
+     ntdll and kernel32 at this early stage, don't call GetUserName,
+     GetUserNameEx, NetWkstaUserGetInfo, etc. */
+  if (GetEnvironmentVariableW (L"USERNAME", user_name, user_name_len)
+      || GetEnvironmentVariableW (L"USER", 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);
+      set_name (mb_user_name);
+    }
+  else
+    set_name ("unknown");
 
-  DWORD siz;
+  NTSTATUS status;
+  ULONG size;
   PSECURITY_DESCRIPTOR psd;
 
-  if (!GetTokenInformation (hProcToken, TokenPrimaryGroup,
-                           &groups.pgsid, sizeof (cygsid), &siz))
-    system_printf ("GetTokenInformation (TokenPrimaryGroup), %E");
+  status = NtQueryInformationToken (hProcToken, TokenPrimaryGroup,
+                                   &groups.pgsid, sizeof (cygsid), &size);
+  if (!NT_SUCCESS (status))
+    system_printf ("NtQueryInformationToken (TokenPrimaryGroup), %p", status);
 
   /* Get the SID from current process and store it in effec_cygsid */
-  if (!GetTokenInformation (hProcToken, TokenUser, &effec_cygsid,
-                           sizeof (cygsid), &siz))
+  status = NtQueryInformationToken (hProcToken, TokenUser, &effec_cygsid,
+                                   sizeof (cygsid), &size);
+  if (!NT_SUCCESS (status))
     {
-      system_printf ("GetTokenInformation (TokenUser), %E");
+      system_printf ("NtQueryInformationToken (TokenUser), %p", status);
       return;
     }
 
   /* Set token owner to the same value as token user */
-  if (!SetTokenInformation (hProcToken, TokenOwner, &effec_cygsid,
-                           sizeof (cygsid)))
-    debug_printf ("SetTokenInformation(TokenOwner), %E");
+  status = NtSetInformationToken (hProcToken, TokenOwner, &effec_cygsid,
+                                 sizeof (cygsid));
+  if (!NT_SUCCESS (status))
+    debug_printf ("NtSetInformationToken(TokenOwner), %p", status);
 
   /* Standard way to build a security descriptor with the usual DACL */
   PSECURITY_ATTRIBUTES sa_buf = (PSECURITY_ATTRIBUTES) alloca (1024);
   psd = (PSECURITY_DESCRIPTOR)
-               (sec_user_nih (sa_buf, sid()))->lpSecurityDescriptor;
+               (sec_user_nih (sa_buf, sid()))->lpSecurityDescriptor;
 
-  BOOL acl_exists, dummy;
+  BOOLEAN acl_exists, dummy;
   TOKEN_DEFAULT_DACL dacl;
-  if (GetSecurityDescriptorDacl (psd, &acl_exists, &dacl.DefaultDacl, &dummy)
-      && acl_exists && dacl.DefaultDacl)
+
+  status = RtlGetDaclSecurityDescriptor (psd, &acl_exists, &dacl.DefaultDacl,
+                                        &dummy);
+  if (NT_SUCCESS (status) && acl_exists && dacl.DefaultDacl)
     {
-      NTSTATUS status;
 
       /* Set the default DACL and the process DACL */
-      if (!SetTokenInformation (hProcToken, TokenDefaultDacl, &dacl,
-                               sizeof (dacl)))
-       system_printf ("SetTokenInformation (TokenDefaultDacl), %E");
+      status = NtSetInformationToken (hProcToken, TokenDefaultDacl, &dacl,
+                                     sizeof (dacl));
+      if (!NT_SUCCESS (status))
+       system_printf ("NtSetInformationToken (TokenDefaultDacl), %p", status);
       if ((status = NtSetSecurityObject (NtCurrentProcess (),
                                         DACL_SECURITY_INFORMATION, psd)))
        system_printf ("NtSetSecurityObject, %lx", status);
@@ -114,9 +132,12 @@ internal_getlogin (cygheap_user &user)
          if (gsid != user.groups.pgsid)
            {
              /* Set primary group to the group in /etc/passwd. */
-             if (!SetTokenInformation (hProcToken, TokenPrimaryGroup,
-                                       &gsid, sizeof gsid))
-               debug_printf ("SetTokenInformation(TokenPrimaryGroup), %E");
+             NTSTATUS status = NtSetInformationToken (hProcToken,
+                                                      TokenPrimaryGroup,
+                                                      &gsid, sizeof gsid);
+             if (!NT_SUCCESS (status))
+               debug_printf ("NtSetInformationToken (TokenPrimaryGroup), %p",
+                             status);
              else
                user.groups.pgsid = gsid;
              clear_procimptoken ();
@@ -166,7 +187,7 @@ uinfo_init ()
 extern "C" int
 getlogin_r (char *name, size_t namesize)
 {
-  char *login = getlogin ();
+  const char *login = cygheap->user.name ();
   size_t len = strlen (login) + 1;
   if (len > namesize)
     return ERANGE;
@@ -180,7 +201,14 @@ getlogin_r (char *name, size_t namesize)
 extern "C" char *
 getlogin (void)
 {
-  return strcpy (_my_tls.locals.username, cygheap->user.name ());
+  static char username[UNLEN];
+  int ret = getlogin_r (username, UNLEN);
+  if (ret)
+    {
+      set_errno (ret);
+      return NULL;
+    }
+  return username;
 }
 
 extern "C" __uid32_t
@@ -298,7 +326,7 @@ cygheap_user::ontherange (homebodies what, struct passwd *pw)
              if (!(ret = NetUserGetInfo (wlogsrv, wuser, 3, (LPBYTE *) &ui)))
                {
                  sys_wcstombs (homepath_env_buf, NT_MAX_PATH,
-                               ui->usri3_home_dir);
+                               ui->usri3_home_dir);
                  if (!homepath_env_buf[0])
                    {
                      sys_wcstombs (homepath_env_buf, NT_MAX_PATH,
@@ -384,7 +412,7 @@ cygheap_user::env_domain (const char *name, size_t namelen)
 
   DWORD ulen = UNLEN + 1;
   WCHAR username[ulen];
-  DWORD dlen = DNLEN + 1;
+  DWORD dlen = MAX_DOMAIN_NAME_LEN + 1;
   WCHAR userdomain[dlen];
   SID_NAME_USE use;
 
@@ -442,19 +470,16 @@ cygheap_user::env_systemroot (const char *name, size_t namelen)
 {
   if (!psystemroot)
     {
-      int size = GetWindowsDirectory (NULL, 0);
+      int size = GetSystemWindowsDirectoryW (NULL, 0);
       if (size > 0)
        {
-         psystemroot = (char *) cmalloc_abort (HEAP_STR, ++size);
-         size = GetWindowsDirectory (psystemroot, size);
-         if (size <= 0)
-           {
-             cfree (psystemroot);
-             psystemroot = NULL;
-           }
+         WCHAR wsystemroot[size];
+         size = GetSystemWindowsDirectoryW (wsystemroot, size);
+         if (size > 0)
+           sys_wcstombs_alloc (&psystemroot, HEAP_STR, wsystemroot);
        }
       if (size <= 0)
-       debug_printf ("GetWindowsDirectory(), %E");
+       debug_printf ("GetSystemWindowsDirectoryW(), %E");
     }
   return psystemroot;
 }