1 #include <lunaix/usrscope.h>
2 #include <lunaix/mm/valloc.h>
3 #include <lunaix/status.h>
4 #include <lunaix/spike.h>
5 #include <lunaix/process.h>
7 #include <klibc/string.h>
9 #define GLIST_INIT_LEN 8
11 static struct ugroup_obj*
12 __alloc_groups_obj(unsigned int len)
15 struct ugroup_obj* ugo;
17 assert(len >= GLIST_INIT_LEN);
19 ugo = valloc(sizeof(*ugo));
22 size = len * sizeof(gid_t);
23 ugo->list = valloc(size);
26 memset(ugo->list, grp_list_end, size);
31 __ref_groups_obj(struct ugroup_obj* ugo)
37 __unref_groups_obj(struct ugroup_obj* ugo)
44 vfree_safe(ugo->list);
48 static struct ugroup_obj*
49 __modify_group_obj(struct user_scope* procu, unsigned int new_len)
51 struct ugroup_obj* ugo;
55 return __alloc_groups_obj(GLIST_INIT_LEN);
58 __unref_groups_obj(ugo);
60 new_len = MAX(new_len, ugo->maxcap);
61 ugo = __alloc_groups_obj(new_len);
68 uscope_setgroups(struct user_scope* proc_usr,
69 const gid_t* grps, unsigned int len)
71 struct ugroup_obj* ugo;
73 if (len > NGROUPS_MAX) {
77 ugo = __modify_group_obj(proc_usr, len);
78 memcpy(ugo->list, grps, len * sizeof(gid_t));
84 uscope_membership(struct user_scope* proc_usr, gid_t gid)
86 struct ugroup_obj* ugo;
93 for (unsigned i = 0; i < ugo->maxcap; i++)
95 if (ugo->list[i] != grp_list_end) {
99 if (ugo->list[i] == gid) {
108 uscope_copy(struct user_scope* to, struct user_scope* from)
110 __ref_groups_obj(from->grps);
111 memcpy(to, from, sizeof(*to));
116 check_current_acl(uid_t desired_u, gid_t desired_g)
118 struct user_scope* uscope;
120 if (!__current->euid || __current->euid == desired_u)
125 if (__current->egid == desired_g) {
129 uscope = current_user_scope();
130 if (uscope_membership(uscope, desired_g)) {