From a79b289569a193985f754d8394b9e1f470d83cd7 Mon Sep 17 00:00:00 2001 From: Emil Mikulic Date: Mon, 11 Mar 2013 04:06:01 +1100 Subject: [PATCH] Make STDERR nonblocking again after SIGCONT. Without this, flow control on the tty can block execution if we were stopped and continued. --- buftee.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/buftee.c b/buftee.c index feb213b..8e430b6 100644 --- a/buftee.c +++ b/buftee.c @@ -64,7 +64,7 @@ static volatile int stopping = 0; // *** (end globals) *********************************************************** -static void signal_handler(int _ignored_ __attribute__((__unused__))) { +static void sig_stopping(int _ignored_ __attribute__((__unused__))) { stopping = 1; } @@ -349,14 +349,19 @@ static void xpthread_join(pthread_t thread) { err(1, "pthread_join(%lu) failed", thread); } +static void sig_continue(int _ignored_ __attribute__((__unused__))) { + set_nonblocking(STDERR_FILENO); +} + int main(int argc, char **argv) { struct writer_thread_list writers; STAILQ_INIT(&writers); - if (signal(SIGINT, signal_handler) == SIG_ERR) err(1, "signal() failed"); - if (signal(SIGTERM, signal_handler) == SIG_ERR) err(1, "signal() failed"); + if (signal(SIGINT, sig_stopping) == SIG_ERR) err(1, "signal() failed"); + if (signal(SIGTERM, sig_stopping) == SIG_ERR) err(1, "signal() failed"); + if (signal(SIGCONT, sig_continue) == SIG_ERR) err(1, "signal() failed"); //if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) err(1, "signal() failed"); - set_nonblocking(STDERR_FILENO); + sig_continue(0); // On Linux, making STDOUT non-blocking has the side-effect of // also making STDIN nonblocking. -- 2.17.1