diff options
author | Mike FABIAN <mfabian@redhat.com> | 2011-06-07 13:42:00 +0200 |
---|---|---|
committer | Egbert Eich <eich@freedesktop.org> | 2013-01-08 09:53:30 -0500 |
commit | 473959141641b6779e6ff3c3c5b6ef326073bcd4 (patch) | |
tree | 228a04092ebfe11e956797bce2d5a500c0504aa5 | |
parent | 9baee90bb4a81d439a7e2de13de190bf65936b4c (diff) |
Set up terminal before fork.
After the fork it is undefined wether parent or child runs
first. So there can be a race: if the child runs before the
terminal of the parent is set up correctly luit may hang.
This patch sets up the terminal before forking and undoes
the settings in the child.
Signed-off-by: Mike FABIAN <mfabian@redhat.com>
Signed-off-by: Egbert Eich <eich@freedesktop.org>
-rw-r--r-- | luit.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -577,6 +577,8 @@ condom(int argc, char **argv) IGNORE_RC(pipe(c2p_waitpipe)); } + setup_io(pty); + pid = fork(); if (pid < 0) { perror("Couldn't fork"); @@ -584,6 +586,10 @@ condom(int argc, char **argv) } if (pid == 0) { +#ifdef SIGWINCH + installHandler(SIGWINCH, SIG_DFL); +#endif + installHandler(SIGCHLD, SIG_DFL); close(pty); if (pipe_option) { close_waitpipe(1); @@ -661,7 +667,6 @@ parent(int pid GCC_UNUSED, int pty) if (verbose) { reportIso2022(outputState); } - setup_io(pty); if (pipe_option) { write_waitpipe(p2c_waitpipe); |