summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/exec.c2
-rw-r--r--Src/init.c1
-rw-r--r--Src/signals.c13
3 files changed, 16 insertions, 0 deletions
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 &&