/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ # include "../hdr/defines.h" static char Sccsid[] = "@(#)permiss.c 3.0 4/22/86"; finduser(pkt) register struct packet *pkt; { register char *p; register int i; char *user; char *strend(); char groupid[6]; int none; none = 1; user = logname(); sprintf(groupid,"%d",getgid()); while ((p = getline(pkt)) != NULL && *p != CTLCHAR) { none = 0; repl(p,'\n','\0'); /* this is done for equal test below */ if (!pkt->p_user) if (equal(user,p) || equal(groupid,p)) pkt->p_user = 1; *(strend(p)) = '\n'; /* repl \0 end of line w/ \n again */ } if (none) pkt->p_user = 1; if (p == NULL || p[1] != EUSERNAM) fmterr(pkt); } char *Sflags[NFLAGS]; doflags(pkt) struct packet *pkt; { register char *p; register int k; for (k = 0; k < NFLAGS; k++) Sflags[k] = 0; while ((p = getline(pkt)) != NULL && *p++ == CTLCHAR && *p++ == FLAG) { NONBLANK(p); k = *p++ - 'a'; NONBLANK(p); Sflags[k] = alloc(size(p)); copy(p,Sflags[k]); for (p = Sflags[k]; *p++ != '\n'; ) ; *--p = 0; } } permiss(pkt) register struct packet *pkt; { extern char *Sflags[]; register char *p; register int n; if (!pkt->p_user) fatal("not authorized to make deltas (co14)"); if (p = Sflags[FLORFLAG - 'a']) { if (((unsigned)pkt->p_reqsid.s_rel) < (n = patoi(p))) { sprintf(Error,"release %u < %u (floor) (co15)", pkt->p_reqsid.s_rel,n); fatal(Error); } } if (p = Sflags[CEILFLAG - 'a']) { if (((unsigned)pkt->p_reqsid.s_rel) > (n = patoi(p))) { sprintf(Error,"release %u > %u (ceiling) (co16)", pkt->p_reqsid.s_rel,n); fatal(Error); } } /* check to see if the file or any particular release is locked against editing. (Only if the `l' flag is set) */ if ((p = Sflags[LOCKFLAG - 'a'])) ck_lock(p,pkt); } char l_str[] = "SCCS file locked against editing (co23)"; ck_lock(p,pkt) register char *p; register struct packet *pkt; { int l_rel; int locked; locked = 0; if (*p == 'a') locked++; else while(*p) { p = satoi(p,&l_rel); ++p; if (l_rel == pkt->p_gotsid.s_rel || l_rel == pkt->p_reqsid.s_rel) { locked++; sprintf(l_str,"release `%d' locked against editing (co23)", l_rel); break; } } if (locked) fatal(l_str); }