36 lines
		
	
	
		
			674 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			674 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include "inc.h"
 | 
						|
 | 
						|
int check_perm(struct ipc_perm *req, endpoint_t who, int mode)
 | 
						|
{
 | 
						|
	int req_mode;
 | 
						|
	int cur_mode;
 | 
						|
	uid_t uid = getnuid(who);
 | 
						|
	gid_t gid = getngid(who);
 | 
						|
 | 
						|
	mode &= 0666;
 | 
						|
 | 
						|
	/* is root? */
 | 
						|
	if (uid == 0)
 | 
						|
		return 1;
 | 
						|
 | 
						|
	if (uid == req->uid || uid == req->cuid) {
 | 
						|
		/* same user */
 | 
						|
		req_mode = (req->mode >> 6) & 0x7;
 | 
						|
		cur_mode = (mode >> 6) & 0x7;
 | 
						|
	} else if (gid == req->gid || gid == req->cgid) {
 | 
						|
		/* same group */
 | 
						|
		req_mode = (req->mode >> 3) & 0x7;
 | 
						|
		cur_mode = (mode >> 3) & 0x7;
 | 
						|
	} else {
 | 
						|
		/* other group */
 | 
						|
		req_mode = req->mode & 0x7;
 | 
						|
		cur_mode = mode & 0x7;
 | 
						|
	}
 | 
						|
 | 
						|
	if (cur_mode && ((cur_mode & req_mode) == cur_mode))
 | 
						|
		return 1;
 | 
						|
	else
 | 
						|
		return 0;
 | 
						|
}
 | 
						|
 |