diff options
Diffstat (limited to 'libbb/bb_getgroups.c')
-rw-r--r-- | libbb/bb_getgroups.c | 34 |
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 | |||
49 | uid_t FAST_FUNC get_cached_euid(uid_t *euid) | ||
50 | { | ||
51 | if (*euid == (uid_t)-1) | ||
52 | *euid = geteuid(); | ||
53 | return *euid; | ||
54 | } | ||
55 | |||
56 | gid_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. */ | ||
64 | int 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 | } | ||