OSDN Git Service

* grp.cc (read_etc_group): When emulating nonexisting group file on
authorcorinna <corinna>
Wed, 5 Jun 2002 11:56:56 +0000 (11:56 +0000)
committercorinna <corinna>
Wed, 5 Jun 2002 11:56:56 +0000 (11:56 +0000)
NT systems, read primary group SID from process token.  Use that info
to create correct group entry.  On error or on 9x systems fallback
to emulating Administrators group as before.
(read_etc_passwd): When emulating nonexisting passwd file on NT systems,
read user and primary group SID from process token.  Use that info to
create correct passwd entry.  On error or on 9x systems fallback to
emulating user with Administrator user id and Administrators group
as before.

winsup/cygwin/ChangeLog
winsup/cygwin/grp.cc
winsup/cygwin/passwd.cc

index 95f7d5e..fc0a07a 100644 (file)
@@ -1,5 +1,17 @@
 2002-06-05  Corinna Vinschen  <corinna@vinschen.de>
 
+       * grp.cc (read_etc_group): When emulating nonexisting group file on
+       NT systems, read primary group SID from process token.  Use that info
+       to create correct group entry.  On error or on 9x systems fallback
+       to emulating Administrators group as before.
+       (read_etc_passwd): When emulating nonexisting passwd file on NT systems,
+       read user and primary group SID from process token.  Use that info to
+       create correct passwd entry.  On error or on 9x systems fallback to
+       emulating user with Administrator user id and Administrators group
+       as before.
+
+2002-06-05  Corinna Vinschen  <corinna@vinschen.de>
+
        * grp.cc (etc_group): Removed.
        (parse_grp): Make line parameter nonconst.  Don't copy data into new
        allocated memory.  Check for CR instead of LF to accomodate new
index 13f74dd..25d2ff8 100644 (file)
@@ -171,19 +171,49 @@ read_etc_group ()
          SID_NAME_USE acType;
          static char linebuf [200];
 
-         debug_printf ("Emulating /etc/group");
-         strncpy (group_name, "Administrators", sizeof (group_name));
-         if (! LookupAccountSidA (NULL, well_known_admins_sid, group_name,
-                                  &group_name_len, domain_name,
-                                  &domain_name_len, &acType))
+         if (wincap.has_security ())
            {
-             strcpy (group_name, "unknown");
-             debug_printf ("Failed to get local admins group name. %E");
+             HANDLE ptok;
+             cygsid tg;
+             DWORD siz;
+
+             if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
+               {
+                 if (GetTokenInformation (ptok, TokenPrimaryGroup, &tg,
+                                          sizeof tg, &siz)
+                     && LookupAccountSidA (NULL, tg, group_name,
+                                           &group_name_len, domain_name,
+                                           &domain_name_len, &acType))
+                   {
+                     char strbuf[100];
+                     snprintf (linebuf, sizeof (linebuf), "%s:%s:%u:",
+                               group_name, 
+                               tg.string (strbuf),
+                               *GetSidSubAuthority(tg,
+                                            *GetSidSubAuthorityCount(tg) - 1));
+                     debug_printf ("Emulating /etc/group: %s", linebuf);
+                     add_grp_line (linebuf);
+                     group_state = emulated;
+                   }
+                 CloseHandle (ptok);
+               }
+           }
+         if (group_state != emulated)
+           {
+             strncpy (group_name, "Administrators", sizeof (group_name));
+             if (!LookupAccountSidA (NULL, well_known_admins_sid, group_name,
+                                     &group_name_len, domain_name,
+                                     &domain_name_len, &acType))
+               {
+                 strcpy (group_name, "unknown");
+                 debug_printf ("Failed to get local admins group name. %E");
+               }
+             snprintf (linebuf, sizeof (linebuf), "%s::%u:", group_name,
+                       (unsigned) DEFAULT_GID);
+             debug_printf ("Emulating /etc/group: %s", linebuf);
+             add_grp_line (linebuf);
+             group_state = emulated;
            }
-         snprintf (linebuf, sizeof (linebuf), "%s::%u:\n", group_name,
-                   (unsigned) DEFAULT_GID);
-         add_grp_line (linebuf);
-         group_state = emulated;
        }
     }
 
index ac1ecf8..b251264 100644 (file)
@@ -160,14 +160,46 @@ read_etc_passwd ()
        }
       else
        {
-         static char linebuf[400];
-
-         debug_printf ("Emulating /etc/passwd");
-         snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh",
-                   cygheap->user.name (), (unsigned) DEFAULT_UID,
-                   (unsigned) DEFAULT_GID, getenv ("HOME") ?: "/");
-         add_pwd_line (linebuf);
-         passwd_state = emulated;
+         static char linebuf[1024];
+
+         if (wincap.has_security ())
+           {
+             HANDLE ptok;
+             cygsid tu, tg;
+             DWORD siz;
+
+             if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
+               {
+                 if (GetTokenInformation (ptok, TokenUser, &tu, sizeof tu,
+                                          &siz)
+                     && GetTokenInformation (ptok, TokenPrimaryGroup, &tg,
+                                             sizeof tg, &siz))
+                   {
+                     char strbuf[100];
+                     snprintf (linebuf, sizeof (linebuf),
+                               "%s::%u:%u:%s:%s:/bin/sh",
+                               cygheap->user.name (),
+                               *GetSidSubAuthority(tu,
+                                            *GetSidSubAuthorityCount(tu) - 1),
+                               *GetSidSubAuthority(tg,
+                                            *GetSidSubAuthorityCount(tg) - 1),
+                               tu.string (strbuf), getenv ("HOME") ?: "/");
+                     debug_printf ("Emulating /etc/passwd: %s", linebuf);
+                     add_pwd_line (linebuf);
+                     passwd_state = emulated;
+                   }
+                 CloseHandle (ptok);
+               }
+           }
+         if (passwd_state != emulated)
+           {
+             snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh",
+                       cygheap->user.name (), (unsigned) DEFAULT_UID,
+                       (unsigned) DEFAULT_GID, getenv ("HOME") ?: "/");
+             debug_printf ("Emulating /etc/passwd: %s", linebuf);
+             add_pwd_line (linebuf);
+             passwd_state = emulated;
+           }
        }
 
     }