The branch, master has been updated
       via  4d53fd98a67b20527718013ef52f263bf878481c (commit)
      from  938d91d2c37f8837e5e808c9315f551ac7bc4636 (commit)

- Log -----------------------------------------------------------------
commit 4d53fd98a67b20527718013ef52f263bf878481c
Author: Nicholas Marriott <nicholas.marri...@gmail.com>
Commit: Nicholas Marriott <nicholas.marri...@gmail.com>

    Synchronize forkpty master and child to avoid hang on AIX with fast exiting
    child and output left in the queue, from J Raynor.
---
 compat/forkpty-aix.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/compat/forkpty-aix.c b/compat/forkpty-aix.c
index db9c2e7..78e5f7e 100644
--- a/compat/forkpty-aix.c
+++ b/compat/forkpty-aix.c
@@ -23,16 +23,20 @@
 #include <stdlib.h>
 #include <stropts.h>
 #include <unistd.h>
+#include <errno.h>
 
 #include "tmux.h"
 
 pid_t
 forkpty(int *master, unused char *name, struct termios *tio, struct winsize 
*ws)
 {
-       int     slave, fd;
-       char   *path;
+       int     slave, fd, pipe_fd[2];
+       char   *path, dummy;
        pid_t   pid;
 
+       if (pipe(pipe_fd) == -1)
+               return (-1);
+
        if ((*master = open("/dev/ptc", O_RDWR|O_NOCTTY)) == -1)
                return (-1);
 
@@ -47,6 +51,13 @@ forkpty(int *master, unused char *name, struct termios *tio, 
struct winsize *ws)
        case 0:
                close(*master);
 
+               close(pipe_fd[1]);
+               while (read(pipe_fd[0], &dummy, 1) == -1) {
+                       if (errno != EINTR)
+                               break;
+               }
+               close(pipe_fd[0]);
+
                fd = open(_PATH_TTY, O_RDWR|O_NOCTTY);
                if (fd >= 0) {
                        ioctl(fd, TIOCNOTTY, NULL);
@@ -80,13 +91,20 @@ forkpty(int *master, unused char *name, struct termios 
*tio, struct winsize *ws)
                dup2(slave, 2);
                if (slave > 2)
                        close(slave);
+
                return (0);
        }
 
+       close(pipe_fd[0]);
+       close(pipe_fd[1]);
+
        close(slave);
        return (pid);
 
 out:
+       close(pipe_fd[0]);
+       close(pipe_fd[1]);
+
        if (*master != -1)
                close(*master);
        if (slave != -1)


-----------------------------------------------------------------------

Summary of changes:
 compat/forkpty-aix.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
tmux

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
tmux-cvs mailing list
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to