1: # include "refer..c" 2: corout(in, out, rprog, arg, outlen) 3: char *in, *out, *rprog; 4: { 5: # define move(x, y) close(y); dup(x); close(x); 6: int pipev[2], fr1, fr2, fw1, fw2, n; 7: 8: if (strcmp (rprog, "hunt") ==0) 9: return(callhunt(in, out, arg, outlen)); 10: if (strcmp (rprog, "deliv")==0) 11: return(dodeliv(in, out, arg, outlen)); 12: pipe (pipev); fr1= pipev[0]; fw1 = pipev[1]; 13: pipe (pipev); fr2= pipev[0]; fw2 = pipev[1]; 14: if (fork()==0) 15: { 16: close (fw1); close (fr2); 17: move (fr1, 0); 18: move (fw2, 1); 19: if (rprog[0]!= '/') 20: chdir("/usr/lib/refer"); 21: execl(rprog, "deliv", arg, 0); 22: err ("Can't run %s", rprog); 23: } 24: close(fw2); close(fr1); 25: write (fw1, in , strlen(in)); 26: close(fw1); 27: wait(0); 28: n = read (fr2, out, outlen); 29: out[n]=0; 30: close(fr2); 31: } 32: callhunt(in, out, arg, outlen) 33: char *in, *out, *arg; 34: { 35: # define ALEN 50 36: char *argv[20], abuff[ALEN]; 37: extern int typeindex; 38: int argc; 39: extern char one[]; 40: extern int onelen; 41: argv[0] = "hunt"; 42: argv[1] = "-i"; 43: argv[2] = in; 44: argv[3] = "-t"; 45: argv[4] = out; 46: argv[5] = outlen; 47: argv[6] = "-T"; 48: argv[7] = "-F1"; 49: argv[8] = "-o"; 50: argv[9] = one; 51: argv[10] = onelen; 52: argv[11] = abuff; strcpy (abuff,arg); 53: if (strlen(abuff) > ALEN) 54: err("abuff not big enough %d", strlen(abuff)); 55: argc = 6; 56: huntmain (argc,argv); 57: return(0); 58: } 59: dodeliv(in, out, arg, outlen) 60: char *in, *out, *arg; 61: { 62: # if D1 63: fprintf(stderr, "in dodeliv, arg /%s/\n", arg?arg:""); 64: # endif 65: if (arg && arg[0]) 66: chdir(arg); 67: findline(in, out, outlen, 0L); 68: restodir(); 69: }