1 #ifndef lint 2 static char *sccsid = "@(#)glue3.c 4.3 (Berkeley) 05/11/89"; 3 #endif 4 5 #include "refer..c" 6 #include "pathnames.h" 7 8 #define move(x, y) close(y); dup(x); close(x); 9 10 corout(in, out, rprog, arg, outlen) 11 char *in, *out, *rprog; 12 { 13 int pipev[2], fr1, fr2, fw1, fw2, n; 14 15 if (strcmp (rprog, "hunt") ==0) 16 return(callhunt(in, out, arg, outlen)); 17 if (strcmp (rprog, "deliv")==0) 18 return(dodeliv(in, out, arg, outlen)); 19 pipe (pipev); 20 fr1= pipev[0]; 21 fw1 = pipev[1]; 22 pipe (pipev); 23 fr2= pipev[0]; 24 fw2 = pipev[1]; 25 if (fork()==0) 26 { 27 close (fw1); 28 close (fr2); 29 move (fr1, 0); 30 move (fw2, 1); 31 if (rprog[0]!= '/') 32 chdir(_PATH_LIB); 33 execl(rprog, "deliv", arg, 0); 34 err ("Can't run %s", rprog); 35 } 36 close(fw2); 37 close(fr1); 38 write (fw1, in , strlen(in)); 39 close(fw1); 40 wait(0); 41 n = read (fr2, out, outlen); 42 out[n]=0; 43 close(fr2); 44 } 45 46 # define ALEN 50 47 48 callhunt(in, out, arg, outlen) 49 char *in, *out, *arg; 50 { 51 char *argv[20], abuff[ALEN]; 52 extern int typeindex; 53 int argc; 54 extern char one[]; 55 extern int onelen; 56 argv[0] = "hunt"; 57 argv[1] = "-i"; 58 argv[2] = in; 59 argv[3] = "-t"; 60 argv[4] = out; 61 argv[5] = (char *)outlen; /* Horrid kludge, see option parsing 62 in huntmain() in glue1.c. */ 63 argv[6] = "-T"; 64 argv[7] = "-F1"; 65 argv[8] = "-o"; 66 argv[9] = one; 67 argv[10] = (char *)onelen; /* Horrid kludge again */ 68 argv[11] = abuff; 69 strcpy (abuff,arg); 70 if (strlen(abuff) > ALEN) 71 err("abuff not big enough %d", strlen(abuff)); 72 argc = 6; 73 huntmain (argc,argv); 74 return(0); 75 } 76 77 dodeliv(in, out, arg, outlen) 78 char *in, *out, *arg; 79 { 80 # if D1 81 fprintf(stderr, "in dodeliv, arg /%s/\n", arg?arg:""); 82 # endif 83 if (arg && arg[0]) 84 chdir(arg); 85 findline(in, out, outlen, 0L); 86 restodir(); 87 } 88