xref: /csrg-svn/old/refer/hunt/refer3.c (revision 48296)
1*48296Sbostic /*-
2*48296Sbostic  * %sccs.include.proprietary.c%
3*48296Sbostic  */
4*48296Sbostic 
512267Stut #ifndef lint
6*48296Sbostic static char sccsid[] = "@(#)refer3.c	4.3 (Berkeley) 04/18/91";
7*48296Sbostic #endif /* not lint */
812267Stut 
912267Stut #include "refer..c"
1012267Stut #define move(x, y) close(y); dup(x); close(x);
1112267Stut 
corout(in,out,rprog,arg,outlen)1212267Stut corout(in, out, rprog, arg, outlen)
1312267Stut char *in, *out, *rprog;
1412267Stut {
1512267Stut 	int pipev[2], fr1, fr2, fw1, fw2, n;
1612267Stut 	int status;
1712267Stut 
1812267Stut 	pipe(pipev);
1912267Stut 	fr1 = pipev[0];
2012267Stut 	fw1 = pipev[1];
2112267Stut 	pipe(pipev);
2212267Stut 	fr2 = pipev[0];
2312267Stut 	fw2 = pipev[1];
2412267Stut 	if (fork() == 0)
2512267Stut 	{
2612267Stut 		close(fw1);
2712267Stut 		close(fr2);
2812267Stut 		move(fr1, 0);
2912267Stut 		move(fw2, 1);
3012267Stut 		execl(rprog, "deliv", arg, 0);
3124436Smckusick 		err("Can't run %s", rprog);
3212267Stut 	}
3312267Stut 	close(fw2);
3412267Stut 	close(fr1);
3512267Stut 	write(fw1, in , strlen(in));
3612267Stut 	close(fw1);
3712267Stut 	wait(&status);
3812267Stut 	n = read(fr2, out, outlen);
3912267Stut 	out[n] = 0;
4012267Stut 	close(fr2);
4112267Stut 	return(n);
4212267Stut }
43