From 60e31a45b0c015d42e9dc8ca2c991930c3f7fd66 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Mon, 29 Sep 2014 08:59:31 -0700 Subject: 33268: interactive shells treat SIGPIPE like SIGHUP if and only if SHTTY is disconnected --- ChangeLog | 5 +++++ Src/exec.c | 2 ++ Src/init.c | 1 + Src/signals.c | 13 +++++++++++++ 4 files changed, 21 insertions(+) diff --git a/ChangeLog b/ChangeLog index b89f90015..3cccf62ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-09-28 Barton E. Schaefer + + * 33268: Src/exec.c, Src/init.c, Src/signals.c: interactive shells + treat SIGPIPE like SIGHUP if and only if SHTTY is disconnected + 2014-09-27 Barton E. Schaefer * 33256: Src/prompt.c: fix prompttrunc() counting of %{ %} spans diff --git a/Src/exec.c b/Src/exec.c index fb2739acc..fbd309580 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -1005,6 +1005,8 @@ entersubsh(int flags) signal_default(SIGTERM); if (!(sigtrapped[SIGINT] & ZSIG_IGNORED)) signal_default(SIGINT); + if (!(sigtrapped[SIGPIPE])) + signal_default(SIGPIPE); } if (!(sigtrapped[SIGQUIT] & ZSIG_IGNORED)) signal_default(SIGQUIT); diff --git a/Src/init.c b/Src/init.c index 40f46a804..6d005dce7 100644 --- a/Src/init.c +++ b/Src/init.c @@ -1134,6 +1134,7 @@ init_signals(void) winch_block(); /* See utils.c:preprompt() */ #endif if (interact) { + install_handler(SIGPIPE); install_handler(SIGALRM); signal_ignore(SIGTERM); } diff --git a/Src/signals.c b/Src/signals.c index cb2b58161..84a2609e5 100644 --- a/Src/signals.c +++ b/Src/signals.c @@ -594,6 +594,17 @@ zhandler(int sig) wait_for_processes(); break; + case SIGPIPE: + if (!handletrap(SIGPIPE)) { + if (!interact) + _exit(SIGPIPE); + else if (!isatty(SHTTY)) { + stopmsg = 1; + zexit(SIGPIPE, 1); + } + } + break; + case SIGHUP: if (!handletrap(SIGHUP)) { stopmsg = 1; @@ -897,6 +908,8 @@ removetrap(int sig) noholdintr(); } else if (sig == SIGHUP) install_handler(sig); + else if (sig == SIGPIPE && interact && !forklevel) + install_handler(sig); else if (sig && sig <= SIGCOUNT && #ifdef SIGWINCH sig != SIGWINCH && -- cgit 1.4.1