.nf
.B "#include <mLib/mdup.h>"
+.ta 2n
.B "typedef struct {"
-.B "\h'4'int cur;"
-.B "\h'4n'int want;"
+.B " int cur;"
+.B " int want;"
.B "} mdup_fd;"
.BI "int mdup(mdup_fd *" v ", size_t " n ");"
if (pipe(p_in) || pipe(p_out) || pipe(p_err)) goto error;
if ((kid = fork()) < 0) goto error;
if (!kid) {
- if (dup2(p_in[0], STDIN_FILENO) < 0 ||
- dup2(p_out[1], STDOUT_FILENO) < 0 ||
- dup2(p_err[2], STDERR_FILENO) < 0 ||
- close(p_in[0]) || close(p_out[0]) || close(p_err[0]) ||
- close(p_in[1]) || close(p_out[1]) || close(p_err[1]))
- _exit(127);
- execvp("/bin/sh", "sh", "-c", "...", (char *)0);
+.ta 2n 4n 2n+\w'\fBif ('u
+ if (dup2(p_in[0], STDIN_FILENO) < 0 ||
+ dup2(p_out[1], STDOUT_FILENO) < 0 ||
+ dup2(p_err[2], STDERR_FILENO) < 0 ||
+ close(p_in[0]) || close(p_out[0]) || close(p_err[0]) ||
+ close(p_in[1]) || close(p_out[1]) || close(p_err[1]))
+ _exit(127);
+ execvp("/bin/sh", "sh", "-c", "...", (char *)0);
}
\&...
.VE
Here's how to rewrite the above function using
.BR mdup .
.VS
+.ta 2n 4n 2n+\w'\fBmd[0].cur = p_out[1]; 'u
#define P_INIT { \-1, \-1 }
int p_in[2] = P_INIT, p_out[2] = P_INIT, p_err[2] = P_INIT;
pid_t kid = -1;
if (pipe(p_in) || pipe(p_out) || pipe(p_err)) goto error;
if ((kid = fork()) < 0) goto error;
if (!kid) {
- if (close(p_in[1] || close(p_out[0]) || close(p_err[0]))
- goto _exit(127);
- md[0].cur = p_in[0]; md[0].want = STDIN_FILENO;
- md[1].cur = p_out[1]; md[1].want = STDOUT_FILENO;
- md[2].cur = p_err[1]; md[2].want = STDERR_FILENO;
- if (mdup(md, 3)) _exit(127);
- execvp("/bin/sh", "sh", "-c", "...", (char *)0);
+ if (close(p_in[1] || close(p_out[0]) || close(p_err[0]))
+ goto _exit(127);
+ md[0].cur = p_in[0]; md[0].want = STDIN_FILENO;
+ md[1].cur = p_out[1]; md[1].want = STDOUT_FILENO;
+ md[2].cur = p_err[1]; md[2].want = STDERR_FILENO;
+ if (mdup(md, 3)) _exit(127);
+ execvp("/bin/sh", "sh", "-c", "...", (char *)0);
}
\&...
.VE