zero/reset closed file-descriptors
authorRobin Gareus <robin@gareus.org>
Tue, 30 Apr 2013 01:28:11 +0000 (03:28 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 30 Apr 2013 01:28:46 +0000 (03:28 +0200)
should fix issues with LinuxDSP plugins (X11 thread) & xjadeo

gtk2_ardour/system_exec.cc

index 1f178a6c686177e5c5d8e9b719cccf078a60bca8..566c87dfbb78ae4dac17aa3370dee9d572919d08 100644 (file)
@@ -38,6 +38,8 @@
 using namespace std;
 void * interposer_thread (void *arg);
 
+static void close_fd (int* fd) { if (!fd) return; if (*fd >= 0) ::close (*fd); *fd = -1; }
+
 SystemExec::SystemExec (std::string c, std::string a)
        : cmd(c)
 {
@@ -483,18 +485,18 @@ SystemExec::start (int stderr_mode)
                pid=r;
 
                /* check if execve was successful. */
-               ::close(pok[1]);
+               close_fd(&pok[1]);
                char buf;
                for ( ;; ) {
                        ssize_t n = ::read(pok[0], &buf, 1 );
                        if ( n==1 ) {
                                /* child process returned from execve */
                                pid=0;
-                               ::close(pok[0]);
-                               ::close(pin[1]);
-                               ::close(pin[0]);
-                               ::close(pout[1]);
-                               ::close(pout[0]);
+                               close_fd(&pok[0]);
+                               close_fd(&pin[1]);
+                               close_fd(&pin[0]);
+                               close_fd(&pout[1]);
+                               close_fd(&pout[0]);
                                pin[1] = -1;
                                return -3;
                        } else if ( n==-1 ) {
@@ -503,7 +505,7 @@ SystemExec::start (int stderr_mode)
                        }
                        break;
                }
-               ::close(pok[0]);
+               close_fd(&pok[0]);
                /* child started successfully */
 
 #if 0
@@ -519,17 +521,17 @@ SystemExec::start (int stderr_mode)
                }
                if (r == 0) {
                        /* 2nd child process - catch stdout */
-                       ::close(pin[1]);
-                       ::close(pout[1]);
+                       close_fd(&pin[1]);
+                       close_fd(&pout[1]);
                        output_interposer();
                        exit(0);
                }
-               ::close(pout[1]);
-               ::close(pin[0]);
-               ::close(pout[0]);
+               close_fd(&pout[1]);
+               close_fd(&pin[0]);
+               close_fd(&pout[0]);
 #else /* use pthread */
-               ::close(pout[1]);
-               ::close(pin[0]);
+               close_fd(&pout[1]);
+               close_fd(&pin[0]);
                int rv = pthread_create(&thread_id_tt, NULL, interposer_thread, this);
 
                thread_active=true;
@@ -543,15 +545,15 @@ SystemExec::start (int stderr_mode)
        }
 
        /* child process - exec external process */
-       ::close(pok[0]);
+       close_fd(&pok[0]);
        ::fcntl(pok[1], F_SETFD, FD_CLOEXEC);
 
-       ::close(pin[1]);
+       close_fd(&pin[1]);
        if (pin[0] != STDIN_FILENO) {
          ::dup2(pin[0], STDIN_FILENO);
        }
-       ::close(pin[0]);
-       ::close(pout[0]);
+       close_fd(&pin[0]);
+       close_fd(&pout[0]);
        if (pout[1] != STDOUT_FILENO) {
                ::dup2(pout[1], STDOUT_FILENO);
        }
@@ -569,7 +571,7 @@ SystemExec::start (int stderr_mode)
        }
 
        if (pout[1] != STDOUT_FILENO && pout[1] != STDERR_FILENO) {
-               ::close(pout[1]);
+               close_fd(&pout[1]);
        }
 
        if (nicelevel !=0) {
@@ -596,7 +598,7 @@ SystemExec::start (int stderr_mode)
        /* if we reach here something went wrong.. */
        char buf = 0;
        (void) ::write(pok[1], &buf, 1 );
-       (void) ::close(pok[1]);
+       close_fd(&pok[1]);
        exit(-1);
        return -1;
 }
@@ -631,11 +633,10 @@ void
 SystemExec::close_stdin()
 {
        if (pin[1]<0) return;
-       ::close(pin[0]);
-       ::close(pin[1]);
-       ::close(pout[0]);
-       ::close(pout[1]);
-       pin[1] = - 1; // mark as closed
+       close_fd(&pin[0]);
+       close_fd(&pin[1]);
+       close_fd(&pout[0]);
+       close_fd(&pout[1]);
 }
 
 int