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