1433d6423SLionel Sambuc #include "inc.h" 2433d6423SLionel Sambuc 30baafa0eSDavid van Moolenbroek int check_perm(struct ipc_perm * req,endpoint_t who,int mode)40baafa0eSDavid van Moolenbroekcheck_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 Moolenbroekprepare_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