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 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 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 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 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