115 lines
2.2 KiB
C
115 lines
2.2 KiB
C
# include "../hdr/defines.h"
|
|
|
|
SCCSID(@(#)permiss.c 1.1 94/10/31 SMI); /* from System III 5.1 */
|
|
|
|
finduser(pkt)
|
|
register struct packet *pkt;
|
|
{
|
|
register char *p;
|
|
register int i;
|
|
char *user;
|
|
char *strend();
|
|
char groupid[6];
|
|
extern char *getline();
|
|
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;
|
|
extern char *getline();
|
|
|
|
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] = (char *)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);
|
|
}
|