Make STDERR nonblocking again after SIGCONT.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 10 Mar 2013 17:06:01 +0000 (04:06 +1100)
committerEmil Mikulic <emikulic@gmail.com>
Sun, 10 Mar 2013 17:27:59 +0000 (04:27 +1100)
Without this, flow control on the tty can block execution if we
were stopped and continued.

buftee.c

index feb213b..8e430b6 100644 (file)
--- a/buftee.c
+++ b/buftee.c
@@ -64,7 +64,7 @@ static volatile int stopping = 0;
 
 // *** (end globals) ***********************************************************
 
 
 // *** (end globals) ***********************************************************
 
-static void signal_handler(int _ignored_ __attribute__((__unused__))) {
+static void sig_stopping(int _ignored_ __attribute__((__unused__))) {
   stopping = 1;
 }
 
   stopping = 1;
 }
 
@@ -349,14 +349,19 @@ static void xpthread_join(pthread_t thread) {
   err(1, "pthread_join(%lu) failed", 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);
 
 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");
   //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.
 
   // On Linux, making STDOUT non-blocking has the side-effect of
   // also making STDIN nonblocking.