From 17c5472c5a3eb548e9d06555a8863f83eaee9f26 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Tue, 4 Dec 2018 21:21:32 +0100
Subject: bc: switch to SA_RESTART signal handling

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 miscutils/bc.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

(limited to 'miscutils/bc.c')

diff --git a/miscutils/bc.c b/miscutils/bc.c
index 15089314f..148e340a5 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -7121,7 +7121,23 @@ static BcStatus bc_vm_run(int argc, char *argv[],
 
 	if (G.ttyin) {
 #if ENABLE_FEATURE_BC_SIGNALS
-		signal_no_SA_RESTART_empty_mask(SIGINT, record_signo);
+		// With SA_RESTART, most system calls will restart
+		// (IOW: they won't fail with EINTR).
+		// In particular, this means ^C won't cause
+		// stdout to get into "error state" if SIGINT hits
+		// within write() syscall.
+		// The downside is that ^C while line input is taken
+		// will only be handled after [Enter] since read()
+		// from stdin is not interrupted by ^C either,
+		// it restarts, thus fgetc() does not return on ^C.
+		signal_SA_RESTART_empty_mask(SIGINT, record_signo);
+
+		// Without SA_RESTART, this exhibits a bug:
+		// "while (1) print 1" and try ^C-ing it.
+		// Intermittently, instead of returning to input line,
+		// you'll get "output error: Interrupted system call"
+		// and exit.
+		//signal_no_SA_RESTART_empty_mask(SIGINT, record_signo);
 #endif
 		if (!(option_mask32 & BC_FLAG_Q))
 			bc_vm_info();
-- 
cgit v1.2.3