SHA256
1
0
forked from pool/luit
luit/u_luit-Set-up-terminal-before-fork.diff

53 lines
1.3 KiB
Diff

From 6b1da100f2984701f181f5d2635ffcff06db9be1 Mon Sep 17 00:00:00 2001
From: Mike Fabian <mike.fabian@gmx.de>
Date: Tue, 7 Jun 2011 13:42:00 +0200
Subject: [PATCH] Set up terminal before fork.
Patch-mainline: To be submitted.
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: Egbert Eich <eich@freedesktop.org>
---
luit.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/luit.c b/luit.c
index 6bd8775..c2a011c 100644
--- a/luit.c
+++ b/luit.c
@@ -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("Output", outputState);
}
- setup_io(pty);
if (pipe_option) {
write_waitpipe(p2c_waitpipe);
--
1.7.3.4