119929Ssam # include	"../hdr/defines.h"
219929Ssam 
3*33424Sbostic static char Sccsid[] = "@(#)dohist.c	1.4	02/02/88";
419929Ssam 
519929Ssam char	Cstr[RESPSIZE];
619929Ssam char	Mstr[RESPSIZE];
719929Ssam 
dohist(file)819929Ssam dohist(file)
919929Ssam char *file;
1019929Ssam {
1119929Ssam 	char line[BUFSIZ];
1219929Ssam 	int tty[3];
1319929Ssam 	int doprmt;
1419929Ssam 	register char *p;
1519929Ssam 	FILE *in;
1619929Ssam 	extern char *Mrs;
1719929Ssam 	extern char *Comments;
1819929Ssam 	extern int Domrs;
1919929Ssam 
2019929Ssam 	in = xfopen(file,0);
2119929Ssam 	while ((p = fgets(line,sizeof(line),in)) != NULL)
2219929Ssam 		if (line[0] == CTLCHAR && line[1] == EUSERNAM)
2319929Ssam 			break;
2419929Ssam 	if (p != NULL) {
2519929Ssam 		while ((p = fgets(line,sizeof(line),in)) != NULL)
2619929Ssam 			if (line[3] == VALFLAG && line[1] == FLAG && line[0] == CTLCHAR)
2719929Ssam 				break;
2819929Ssam 			else if (line[1] == BUSERTXT && line[0] == CTLCHAR)
2919929Ssam 				break;
3019929Ssam 		if (p != NULL && line[1] == FLAG) {
3119929Ssam 			Domrs++;
3219929Ssam 		}
3319929Ssam 	}
3419929Ssam 	fclose(in);
3519929Ssam 	doprmt = 0;
3619929Ssam 	if (gtty(0,tty) >= 0)
3719929Ssam 		doprmt++;
3819929Ssam 	if (Domrs && !Mrs) {
3919929Ssam 		if (doprmt)
4019929Ssam 			printf("MRs? ");
4119929Ssam 		Mrs = getresp(" ",Mstr);
4219929Ssam 	}
4319929Ssam 	if (Domrs)
4419929Ssam 		mrfixup();
4519929Ssam 	if (!Comments) {
4619929Ssam 		if (doprmt)
4719929Ssam 			printf("comments? ");
48*33424Sbostic 		sprintf(line,"\n%c%c ",CTLCHAR,COMMENTS);
49*33424Sbostic 		Comments = getresp(line,Cstr);
5019929Ssam 	}
5119929Ssam }
5219929Ssam 
5319929Ssam 
getresp(repstr,result)5419929Ssam getresp(repstr,result)
5519929Ssam char *repstr;
5619929Ssam char *result;
5719929Ssam {
5819940Ssam 	char line[BUFSIZ], *index();
5919929Ssam 	register int done, sz;
6019929Ssam 	register char *p;
6119929Ssam 
6219929Ssam 	result[0] = 0;
6319929Ssam 	done = 0;
6419929Ssam 	setbuf(stdin,NULL);
6519929Ssam 	sz = sizeof(line) - size(repstr);
6619929Ssam 	while (!done && fgets(line,sz,stdin) != NULL) {
6719940Ssam 		p = index(line, '\0');
6819929Ssam 		if (*--p == '\n') {
6919929Ssam 			if (*--p == '\\') {
7019929Ssam 				copy(repstr,p);
7119929Ssam 			}
7219929Ssam 			else {
7319929Ssam 				*++p = 0;
7419929Ssam 				++done;
7519929Ssam 			}
7619929Ssam 		}
7719929Ssam 		else
7819929Ssam 			fatal("line too long (co18)");
7919929Ssam 		if ((size(line) + size(result)) > RESPSIZE)
8019929Ssam 			fatal("response too long (co19)");
8119929Ssam 		strcat(result,line);
8219929Ssam 	}
8319929Ssam 	return(result);
8419929Ssam }
8519929Ssam 
8619929Ssam 
8719929Ssam char	*Varg[NVARGS];
8819929Ssam 
8919929Ssam valmrs(pkt,pgm)
9019929Ssam struct packet *pkt;
9119929Ssam char *pgm;
9219929Ssam {
9319929Ssam 	extern char *Sflags[];
9419929Ssam 	register int i;
9519929Ssam 	int st;
9619929Ssam 	register char *p;
9719929Ssam 
9819929Ssam 	Varg[0] = pgm;
9919929Ssam 	Varg[1] = auxf(pkt->p_file,'g');
10019929Ssam 	if (p = Sflags[TYPEFLAG - 'a'])
10119929Ssam 		Varg[2] = p;
10219929Ssam 	else
10319929Ssam 		Varg[2] = Null;
10419929Ssam 	if ((i = fork()) < 0) {
10519929Ssam 		fatal("cannot fork; try again (co20)");
10619929Ssam 	}
10719929Ssam 	else if (i == 0) {
10819929Ssam 		for (i = 4; i < 15; i++)
10919929Ssam 			close(i);
11019929Ssam 		pexec(pgm,Varg);
11119929Ssam 		exit(1);
11219929Ssam 	}
11319929Ssam 	else {
11419929Ssam 		wait(&st);
11519929Ssam 		return(st);
11619929Ssam 	}
11719929Ssam }
11819929Ssam 
11919929Ssam 
mrfixup()12019929Ssam mrfixup()
12119929Ssam {
12219929Ssam 	register char **argv, *p, c;
12319929Ssam 	char *ap;
12419929Ssam 
12519929Ssam 	argv = &Varg[VSTART];
12619929Ssam 	p = Mrs;
12719929Ssam 	NONBLANK(p);
12819929Ssam 	for (ap = p; *p; p++) {
12919929Ssam 		if (*p == ' ' || *p == '\t') {
13019929Ssam 			if (argv >= &Varg[(NVARGS - 1)])
13119929Ssam 				fatal("too many MRs (co21)");
13219929Ssam 			*argv = stalloc(size(ap));
13319929Ssam 			c = *p;
13419929Ssam 			*p = 0;
13519929Ssam 			copy(ap,*argv);
13619929Ssam 			*p = c;
13719929Ssam 			argv++;
13819929Ssam 			NONBLANK(p);
13919929Ssam 			ap = p;
14019929Ssam 		}
14119929Ssam 	}
14219929Ssam 	--p;
14319929Ssam 	if (*p != ' ' && *p != '\t')
14419929Ssam 		copy(ap,*argv++ = stalloc(size(ap)));
14519929Ssam 	*argv = 0;
14619929Ssam }
14719929Ssam 
14819929Ssam 
14919929Ssam # define STBUFSZ	500
15019929Ssam 
stalloc(n)15119929Ssam stalloc(n)
15219929Ssam register int n;
15319929Ssam {
15419929Ssam 	static char stbuf[STBUFSZ];
15519929Ssam 	static int stind;
15619929Ssam 	register char *p;
15719929Ssam 
15819929Ssam 	p = &stbuf[stind];
15919929Ssam 	if (&p[n] >= &stbuf[STBUFSZ])
16019929Ssam 		fatal("out of space (co22)");
16130497Slepreau 	stind += n;
16219929Ssam 	return(p);
16319929Ssam }
164