1
0
Files
irix-657m-src/eoe/cmd/sccs/lib/comobj/permiss.c
2022-09-29 17:59:04 +03:00

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);
}