Ultrix-3.1/src/cmd/sccs/lib/permiss.c
/**********************************************************************
* 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);
}