aboutsummaryrefslogtreecommitdiff
path: root/libbb/bb_getgroups.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/bb_getgroups.c')
-rw-r--r--libbb/bb_getgroups.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libbb/bb_getgroups.c b/libbb/bb_getgroups.c
index 5d83c729a..31cff2b41 100644
--- a/libbb/bb_getgroups.c
+++ b/libbb/bb_getgroups.c
@@ -45,3 +45,37 @@ gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array)
45 *ngroups = n; 45 *ngroups = n;
46 return group_array; 46 return group_array;
47} 47}
48
49uid_t FAST_FUNC get_cached_euid(uid_t *euid)
50{
51 if (*euid == (uid_t)-1)
52 *euid = geteuid();
53 return *euid;
54}
55
56gid_t FAST_FUNC get_cached_egid(gid_t *egid)
57{
58 if (*egid == (gid_t)-1)
59 *egid = getegid();
60 return *egid;
61}
62
63/* Return non-zero if GID is in our supplementary group list. */
64int FAST_FUNC is_in_supplementary_groups(struct cached_groupinfo *groupinfo, gid_t gid)
65{
66 int i;
67 int ngroups;
68 gid_t *group_array;
69
70 if (groupinfo->ngroups == 0)
71 groupinfo->supplementary_array = bb_getgroups(&groupinfo->ngroups, NULL);
72 ngroups = groupinfo->ngroups;
73 group_array = groupinfo->supplementary_array;
74
75 /* Search through the list looking for GID. */
76 for (i = 0; i < ngroups; i++)
77 if (gid == group_array[i])
78 return 1;
79
80 return 0;
81}