chiark / gitweb /
bres: Use mdup to duplicate file descriptors for the child.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 4 Jan 2009 17:30:40 +0000 (17:30 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 20 Oct 2012 11:36:07 +0000 (12:36 +0100)
bres.c

diff --git a/bres.c b/bres.c
index 8a73aaf266925a52c0ccff01fd82377e5ded39c0..4efea3c1902d0cf3d12837d5863b4c57c150a74f 100644 (file)
--- a/bres.c
+++ b/bres.c
@@ -49,6 +49,7 @@
 
 #include "alloc.h"
 #include "bres.h"
+#include "mdup.h"
 #include "report.h"
 #include "sel.h"
 
@@ -716,6 +717,7 @@ static int start(bres_server *rs)
 {
   int rfd[2], cfd[2];
   pid_t kid;
+  mdup_fd md[2];
 
   /* --- Make the pipes --- */
 
@@ -733,12 +735,10 @@ static int start(bres_server *rs)
     close(rfd[0]);
 
     if (server) {
-      dup2(cfd[0], STDIN_FILENO);
-      dup2(rfd[1], STDOUT_FILENO);
-      close(cfd[0]);
-      close(rfd[1]);
-      execlp(server, server, (char *)0);
-      child(STDOUT_FILENO, STDIN_FILENO);
+      md[0].cur = cfd[0]; md[0].want = STDIN_FILENO;
+      md[1].cur = rfd[1]; md[1].want = STDOUT_FILENO;
+      if (mdup(md, 2) ||  execlp(server, server, (char *)0))
+       child(STDOUT_FILENO, STDIN_FILENO);
     } else
       child(rfd[1], cfd[0]);
     _exit(1);