130494Slepreau #include <sys/param.h>
215529Skarels # include	"../hdr/defines.h"
315529Skarels 
4*33424Sbostic SCCSID(@(#)permiss.c	1.3	02/02/88);
515529Skarels 
finduser(pkt)615529Skarels finduser(pkt)
715529Skarels register struct packet *pkt;
815529Skarels {
915529Skarels 	register char *p;
1015529Skarels 	register int i;
1115529Skarels 	char *user;
1230494Slepreau 	char *index();
1330494Slepreau 	int gid, ngroups = NGROUPS, groups[NGROUPS];
1415529Skarels 	int none;
1515529Skarels 
1615529Skarels 	none = 1;
1715529Skarels 	user = logname();
1830494Slepreau 	if (getgroups(&ngroups, groups) < 0) {
1930494Slepreau 		perror("getgroups");
2030494Slepreau 		ngroups = 0;
2130494Slepreau 	}
2215529Skarels 	while ((p = getline(pkt)) != NULL && *p != CTLCHAR) {
2315529Skarels 		none = 0;
2415529Skarels 		repl(p,'\n','\0');	/* this is done for equal test below */
2530494Slepreau 		if (!pkt->p_user) {
2630494Slepreau 			if (equal(user,p))
2715529Skarels 				pkt->p_user = 1;
2830494Slepreau 			else if (gid = atoi(p))
2930494Slepreau 				for (i = 0; i < ngroups; i++)
3030494Slepreau 				    if (gid == groups[i]) {
3130494Slepreau 					pkt->p_user = 1;
3230494Slepreau 					break;
3330494Slepreau 				    }
3430494Slepreau 		}
3530494Slepreau 		*(index(p,'\0')) = '\n';/* repl \0 end of line w/ \n again */
3615529Skarels 	}
3715529Skarels 	if (none)
3815529Skarels 		pkt->p_user = 1;
3915529Skarels 	if (p == NULL || p[1] != EUSERNAM)
4015529Skarels 		fmterr(pkt);
4115529Skarels }
4215529Skarels 
4315529Skarels 
4415529Skarels char	*Sflags[NFLAGS];
4515529Skarels 
4615529Skarels doflags(pkt)
4715529Skarels struct packet *pkt;
4815529Skarels {
4915529Skarels 	register char *p;
5015529Skarels 	register int k;
5115529Skarels 
5215529Skarels 	for (k = 0; k < NFLAGS; k++)
5315529Skarels 		Sflags[k] = 0;
5415529Skarels 	while ((p = getline(pkt)) != NULL && *p++ == CTLCHAR && *p++ == FLAG) {
5515529Skarels 		NONBLANK(p);
5615529Skarels 		k = *p++ - 'a';
5715529Skarels 		NONBLANK(p);
5815529Skarels 		Sflags[k] = alloc(size(p));
5915529Skarels 		copy(p,Sflags[k]);
6015529Skarels 		for (p = Sflags[k]; *p++ != '\n'; )
6115529Skarels 			;
6215529Skarels 		*--p = 0;
6315529Skarels 	}
6415529Skarels }
6515529Skarels 
6615529Skarels 
permiss(pkt)6715529Skarels permiss(pkt)
6815529Skarels register struct packet *pkt;
6915529Skarels {
7015529Skarels 	extern char *Sflags[];
7115529Skarels 	register char *p;
7215529Skarels 	register int n;
7315529Skarels 
7415529Skarels 	if (!pkt->p_user)
7515529Skarels 		fatal("not authorized to make deltas (co14)");
7615529Skarels 	if (p = Sflags[FLORFLAG - 'a']) {
77*33424Sbostic 		if (((unsigned)pkt->p_reqsid.s_rel) < (n = patoi(p))) {
78*33424Sbostic 			sprintf(Error,"release %u < %u (floor) (co15)",pkt->p_reqsid.s_rel,n);
79*33424Sbostic 			fatal(Error);
80*33424Sbostic 		}
8115529Skarels 	}
8215529Skarels 	if (p = Sflags[CEILFLAG - 'a'])
83*33424Sbostic 		if (((unsigned)pkt->p_reqsid.s_rel) > (n = patoi(p))) {
84*33424Sbostic 			sprintf(Error,"release %u > %u (ceiling) (co16)",pkt->p_reqsid.s_rel,n);
85*33424Sbostic 			fatal(Error);
86*33424Sbostic 		}
8715529Skarels }
88