1 #include <sys/param.h>
2 # include	"../hdr/defines.h"
3 
4 SCCSID(@(#)permiss.c	1.3	02/02/88);
5 
6 finduser(pkt)
7 register struct packet *pkt;
8 {
9 	register char *p;
10 	register int i;
11 	char *user;
12 	char *index();
13 	int gid, ngroups = NGROUPS, groups[NGROUPS];
14 	int none;
15 
16 	none = 1;
17 	user = logname();
18 	if (getgroups(&ngroups, groups) < 0) {
19 		perror("getgroups");
20 		ngroups = 0;
21 	}
22 	while ((p = getline(pkt)) != NULL && *p != CTLCHAR) {
23 		none = 0;
24 		repl(p,'\n','\0');	/* this is done for equal test below */
25 		if (!pkt->p_user) {
26 			if (equal(user,p))
27 				pkt->p_user = 1;
28 			else if (gid = atoi(p))
29 				for (i = 0; i < ngroups; i++)
30 				    if (gid == groups[i]) {
31 					pkt->p_user = 1;
32 					break;
33 				    }
34 		}
35 		*(index(p,'\0')) = '\n';/* repl \0 end of line w/ \n again */
36 	}
37 	if (none)
38 		pkt->p_user = 1;
39 	if (p == NULL || p[1] != EUSERNAM)
40 		fmterr(pkt);
41 }
42 
43 
44 char	*Sflags[NFLAGS];
45 
46 doflags(pkt)
47 struct packet *pkt;
48 {
49 	register char *p;
50 	register int k;
51 
52 	for (k = 0; k < NFLAGS; k++)
53 		Sflags[k] = 0;
54 	while ((p = getline(pkt)) != NULL && *p++ == CTLCHAR && *p++ == FLAG) {
55 		NONBLANK(p);
56 		k = *p++ - 'a';
57 		NONBLANK(p);
58 		Sflags[k] = alloc(size(p));
59 		copy(p,Sflags[k]);
60 		for (p = Sflags[k]; *p++ != '\n'; )
61 			;
62 		*--p = 0;
63 	}
64 }
65 
66 
67 permiss(pkt)
68 register struct packet *pkt;
69 {
70 	extern char *Sflags[];
71 	register char *p;
72 	register int n;
73 
74 	if (!pkt->p_user)
75 		fatal("not authorized to make deltas (co14)");
76 	if (p = Sflags[FLORFLAG - 'a']) {
77 		if (((unsigned)pkt->p_reqsid.s_rel) < (n = patoi(p))) {
78 			sprintf(Error,"release %u < %u (floor) (co15)",pkt->p_reqsid.s_rel,n);
79 			fatal(Error);
80 		}
81 	}
82 	if (p = Sflags[CEILFLAG - 'a'])
83 		if (((unsigned)pkt->p_reqsid.s_rel) > (n = patoi(p))) {
84 			sprintf(Error,"release %u > %u (ceiling) (co16)",pkt->p_reqsid.s_rel,n);
85 			fatal(Error);
86 		}
87 }
88