1 #include "inc.h" 2 3 int 4 check_perm(struct ipc_perm * req, endpoint_t who, int mode) 5 { 6 int req_mode; 7 uid_t uid; 8 gid_t gid; 9 10 uid = getnuid(who); 11 gid = getngid(who); 12 mode &= 0700; 13 14 /* Root is allowed to do anything. */ 15 if (uid == 0) 16 return TRUE; 17 18 if (uid == req->uid || uid == req->cuid) { 19 /* Same user. */ 20 req_mode = req->mode & 0700; 21 } else if (gid == req->gid || gid == req->cgid) { 22 /* Same group. */ 23 req_mode = req->mode & 0070; 24 mode >>= 3; 25 } else { 26 /* Other user and group. */ 27 req_mode = req->mode & 0007; 28 mode >>= 6; 29 } 30 31 return (mode && ((mode & req_mode) == mode)); 32 } 33