1 #include <sys/param.h>
2 # include "../hdr/defines.h"
3
4 SCCSID(@(#)permiss.c 1.3 02/02/88);
5
finduser(pkt)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
permiss(pkt)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