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

431 lines
9.2 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/cassi/deltack.c 6.8" */
#ident "$Revision: 1.7 $"
#include <errno.h>
#include "../../hdr/had.h"
#include "../../hdr/defines.h"
#include "../../hdr/filehand.h"
#define FOREVER 1
#define MAXLIST 15
#define MAXLIST2 20
#define MAXLENCMR 12
char *strtok(),*strcpy(),*strchr(),*logname();
static char errorlog[FILESIZE]; /* log cmts errors here */
static FILE *efd;
static int promdelt(), msg(), verif(), getinfo();
/*
*
*deltack(pfile,mrs,nsid,apl) peforms the nessesary validations on a delta
*involving the CMF FRED file of active CMR's
*
*/
deltack(pfile,mrs,nsid,apl)
char pfile[]; /* the pfile name */
char *mrs; /* list of mrs from pfile */
char *nsid; /* sid id */
char *apl; /* application from the file */
{
static char type[10],sthold[10];
char hold[302],*h,*fred, *strcat();
unsigned strlen();
void error();
/*check for the existance of the p.file*/
if(!pfile)
{
error("Pfile non existant at deltack ");
return(0);
}
/*if no application serious error */
if(!apl)
{
error ("no application found with -fz flag");
return(0);
}
/*check for and retrieve FRED given the application name*/
if(!getinfo(&fred,apl))
{
error("no FRED file or system name in admin directory ");
return(0);
}
strcpy(errorlog,fred);
*(errorlog + strlen(errorlog) - 11) = NULL;
strcat(errorlog,"LOG");
if(!(mrs))
{
if (efd=fopen(errorlog,"a"))
{fprintf(efd,"***CASSI REPORTS ERROR: no CMRS in pfile: %s\n",pfile);
(void) fclose(efd);
}
error("CMRs not on P.file -serious inconsistancy");
return(0);
}
if(!promdelt(mrs,sthold,type,fred))
{
return(0);
}
/*now build the chpost line */
(void) strcpy(hold,mrs);
h=strtok(hold,",\0");
(void) msg(apl,pfile,h,sthold,type,nsid,fred);
while(h=strtok(0,",\0 "))
{
(void) msg(apl,pfile,h,sthold,type,nsid,fred);
}
return(1);
}
/*
*
*promdelt(cmrs,stat,type,fred) allows one to modify the cmrs list and
*enrter the type and status for the input to the MR system via the net
*
*/
static int
promdelt(cmrs,stat,type,fred)
char *cmrs,*stat,*type,*fred;
{
extern char * Cassin;
extern char * Sflags[];
static char hold[300],nold[300], *cmrlist[MAXLIST2 + 1];
char answ[100];
int i,j,numcmrs,fdflag=0,eqflag=0,badflag=0;
char *h;
int strcmp(), fatal();
unsigned strlen();
/*place the cmrs list in the array of pointers and remove the commas */
strcpy(hold,cmrs);
(void) strtok(hold,",");
cmrlist[0]=hold;
for(i=1;i<MAXLIST;i++)
{
if((cmrlist[i]=strtok(0,",\0"))==(char *)NULL)
{
break;
}
}
numcmrs=i;
/* remove invalid cmrs from the list if now none set flag */
for(i=0;cmrlist[i];i++)
{
if(!verif(cmrlist[i],fred))
{
/* a 'sd' cmr has been found */
if(numcmrs > 1)
{
for(j=i;j<numcmrs;j++)
{
cmrlist[j] = cmrlist[j + 1];
}
numcmrs--;
}
else /* there is a last cmr to delete set flag */
{
cmrlist[0] = NULL;
badflag = 1;
numcmrs--;
}
}
}
if(HADZ) /*force delta flag on */
{
if (badflag) /* no legal cmrs in list */
{
if (efd=fopen(errorlog,"a"))
{fprintf(efd,"***CASSI REPORTS ERROR: no CMRS at sd\n");
(void) fclose(efd);
}
(void) fatal("no CMR's left, delta forbidden\n");
}
(void) strcpy(stat,"sd");
if (Sflags[TYPEFLAG - 'a'])
strcpy(type,Sflags[TYPEFLAG - 'a']);
else
strcpy(type,"sw");
/* rebuild cmr comma seperated list*/
cat(nold,cmrlist[0],0);
for(i=1;i<numcmrs;i++)
{
cat(nold,",",cmrlist[i],0);
}
strcpy(cmrs,nold);
return(1);
}
while(FOREVER)
{
if(!badflag)
{
printf("the CMRs for this delta now are:\n");
for(i=0;cmrlist[i + 1];i++)
{
printf(" %s,",cmrlist[i]);
}
printf("%s\n",cmrlist[i]);
printf("OK ??");
(void) gets(answ);
if((!strcmp(answ,"y")) || (!strcmp(answ,"ye")) || (!strcmp(answ,"yes")))
{
break;
}
}
else
{
printf("you must input a least 1 valid cmr number\n");
}
/*now prompt for new cmrs to add to the list*/
while(FOREVER)
{
eqflag = 0;
printf("enter new CMR number or 'CR' ");
(void) gets(answ);
if(answ[0] == NULL)
if(!badflag)
{
break;
}
else
{
continue;
}
h=(char *) malloc((unsigned)(strlen(answ) + 6));
strcpy(h,answ);
/*check for duplicate */
for (i=0;i<numcmrs;i++)
{
if(!strcmp(h,cmrlist[i]))
{
eqflag=1;
break;
}
}
if(eqflag==1)
{
printf(" \n duplicate CMR number ignored\n");
continue;
}
/*now verify that the cmr is in FRED */
if(!verif(h,fred))
{
printf(" \n invalid CMR ignored \n");
continue;
}
/*the addition is valid*/
cmrlist[numcmrs] = h;
badflag = 0; /* turn off the no cmrs found indicator */
if(++numcmrs > MAXLIST2)
{
printf(" \n to many CMRs added no more allowed \n");
break;
}
}
/*now delete mrs from list */
while(FOREVER)
{
fdflag = 0;
printf(" \n CMR number to delete or (CR) ? ");
(void) gets(answ);
if(!(*answ))
{
break;
}
/*if one left break */
if(numcmrs==1)
{
printf("\n only one CMR left can't delete more\n");
break;
}
/*check if request is on list */
for(i=0;i<numcmrs;i++)
{
if (!strcmp(answ,cmrlist[i]))
{
fdflag=1;
for(j=i;j<numcmrs;j++)
{
cmrlist[j]=cmrlist[j+1];
}
break;
}
}
if(fdflag==0)
{
printf("\n not on list request ignored\n");
continue;
}
else
{
numcmrs--;
/* we have oneless cmr */
}
}
}
/*here ends the cmr loop */
/*set type to proper value*/
if ( Sflags[TYPEFLAG - 'a'])
strcpy(type,Sflags[TYPEFLAG - 'a']);
else
strcpy(type,"sw");
/*set status*/
strcpy(stat,"sd");
/*reformat the cmrlist into a comma separated cmr list*/
cat(nold,cmrlist[0],0);
for(i=1;i<numcmrs;i++)
{
cat(nold,nold,",",cmrlist[i],0);
}
strcpy(cmrs,nold);
return(1);
}
/*
*
*msg(syst,cmrs,stats,types,sids) formats a message and calls cmrpost
*
*/
static int
msg(syst,name,cmrs,stats,types,sids,fred)
char *syst,*name,*cmrs,*stats,*types,*sids,*fred;
{
FILE *fd;
extern char *Sflags[];
char *k;
char pname[FILESIZE],*ptr,holdfred[100],dir[100],path[FILESIZE];
struct stat64 stbuf;
int noexist = 0;
char *strchr(), *strcat();
char *getcwd(), *abspath();
int stat64(), chown(), fatal();
/* if -fm flag contains a value substitute a the value for name */
if(k=Sflags[MODFLAG - 'a'])
{
name = k;
}
if(*name != '/') /* not full path name */
{
if(getcwd(path,sizeof(path)) == NULL)
(void) fatal("getcwd() failed (ge=20)");
cat(pname,path,"/",name,0);
}
else
{
strcpy(pname,name);
}
(void) abspath(pname); /* get rid of . and .. */
/******** the net is replaced by psudonet ******
* sprintf(holdit,"netq %s chpost %s q %s %s MID=%s MFS=%s q q",syst,cmrs,pname,types,sids,stats);
* system(holdit);
************************************************/
/* build the name of the termLOG file */
strcpy(holdfred,fred);
ptr=strchr(holdfred,'.');
*ptr=NULL;
strcat(holdfred,"source");
strcpy(dir,holdfred);
strcat(holdfred,"/termLOG");
if(stat64(holdfred,&stbuf) == -1)
noexist = 1; /*new termLOG */
if(!(fd=fopen(holdfred,"a")))
{
if (efd=fopen(errorlog,"a"))
{fprintf(efd,"***CASSI REPORTS ERROR: can't write to FRED : %s\n",pname);
(void) fclose(efd);
}
(void) fatal(" Cassi Interface Msg not writable\n");
return(0);
}
fprintf(fd,"%s chpost %s q %s %s MID=%s MFS=%s MPA=%s q q\n",syst,cmrs,pname,types,sids,stats,logname());
(void) fclose(fd);
if(noexist) /*new termLOG make owner of /BD/source owner of file */
{
if(stat64(dir,&stbuf) == -1)
{
if (efd=fopen(errorlog,"a"))
{fprintf(efd,"***CASSI REPORTS ERROR: can't write to BD/source : %s\n",pname);
(void) fclose(efd);
}
(void) fatal("Cassi BD/source not writeable\n");
}
(void) chmod(holdfred,(mode_t)0666);
(void) chown(holdfred,stbuf.st_uid,stbuf.st_gid);
}
return(1);
}
/*
*
*verif(cmr,fred) calls the verification prog and returns 0 if failed
*
*/
static int
verif(cmr,fred)
char *cmr,*fred;
{
int sweep();
int res;
char *cmrpass[2];
unsigned strlen();
/* if length of cmr number not = MAXLENCMR error
* all cmr numbers are 12 characters long
*/
if (strlen(cmr) != MAXLENCMR)
{
return(0);
}
cmrpass[0] = cmr;
cmrpass[1] = NULL;
res=sweep(SEQVERIFY,fred,NULL,'\n',WHITE,40,cmrpass,NULL,NULL,
(int(*)()) NULL, (int (*)()) NULL);
if(res != FOUND)
{
return(0);
}
else
{
return(1);
}
}
/*
*
*getinfo(freddy,sys)
* get the name of the fred file and the system name
*/
static int
getinfo(freddy,sys)
char **freddy,*sys;
{
extern int errno;
extern char *gf();
struct stat64 buf;
*freddy=gf(sys);
if(!(**freddy))
{
printf("got to bad FRED file %s\n",*freddy);
return(0);
}
if(stat64(*freddy,&buf))
{
return(0);
}
return(1);
}