SIGPIPE now runs with a no-op sighandler, instead of SIG_IGN. This is

so that if scsh exec's a sleazy C program that needs the default
kill-me-I'm-a-loser action of SIGPIPE, the handler will be reset to SIG_DFL
on exec, rather than continue to be ignored.
This commit is contained in:
shivers 1997-04-08 20:06:06 +00:00
parent 459658efa6
commit 18e8530076
1 changed files with 21 additions and 1 deletions

22
unix.c
View File

@ -103,6 +103,18 @@ extern long Spending_interruptsS;
/* Signal handlers */ /* Signal handlers */
/* Note that we turn off SIGPIPE interrupts in a funny way -- we don't
** set the handler to SIGIGN, we set it to a no-op function. This is so
** that when we exec() some other program, the handler will be reset to
** its default, rather than to SIGIGN.
**
** We don't use SIGPIPE, because all write() calls in scsh correctly check
** for error returns, and raise an error exception. Sleazy Unix C programs,
** however, need to get shot down when writing to a closed pipe or socket.
** -Olin 4/97
*/
static RETSIGTYPE static RETSIGTYPE
when_keyboard_interrupt(sig, code, scp) when_keyboard_interrupt(sig, code, scp)
int sig, code; int sig, code;
@ -124,6 +136,14 @@ when_alarm_interrupt(sig, code, scp)
return; return;
} }
static RETSIGTYPE
when_pipe_interrupt(sig, code, scp)
int sig, code;
struct sigcontext *scp;
{
return;
}
/* OS-dependent initialization */ /* OS-dependent initialization */
@ -145,7 +165,7 @@ sysdep_init()
/* SIGPIPE's are bogus. -Olin */ /* SIGPIPE's are bogus. -Olin */
{struct sigaction sa; {struct sigaction sa;
sa.sa_handler = SIG_IGN; sa.sa_handler = when_pipe_interrupt;
sigemptyset(&sa.sa_mask); sigemptyset(&sa.sa_mask);
sa.sa_flags = 0; sa.sa_flags = 0;
sigaction(SIGPIPE, &sa, NULL); sigaction(SIGPIPE, &sa, NULL);