1 # include "../hdr/defines.h" 2 3 SCCSID(@(#)dohist 2.1); 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 Comments = getresp(sprintf(line,"\n%c%c ",CTLCHAR,COMMENTS),Cstr); 49 } 50 } 51 52 53 getresp(repstr,result) 54 char *repstr; 55 char *result; 56 { 57 char line[BUFSIZ], *index(); 58 register int done, sz; 59 register char *p; 60 61 result[0] = 0; 62 done = 0; 63 setbuf(stdin,NULL); 64 sz = sizeof(line) - size(repstr); 65 while (!done && fgets(line,sz,stdin) != NULL) { 66 p = index(line, '\0'); 67 if (*--p == '\n') { 68 if (*--p == '\\') { 69 copy(repstr,p); 70 } 71 else { 72 *++p = 0; 73 ++done; 74 } 75 } 76 else 77 fatal("line too long (co18)"); 78 if ((size(line) + size(result)) > RESPSIZE) 79 fatal("response too long (co19)"); 80 strcat(result,line); 81 } 82 return(result); 83 } 84 85 86 char *Varg[NVARGS]; 87 88 valmrs(pkt,pgm) 89 struct packet *pkt; 90 char *pgm; 91 { 92 extern char *Sflags[]; 93 register int i; 94 int st; 95 register char *p; 96 97 Varg[0] = pgm; 98 Varg[1] = auxf(pkt->p_file,'g'); 99 if (p = Sflags[TYPEFLAG - 'a']) 100 Varg[2] = p; 101 else 102 Varg[2] = Null; 103 if ((i = fork()) < 0) { 104 fatal("cannot fork; try again (co20)"); 105 } 106 else if (i == 0) { 107 for (i = 4; i < 15; i++) 108 close(i); 109 pexec(pgm,Varg); 110 exit(1); 111 } 112 else { 113 wait(&st); 114 return(st); 115 } 116 } 117 118 119 mrfixup() 120 { 121 register char **argv, *p, c; 122 char *ap; 123 124 argv = &Varg[VSTART]; 125 p = Mrs; 126 NONBLANK(p); 127 for (ap = p; *p; p++) { 128 if (*p == ' ' || *p == '\t') { 129 if (argv >= &Varg[(NVARGS - 1)]) 130 fatal("too many MRs (co21)"); 131 *argv = stalloc(size(ap)); 132 c = *p; 133 *p = 0; 134 copy(ap,*argv); 135 *p = c; 136 argv++; 137 NONBLANK(p); 138 ap = p; 139 } 140 } 141 --p; 142 if (*p != ' ' && *p != '\t') 143 copy(ap,*argv++ = stalloc(size(ap))); 144 *argv = 0; 145 } 146 147 148 # define STBUFSZ 500 149 150 stalloc(n) 151 register int n; 152 { 153 static char stbuf[STBUFSZ]; 154 static int stind; 155 register char *p; 156 157 p = &stbuf[stind]; 158 if (&p[n] >= &stbuf[STBUFSZ]) 159 fatal("out of space (co22)"); 160 stind =+ n; 161 return(p); 162 } 163