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