142 lines
2.9 KiB
C
142 lines
2.9 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
|
/* Copyright (c) 1988 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
/* #ident "@(#)sccs:lib/comobj/permiss.c 6.4" */
|
|
#ident "$Revision: 1.5 $"
|
|
# include "../../hdr/defines.h"
|
|
|
|
static void ck_lock();
|
|
|
|
void
|
|
finduser(pkt)
|
|
register struct packet *pkt;
|
|
{
|
|
register char *p;
|
|
char *user, *logname();
|
|
char *strend(), *getline(), *repl();
|
|
int strcmp();
|
|
unsigned strlen();
|
|
char groupid[6];
|
|
int none;
|
|
int ok_user;
|
|
void fmterr();
|
|
|
|
none = 1;
|
|
user = logname();
|
|
sprintf(groupid,"%u",getgid());
|
|
while ((p = getline(pkt)) != NULL && *p != CTLCHAR) {
|
|
none = 0;
|
|
ok_user = 1;
|
|
repl(p,'\n','\0'); /* this is done for equal test below */
|
|
if(*p == '!') {
|
|
++p;
|
|
ok_user = 0;
|
|
}
|
|
if (!pkt->p_user)
|
|
if (equal(user,p) || equal(groupid,p))
|
|
pkt->p_user = ok_user;
|
|
*(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];
|
|
|
|
void
|
|
doflags(pkt)
|
|
struct packet *pkt;
|
|
{
|
|
register char *p;
|
|
register int k;
|
|
char *getline(), *fmalloc();
|
|
unsigned strlen();
|
|
|
|
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] = fmalloc(size(p));
|
|
copy(p,Sflags[k]);
|
|
for (p = Sflags[k]; *p++ != '\n'; )
|
|
;
|
|
*--p = 0;
|
|
}
|
|
}
|
|
|
|
void
|
|
permiss(pkt)
|
|
register struct packet *pkt;
|
|
{
|
|
extern char *Sflags[];
|
|
register char *p;
|
|
register int n;
|
|
int patoi(), fatal(), strcmp();
|
|
char *repl();
|
|
unsigned strlen();
|
|
void fmterr();
|
|
|
|
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 %d < %d (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 %d > %d (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);
|
|
}
|
|
|
|
|
|
|
|
static char l_str[] = "SCCS file locked against editing (co23)";
|
|
|
|
static void
|
|
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);
|
|
}
|