minix/lib/ansi/signal.c

36 lines
871 B
C
Raw Normal View History

2005-04-21 16:53:53 +02:00
/* SYSVR4 and ANSI compatible signal(2). */
#include <lib.h>
#define sigaction _sigaction
#define sigemptyset _sigemptyset
#include <signal.h>
PUBLIC sighandler_t signal(sig, disp)
int sig; /* signal number */
sighandler_t disp; /* signal handler, or SIG_DFL, or SIG_IGN */
{
struct sigaction sa, osa;
if (sig <= 0 || sig > _NSIG || sig == SIGKILL) {
errno = EINVAL;
return(SIG_ERR);
}
sigemptyset(&sa.sa_mask);
#ifdef WANT_UNRELIABLE_SIGNALS
/* Allow the signal being handled to interrupt the signal handler. */
sa.sa_flags = SA_NODEFER;
/* When signal is caught, reset signal handler to SIG_DFL for all but
* SIGILL and SIGTRAP.
*/
if (sig != SIGILL && sig != SIGTRAP) sa.sa_flags |= SA_RESETHAND;
#else
sa.sa_flags = 0;
#endif
sa.sa_handler = disp;
if (sigaction(sig, &sa, &osa) < 0) return(SIG_ERR);
return(osa.sa_handler);
}