Rev | Line | |
---|
[9] | 1 | /* SYSVR4 and ANSI compatible signal(2). */
|
---|
| 2 |
|
---|
| 3 | #include <lib.h>
|
---|
| 4 | #define sigaction _sigaction
|
---|
| 5 | #define sigemptyset _sigemptyset
|
---|
| 6 | #include <signal.h>
|
---|
| 7 |
|
---|
| 8 | PUBLIC sighandler_t signal(sig, disp)
|
---|
| 9 | int sig; /* signal number */
|
---|
| 10 | sighandler_t disp; /* signal handler, or SIG_DFL, or SIG_IGN */
|
---|
| 11 | {
|
---|
| 12 | struct sigaction sa, osa;
|
---|
| 13 |
|
---|
| 14 | if (sig <= 0 || sig > _NSIG || sig == SIGKILL) {
|
---|
| 15 | errno = EINVAL;
|
---|
| 16 | return(SIG_ERR);
|
---|
| 17 | }
|
---|
| 18 | sigemptyset(&sa.sa_mask);
|
---|
| 19 |
|
---|
| 20 | #ifdef WANT_UNRELIABLE_SIGNALS
|
---|
| 21 | /* Allow the signal being handled to interrupt the signal handler. */
|
---|
| 22 | sa.sa_flags = SA_NODEFER;
|
---|
| 23 |
|
---|
| 24 | /* When signal is caught, reset signal handler to SIG_DFL for all but
|
---|
| 25 | * SIGILL and SIGTRAP.
|
---|
| 26 | */
|
---|
| 27 | if (sig != SIGILL && sig != SIGTRAP) sa.sa_flags |= SA_RESETHAND;
|
---|
| 28 | #else
|
---|
| 29 | sa.sa_flags = 0;
|
---|
| 30 | #endif
|
---|
| 31 |
|
---|
| 32 | sa.sa_handler = disp;
|
---|
| 33 | if (sigaction(sig, &sa, &osa) < 0) return(SIG_ERR);
|
---|
| 34 | return(osa.sa_handler);
|
---|
| 35 | }
|
---|
Note:
See
TracBrowser
for help on using the repository browser.