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