1*19929Ssam # include	"../hdr/defines.h"
2*19929Ssam 
3*19929Ssam SCCSID(@(#)dohist	2.1);
4*19929Ssam 
5*19929Ssam char	Cstr[RESPSIZE];
6*19929Ssam char	Mstr[RESPSIZE];
7*19929Ssam 
8*19929Ssam dohist(file)
9*19929Ssam char *file;
10*19929Ssam {
11*19929Ssam 	char line[BUFSIZ];
12*19929Ssam 	int tty[3];
13*19929Ssam 	int doprmt;
14*19929Ssam 	register char *p;
15*19929Ssam 	FILE *in;
16*19929Ssam 	extern char *Mrs;
17*19929Ssam 	extern char *Comments;
18*19929Ssam 	extern int Domrs;
19*19929Ssam 
20*19929Ssam 	in = xfopen(file,0);
21*19929Ssam 	while ((p = fgets(line,sizeof(line),in)) != NULL)
22*19929Ssam 		if (line[0] == CTLCHAR && line[1] == EUSERNAM)
23*19929Ssam 			break;
24*19929Ssam 	if (p != NULL) {
25*19929Ssam 		while ((p = fgets(line,sizeof(line),in)) != NULL)
26*19929Ssam 			if (line[3] == VALFLAG && line[1] == FLAG && line[0] == CTLCHAR)
27*19929Ssam 				break;
28*19929Ssam 			else if (line[1] == BUSERTXT && line[0] == CTLCHAR)
29*19929Ssam 				break;
30*19929Ssam 		if (p != NULL && line[1] == FLAG) {
31*19929Ssam 			Domrs++;
32*19929Ssam 		}
33*19929Ssam 	}
34*19929Ssam 	fclose(in);
35*19929Ssam 	doprmt = 0;
36*19929Ssam 	if (gtty(0,tty) >= 0)
37*19929Ssam 		doprmt++;
38*19929Ssam 	if (Domrs && !Mrs) {
39*19929Ssam 		if (doprmt)
40*19929Ssam 			printf("MRs? ");
41*19929Ssam 		Mrs = getresp(" ",Mstr);
42*19929Ssam 	}
43*19929Ssam 	if (Domrs)
44*19929Ssam 		mrfixup();
45*19929Ssam 	if (!Comments) {
46*19929Ssam 		if (doprmt)
47*19929Ssam 			printf("comments? ");
48*19929Ssam 		Comments = getresp(sprintf(line,"\n%c%c ",CTLCHAR,COMMENTS),Cstr);
49*19929Ssam 	}
50*19929Ssam }
51*19929Ssam 
52*19929Ssam 
53*19929Ssam getresp(repstr,result)
54*19929Ssam char *repstr;
55*19929Ssam char *result;
56*19929Ssam {
57*19929Ssam 	char line[BUFSIZ];
58*19929Ssam 	register int done, sz;
59*19929Ssam 	register char *p;
60*19929Ssam 
61*19929Ssam 	result[0] = 0;
62*19929Ssam 	done = 0;
63*19929Ssam 	setbuf(stdin,NULL);
64*19929Ssam 	sz = sizeof(line) - size(repstr);
65*19929Ssam 	while (!done && fgets(line,sz,stdin) != NULL) {
66*19929Ssam 		p = strend(line);
67*19929Ssam 		if (*--p == '\n') {
68*19929Ssam 			if (*--p == '\\') {
69*19929Ssam 				copy(repstr,p);
70*19929Ssam 			}
71*19929Ssam 			else {
72*19929Ssam 				*++p = 0;
73*19929Ssam 				++done;
74*19929Ssam 			}
75*19929Ssam 		}
76*19929Ssam 		else
77*19929Ssam 			fatal("line too long (co18)");
78*19929Ssam 		if ((size(line) + size(result)) > RESPSIZE)
79*19929Ssam 			fatal("response too long (co19)");
80*19929Ssam 		strcat(result,line);
81*19929Ssam 	}
82*19929Ssam 	return(result);
83*19929Ssam }
84*19929Ssam 
85*19929Ssam 
86*19929Ssam char	*Varg[NVARGS];
87*19929Ssam 
88*19929Ssam valmrs(pkt,pgm)
89*19929Ssam struct packet *pkt;
90*19929Ssam char *pgm;
91*19929Ssam {
92*19929Ssam 	extern char *Sflags[];
93*19929Ssam 	register int i;
94*19929Ssam 	int st;
95*19929Ssam 	register char *p;
96*19929Ssam 
97*19929Ssam 	Varg[0] = pgm;
98*19929Ssam 	Varg[1] = auxf(pkt->p_file,'g');
99*19929Ssam 	if (p = Sflags[TYPEFLAG - 'a'])
100*19929Ssam 		Varg[2] = p;
101*19929Ssam 	else
102*19929Ssam 		Varg[2] = Null;
103*19929Ssam 	if ((i = fork()) < 0) {
104*19929Ssam 		fatal("cannot fork; try again (co20)");
105*19929Ssam 	}
106*19929Ssam 	else if (i == 0) {
107*19929Ssam 		for (i = 4; i < 15; i++)
108*19929Ssam 			close(i);
109*19929Ssam 		pexec(pgm,Varg);
110*19929Ssam 		exit(1);
111*19929Ssam 	}
112*19929Ssam 	else {
113*19929Ssam 		wait(&st);
114*19929Ssam 		return(st);
115*19929Ssam 	}
116*19929Ssam }
117*19929Ssam 
118*19929Ssam 
119*19929Ssam mrfixup()
120*19929Ssam {
121*19929Ssam 	register char **argv, *p, c;
122*19929Ssam 	char *ap;
123*19929Ssam 
124*19929Ssam 	argv = &Varg[VSTART];
125*19929Ssam 	p = Mrs;
126*19929Ssam 	NONBLANK(p);
127*19929Ssam 	for (ap = p; *p; p++) {
128*19929Ssam 		if (*p == ' ' || *p == '\t') {
129*19929Ssam 			if (argv >= &Varg[(NVARGS - 1)])
130*19929Ssam 				fatal("too many MRs (co21)");
131*19929Ssam 			*argv = stalloc(size(ap));
132*19929Ssam 			c = *p;
133*19929Ssam 			*p = 0;
134*19929Ssam 			copy(ap,*argv);
135*19929Ssam 			*p = c;
136*19929Ssam 			argv++;
137*19929Ssam 			NONBLANK(p);
138*19929Ssam 			ap = p;
139*19929Ssam 		}
140*19929Ssam 	}
141*19929Ssam 	--p;
142*19929Ssam 	if (*p != ' ' && *p != '\t')
143*19929Ssam 		copy(ap,*argv++ = stalloc(size(ap)));
144*19929Ssam 	*argv = 0;
145*19929Ssam }
146*19929Ssam 
147*19929Ssam 
148*19929Ssam # define STBUFSZ	500
149*19929Ssam 
150*19929Ssam stalloc(n)
151*19929Ssam register int n;
152*19929Ssam {
153*19929Ssam 	static char stbuf[STBUFSZ];
154*19929Ssam 	static int stind;
155*19929Ssam 	register char *p;
156*19929Ssam 
157*19929Ssam 	p = &stbuf[stind];
158*19929Ssam 	if (&p[n] >= &stbuf[STBUFSZ])
159*19929Ssam 		fatal("out of space (co22)");
160*19929Ssam 	stind =+ n;
161*19929Ssam 	return(p);
162*19929Ssam }
163