From 264c58c4a4407b4d97e915afe95f0a5e913e2d42 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Mon, 21 Jan 2008 23:29:04 -0500 Subject: [PATCH] Working on bug 184993: Writing to zombie process causes Ikarus to exit. --- scheme/ikarus.io.ss | 3 ++- scheme/last-revision | 2 +- src/ikarus-io.c | 1 + src/ikarus-main.c | 12 ++++++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/scheme/ikarus.io.ss b/scheme/ikarus.io.ss index f2344f8..0bd9b7c 100644 --- a/scheme/ikarus.io.ss +++ b/scheme/ikarus.io.ss @@ -1172,7 +1172,8 @@ #| 18 |# "access fault" #| 19 |# "file already exists" #| 20 |# "invalid file name" - #| 21 |# "non-blocking operation would block")) + #| 21 |# "non-blocking operation would block" + #| 22 |# "broken pipe (e.g., writing to a closed process or socket)")) (define (io-error who id err) (let ([err (fxnot err)]) diff --git a/scheme/last-revision b/scheme/last-revision index 7776e09..4fd02de 100644 --- a/scheme/last-revision +++ b/scheme/last-revision @@ -1 +1 @@ -1358 +1359 diff --git a/src/ikarus-io.c b/src/ikarus-io.c index 8d74a09..8e0766b 100644 --- a/src/ikarus-io.c +++ b/src/ikarus-io.c @@ -34,6 +34,7 @@ ikrt_io_error(){ case EEXIST : return fix(-20); case EINVAL : return fix(-21); case EAGAIN : return fix(-22); /* hardcoded in ikarus.io.ss */ + case EPIPE : return fix(-23); } return fix(-1); } diff --git a/src/ikarus-main.c b/src/ikarus-main.c index e8b9f3a..e557ca9 100644 --- a/src/ikarus-main.c +++ b/src/ikarus-main.c @@ -237,6 +237,18 @@ register_handlers(){ fprintf(stderr, "Sigaction Failed: %s\n", strerror(errno)); exit(-1); } + + /* ignore sigpipes */ + { + sigset_t set; + sigprocmask(0, 0, &set); /* get the set */ + sigaddset(&set, SIGPIPE); + int err = sigprocmask(SIG_SETMASK, &set, &set); + if(err){ + fprintf(stderr, "Sigprocmask Failed: %s\n", strerror(errno)); + exit(-1); + } + } }