xref: /original-bsd/old/refer/refer/glue3.c (revision 608e088d)
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