about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2014-09-29 08:59:31 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2014-09-29 08:59:31 -0700
commit60e31a45b0c015d42e9dc8ca2c991930c3f7fd66 (patch)
treea9718b9eb5e1041800fc7f4706bc7d3dbcbcf0ee
parent7cabee52d8132fed31767392540ae67bac36377e (diff)
downloadzsh-60e31a45b0c015d42e9dc8ca2c991930c3f7fd66.tar.gz
zsh-60e31a45b0c015d42e9dc8ca2c991930c3f7fd66.tar.xz
zsh-60e31a45b0c015d42e9dc8ca2c991930c3f7fd66.zip
33268: interactive shells treat SIGPIPE like SIGHUP if and only if SHTTY is disconnected
-rw-r--r--ChangeLog5
-rw-r--r--Src/exec.c2
-rw-r--r--Src/init.c1
-rw-r--r--Src/signals.c13
4 files changed, 21 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index b89f90015..3cccf62ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-09-28  Barton E. Schaefer  <schaefer@zsh.org>
+
+	* 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  <schaefer@zsh.org>
 
 	* 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 &&