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