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