xref: /csrg-svn/old/refer/hunt/refer3.c (revision 12267)
1*12267Stut #ifndef lint
2*12267Stut static char *sccsid = "@(#)refer3.c	4.1 (Berkeley) 05/06/83";
3*12267Stut #endif
4*12267Stut 
5*12267Stut #include "refer..c"
6*12267Stut #define move(x, y) close(y); dup(x); close(x);
7*12267Stut 
8*12267Stut corout(in, out, rprog, arg, outlen)
9*12267Stut char *in, *out, *rprog;
10*12267Stut {
11*12267Stut 	int pipev[2], fr1, fr2, fw1, fw2, n;
12*12267Stut 	int status;
13*12267Stut 
14*12267Stut 	pipe(pipev);
15*12267Stut 	fr1 = pipev[0];
16*12267Stut 	fw1 = pipev[1];
17*12267Stut 	pipe(pipev);
18*12267Stut 	fr2 = pipev[0];
19*12267Stut 	fw2 = pipev[1];
20*12267Stut 	if (fork() == 0)
21*12267Stut 	{
22*12267Stut 		close(fw1);
23*12267Stut 		close(fr2);
24*12267Stut 		move(fr1, 0);
25*12267Stut 		move(fw2, 1);
26*12267Stut 		execl(rprog, "deliv", arg, 0);
27*12267Stut 		err("Can't run %s", (void) rprog);
28*12267Stut 	}
29*12267Stut 	close(fw2);
30*12267Stut 	close(fr1);
31*12267Stut 	write(fw1, in , strlen(in));
32*12267Stut 	close(fw1);
33*12267Stut 	wait(&status);
34*12267Stut 	n = read(fr2, out, outlen);
35*12267Stut 	out[n] = 0;
36*12267Stut 	close(fr2);
37*12267Stut 	return(n);
38*12267Stut }
39