From b310c854fc771255ffc8bb57a3a76e8ce856ab7f Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
Date: Tue, 22 Feb 2000 12:09:24 +0000
Subject: [PATCH] [project @ 2000-02-22 12:09:23 by simonmar] Ignore SIGPIPE,
 since our I/O library handles EPIPE properly and SIGPIPE tends to cause the
 Haskell program to exit silently and mysteriously.

Found-by: furiously pressing the refresh button in a browser connected
to my Haskell web server :-)
---
 ghc/rts/RtsStartup.c |  6 +++---
 ghc/rts/Signals.c    | 20 ++++++++++++--------
 ghc/rts/Signals.h    |  4 ++--
 3 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c
index 7439a7809928..7208ae0e211d 100644
--- a/ghc/rts/RtsStartup.c
+++ b/ghc/rts/RtsStartup.c
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.29 2000/02/17 17:19:42 simonmar Exp $
+ * $Id: RtsStartup.c,v 1.30 2000/02/22 12:09:24 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -143,8 +143,8 @@ startupHaskell(int argc, char *argv[])
 #if !defined(mingw32_TARGET_OS) && !defined(PAR)
     /* Initialise the user signal handler set */
     initUserSignals();
-    /* Set up handler to run on SIGINT */
-    init_shutdown_handler();
+    /* Set up handler to run on SIGINT, etc. */
+    init_default_handlers();
 #endif
  
     /* When the RTS and Prelude live in separate DLLs,
diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c
index 9c6e058fa4c3..36f223b6be9c 100644
--- a/ghc/rts/Signals.c
+++ b/ghc/rts/Signals.c
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.12 2000/01/13 12:40:16 simonmar Exp $
+ * $Id: Signals.c,v 1.13 2000/02/22 12:09:23 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -273,9 +273,13 @@ shutdown_handler(int sig STG_UNUSED)
  * Haskell code may install their own SIGINT handler, which is
  * fine, provided they're so kind as to put back the old one
  * when they de-install.
+ *
+ * We ignore SIGPIPE, because our I/O library handles EPIPE properly,
+ * and a SIGPIPE tends to cause the program to exit silently and
+ * mysteriously.
  */
 void
-init_shutdown_handler()
+init_default_handlers()
 {
     struct sigaction action,oact;
 
@@ -287,13 +291,13 @@ init_shutdown_handler()
     action.sa_flags = 0;
     if (sigaction(SIGINT, &action, &oact) != 0) {
       /* Oh well, at least we tried. */
-#ifdef DEBUG
-      fprintf(stderr, "init_shutdown_handler: failed to reg SIGINT handler");
-#endif
+      prog_belch("failed to install SIGINT handler");
     }
-}
-
-
 
+    action.sa_handler = SIG_IGN;
+    if (sigaction(SIGPIPE, &action, &oact) != 0) {
+      prog_belch("failed to install SIGINT handler");
+    }
+}
 
 #endif /*! mingw32_TARGET_OS */
diff --git a/ghc/rts/Signals.h b/ghc/rts/Signals.h
index 0127ce583503..0f920180de32 100644
--- a/ghc/rts/Signals.h
+++ b/ghc/rts/Signals.h
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.h,v 1.4 1999/09/22 11:53:33 sof Exp $
+ * $Id: Signals.h,v 1.5 2000/02/22 12:09:24 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -22,7 +22,7 @@ extern void unblockUserSignals(void);
 
 extern void start_signal_handlers(void);
 
-extern void init_shutdown_handler(void);
+extern void init_default_handlers(void);
 
 #else
 
-- 
GitLab