xref: /inferno-os/liblogfs/perm.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth 
537da2899SCharles.Forsyth int
logfsuserpermcheck(LogfsServer * s,Entry * e,Fid * f,ulong permmask)637da2899SCharles.Forsyth logfsuserpermcheck(LogfsServer *s, Entry *e, Fid *f, ulong permmask)
737da2899SCharles.Forsyth {
837da2899SCharles.Forsyth 	if(s->openflags & LogfsOpenFlagNoPerm)
937da2899SCharles.Forsyth 		return 1;
1037da2899SCharles.Forsyth 	if((e->perm & permmask) == permmask)
1137da2899SCharles.Forsyth 		/* the whole world can do this */
1237da2899SCharles.Forsyth 		return 1;
1337da2899SCharles.Forsyth 	if(((e->perm >> 6) & permmask) == permmask) {
1437da2899SCharles.Forsyth 		/* maybe we're the owner */
1537da2899SCharles.Forsyth 		char *uname = logfsisfindnamefromid(s->is, e->uid);
1637da2899SCharles.Forsyth 		if(uname == f->uname)
1737da2899SCharles.Forsyth 			return 1;
1837da2899SCharles.Forsyth 	}
1937da2899SCharles.Forsyth 	if(((e->perm >> 3) & permmask) == permmask) {
2037da2899SCharles.Forsyth 		/* maybe we're in the group */
2137da2899SCharles.Forsyth 		Group *g = logfsisfindgroupfromid(s->is, e->gid);
2237da2899SCharles.Forsyth 		return g && logfsisgroupunameismember(s->is, g, f->uname);
2337da2899SCharles.Forsyth 	}
2437da2899SCharles.Forsyth 	return 0;
2537da2899SCharles.Forsyth }
26