X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/814e42ff7421d66c0a2e33af5765afa2078bc18f..adec5584e13c63662fda18915280ec026063b29d:/sys/mdup.3 diff --git a/sys/mdup.3 b/sys/mdup.3 index 1e1b836..f08c13e 100644 --- a/sys/mdup.3 +++ b/sys/mdup.3 @@ -26,9 +26,10 @@ mdup \- renumber file descriptors .nf .B "#include " +.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 ");" @@ -116,13 +117,14 @@ int i; 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 @@ -145,6 +147,7 @@ the child. 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; @@ -154,13 +157,13 @@ int i; 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