summaryrefslogtreecommitdiff
path: root/minix/servers/ipc/utility.c
blob: 41dda5db90a26bf80998d734c68073eb96048a0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "inc.h"

int
check_perm(struct ipc_perm * req, endpoint_t who, int mode)
{
	int req_mode;
	uid_t uid;
	gid_t gid;

	uid = getnuid(who);
	gid = getngid(who);
	mode &= 0700;

	/* Root is allowed to do anything. */
	if (uid == 0)
		return TRUE;

	if (uid == req->uid || uid == req->cuid) {
		/* Same user. */
		req_mode = req->mode & 0700;
	} else if (gid == req->gid || gid == req->cgid) {
		/* Same group. */
		req_mode = req->mode & 0070;
		mode >>= 3;
	} else {
		/* Other user and group. */
		req_mode = req->mode & 0007;
		mode >>= 6;
	}

	return (mode && ((mode & req_mode) == mode));
}

/*
 * Copy over an ipc_perm structure to an ipc_perm_sysctl structure.
 */
void
prepare_mib_perm(struct ipc_perm_sysctl * perms, const struct ipc_perm * perm)
{

	memset(perms, 0, sizeof(*perms));
	perms->_key = perm->_key;
	perms->uid = perm->uid;
	perms->gid = perm->gid;
	perms->cuid = perm->cuid;
	perms->cgid = perm->cgid;
	perms->mode = perm->mode;
	perms->_seq = perm->_seq;
}