xref: /minix3/minix/servers/ipc/utility.c (revision 534584945c0f50b9816e7051003856bd31bf8c65)
1433d6423SLionel Sambuc #include "inc.h"
2433d6423SLionel Sambuc 
30baafa0eSDavid van Moolenbroek int
check_perm(struct ipc_perm * req,endpoint_t who,int mode)40baafa0eSDavid van Moolenbroek check_perm(struct ipc_perm * req, endpoint_t who, int mode)
5433d6423SLionel Sambuc {
6433d6423SLionel Sambuc 	int req_mode;
70baafa0eSDavid van Moolenbroek 	uid_t uid;
80baafa0eSDavid van Moolenbroek 	gid_t gid;
9433d6423SLionel Sambuc 
100baafa0eSDavid van Moolenbroek 	uid = getnuid(who);
110baafa0eSDavid van Moolenbroek 	gid = getngid(who);
1256dc79ceSDavid van Moolenbroek 	mode &= 0700;
13433d6423SLionel Sambuc 
140baafa0eSDavid van Moolenbroek 	/* Root is allowed to do anything. */
15433d6423SLionel Sambuc 	if (uid == 0)
1656dc79ceSDavid van Moolenbroek 		return TRUE;
17433d6423SLionel Sambuc 
18433d6423SLionel Sambuc 	if (uid == req->uid || uid == req->cuid) {
190baafa0eSDavid van Moolenbroek 		/* Same user. */
2056dc79ceSDavid van Moolenbroek 		req_mode = req->mode & 0700;
21433d6423SLionel Sambuc 	} else if (gid == req->gid || gid == req->cgid) {
220baafa0eSDavid van Moolenbroek 		/* Same group. */
2356dc79ceSDavid van Moolenbroek 		req_mode = req->mode & 0070;
2456dc79ceSDavid van Moolenbroek 		mode >>= 3;
25433d6423SLionel Sambuc 	} else {
260baafa0eSDavid van Moolenbroek 		/* Other user and group. */
2756dc79ceSDavid van Moolenbroek 		req_mode = req->mode & 0007;
2856dc79ceSDavid van Moolenbroek 		mode >>= 6;
29433d6423SLionel Sambuc 	}
30433d6423SLionel Sambuc 
3156dc79ceSDavid van Moolenbroek 	return (mode && ((mode & req_mode) == mode));
32433d6423SLionel Sambuc }
33*53458494SDavid van Moolenbroek 
34*53458494SDavid van Moolenbroek /*
35*53458494SDavid van Moolenbroek  * Copy over an ipc_perm structure to an ipc_perm_sysctl structure.
36*53458494SDavid van Moolenbroek  */
37*53458494SDavid van Moolenbroek void
prepare_mib_perm(struct ipc_perm_sysctl * perms,const struct ipc_perm * perm)38*53458494SDavid van Moolenbroek prepare_mib_perm(struct ipc_perm_sysctl * perms, const struct ipc_perm * perm)
39*53458494SDavid van Moolenbroek {
40*53458494SDavid van Moolenbroek 
41*53458494SDavid van Moolenbroek 	memset(perms, 0, sizeof(*perms));
42*53458494SDavid van Moolenbroek 	perms->_key = perm->_key;
43*53458494SDavid van Moolenbroek 	perms->uid = perm->uid;
44*53458494SDavid van Moolenbroek 	perms->gid = perm->gid;
45*53458494SDavid van Moolenbroek 	perms->cuid = perm->cuid;
46*53458494SDavid van Moolenbroek 	perms->cgid = perm->cgid;
47*53458494SDavid van Moolenbroek 	perms->mode = perm->mode;
48*53458494SDavid van Moolenbroek 	perms->_seq = perm->_seq;
49*53458494SDavid van Moolenbroek }
50