xref: /plan9/sys/src/lib9p/uid.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <auth.h>
4*7dd7cddfSDavid du Colombier #include <fcall.h>
5*7dd7cddfSDavid du Colombier #include <thread.h>
6*7dd7cddfSDavid du Colombier #include <9p.h>
7*7dd7cddfSDavid du Colombier 
8*7dd7cddfSDavid du Colombier /*
9*7dd7cddfSDavid du Colombier  * simplistic permission checking.  assume that
10*7dd7cddfSDavid du Colombier  * each user is the leader of her own group.
11*7dd7cddfSDavid du Colombier  */
12*7dd7cddfSDavid du Colombier int
hasperm(File * f,char * uid,int p)13*7dd7cddfSDavid du Colombier hasperm(File *f, char *uid, int p)
14*7dd7cddfSDavid du Colombier {
15*7dd7cddfSDavid du Colombier 	int m;
16*7dd7cddfSDavid du Colombier 
17*7dd7cddfSDavid du Colombier 	m = f->mode & 7;	/* other */
18*7dd7cddfSDavid du Colombier 	if((p & m) == p)
19*7dd7cddfSDavid du Colombier 		return 1;
20*7dd7cddfSDavid du Colombier 
21*7dd7cddfSDavid du Colombier 	if(strcmp(f->uid, uid) == 0) {
22*7dd7cddfSDavid du Colombier 		m |= (f->mode>>6) & 7;
23*7dd7cddfSDavid du Colombier 		if((p & m) == p)
24*7dd7cddfSDavid du Colombier 			return 1;
25*7dd7cddfSDavid du Colombier 	}
26*7dd7cddfSDavid du Colombier 
27*7dd7cddfSDavid du Colombier 	if(strcmp(f->gid, uid) == 0) {
28*7dd7cddfSDavid du Colombier 		m |= (f->mode>>3) & 7;
29*7dd7cddfSDavid du Colombier 		if((p & m) == p)
30*7dd7cddfSDavid du Colombier 			return 1;
31*7dd7cddfSDavid du Colombier 	}
32*7dd7cddfSDavid du Colombier 
33*7dd7cddfSDavid du Colombier 	return 0;
34*7dd7cddfSDavid du Colombier }
35