Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-08-15 17:08:47 +0400
committerCorinna Vinschen <corinna@vinschen.de>2008-08-15 17:08:47 +0400
commit9258eca9d4a23ccaa0caf9b5b01020613b2d3ffa (patch)
tree87ba35965c9550e9928ad693f04e044b02de6696 /winsup/utils/mkpasswd.c
parent2bd94f906de5009a87effeab8dccfb0573c55f46 (diff)
* mkgroup.c (fetch_current_pgrp_sid): New function to fetch primary
group SID from user token. (current_group): Move up in file. Move fetching primary group SID to fetch_current_pgrp_sid. (enum_local_groups): Check if current SID is the same as current user's primary group SID. (enum_groups): Ditto. (main): Call fetch_current_pgrp_sid before enumerating groups. Call current_group only if current group hasn't been enumerated already. * mkpasswd.c (fetch_current_user_sid): New function to fetch current user SID from user token. (current_user): Move fetching current user SID to fetch_current_user_sid. (enum_users): Check if current SID is the same as current user's SID. (main): Call fetch_current_user_sid before enumerating users. Call current_user only if current user hasn't been enumerated already.
Diffstat (limited to 'winsup/utils/mkpasswd.c')
-rw-r--r--winsup/utils/mkpasswd.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/winsup/utils/mkpasswd.c b/winsup/utils/mkpasswd.c
index 546ba24cc..14c5eb095 100644
--- a/winsup/utils/mkpasswd.c
+++ b/winsup/utils/mkpasswd.c
@@ -175,16 +175,37 @@ uni2ansi (LPWSTR wcs, char *mbs, int size)
*mbs = '\0';
}
+typedef struct {
+ PSID psid;
+ int buffer[10];
+} sidbuf;
+
+sidbuf curr_user;
+sidbuf curr_pgrp;
+BOOL got_curr_user = FALSE;
+
void
-current_user (int print_cygpath, const char *sep, const char *passed_home_path,
- DWORD id_offset, const char *disp_username)
+fetch_current_user_sid ()
{
DWORD len;
HANDLE ptok;
- struct {
- PSID psid;
- int buffer[10];
- } tu, tg;
+
+ if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok)
+ || !GetTokenInformation (ptok, TokenUser, &curr_user, sizeof curr_user,
+ &len)
+ || !GetTokenInformation (ptok, TokenPrimaryGroup, &curr_pgrp,
+ sizeof curr_pgrp, &len)
+ || !CloseHandle (ptok))
+ {
+ print_win_error (GetLastError ());
+ return;
+ }
+}
+
+void
+current_user (int print_cygpath, const char *sep, const char *passed_home_path,
+ DWORD id_offset, const char *disp_username)
+{
WCHAR user[UNLEN + 1];
WCHAR dom[MAX_DOMAIN_NAME_LEN + 1];
DWORD ulen = UNLEN + 1;
@@ -193,18 +214,18 @@ current_user (int print_cygpath, const char *sep, const char *passed_home_path,
int uid, gid;
char homedir_psx[PATH_MAX] = {0}, homedir_w32[MAX_PATH] = {0};
- if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok)
- || !GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &len)
- || !GetTokenInformation (ptok, TokenPrimaryGroup, &tg, sizeof tg, &len)
- || !CloseHandle (ptok)
- || !LookupAccountSidW (NULL, tu.psid, user, &ulen, dom, &dlen, &acc_type))
+ if (!curr_user.psid || !curr_pgrp.psid
+ || !LookupAccountSidW (NULL, curr_user.psid, user, &ulen, dom, &dlen,
+ &acc_type))
{
print_win_error (GetLastError ());
return;
}
- uid = *GetSidSubAuthority (tu.psid, *GetSidSubAuthorityCount(tu.psid) - 1);
- gid = *GetSidSubAuthority (tg.psid, *GetSidSubAuthorityCount(tg.psid) - 1);
+ uid = *GetSidSubAuthority (curr_user.psid,
+ *GetSidSubAuthorityCount(curr_user.psid) - 1);
+ gid = *GetSidSubAuthority (curr_pgrp.psid,
+ *GetSidSubAuthorityCount(curr_pgrp.psid) - 1);
if (passed_home_path[0] == '\0')
{
char *envhome = getenv ("HOME");
@@ -254,7 +275,7 @@ current_user (int print_cygpath, const char *sep, const char *passed_home_path,
id_offset + gid,
dom,
user,
- put_sid (tu.psid),
+ put_sid (curr_user.psid),
homedir_psx);
}
@@ -487,7 +508,8 @@ enum_users (BOOL domain, domlist_t *dom_or_machine, const char *sep,
continue;
}
}
-
+ if (EqualSid (curr_user.psid, psid))
+ got_curr_user = TRUE;
printf ("%ls%s%ls:unused:%lu:%lu:%ls%sU-%ls\\%ls,%s:%s:/bin/bash\n",
with_dom ? domain_name : L"",
with_dom ? sep : "",
@@ -824,6 +846,8 @@ skip:
return 1;
}
+ fetch_current_user_sid ();
+
off = id_offset;
for (i = 0; i < print_domlist; ++i)
{
@@ -840,7 +864,7 @@ skip:
off += id_offset;
}
- if (print_current)
+ if (print_current && !got_curr_user)
current_user (print_cygpath, sep_char, passed_home_path, off,
disp_username);