]> pd.if.org Git - pdclib/blob - functions/signal/signal.c
PDCLib includes with quotes, not <>.
[pdclib] / functions / signal / signal.c
1 /* signal( int sig, void (*func)( int ) )
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 #include <signal.h>
8 #include <errno.h>
9
10 #ifndef REGTEST
11
12 void (*_PDCLIB_sigabrt)( int ) = SIG_DFL;
13 void (*_PDCLIB_sigfpe)( int )  = SIG_DFL;
14 void (*_PDCLIB_sigill)( int )  = SIG_DFL;
15 void (*_PDCLIB_sigint)( int )  = SIG_DFL;
16 void (*_PDCLIB_sigsegv)( int ) = SIG_DFL;
17 void (*_PDCLIB_sigterm)( int ) = SIG_DFL;
18
19 void (*signal( int sig, void (*func)( int ) ) )( int )
20 {
21     void (*oldhandler)( int );
22     if ( sig <= 0 || func == SIG_ERR )
23     {
24         return SIG_ERR;
25     }
26     switch ( sig )
27     {
28         case SIGABRT:
29             oldhandler = _PDCLIB_sigabrt;
30             _PDCLIB_sigabrt = func;
31             break;
32         case SIGFPE:
33             oldhandler = _PDCLIB_sigfpe;
34             _PDCLIB_sigfpe = func;
35             break;
36         case SIGILL:
37             oldhandler = _PDCLIB_sigill;
38             _PDCLIB_sigill = func;
39             break;
40         case SIGINT:
41             oldhandler = _PDCLIB_sigint;
42             _PDCLIB_sigint = func;
43             break;
44         case SIGSEGV:
45             oldhandler = _PDCLIB_sigsegv;
46             _PDCLIB_sigsegv = func;
47             break;
48         case SIGTERM:
49             oldhandler = _PDCLIB_sigterm;
50             _PDCLIB_sigterm = func;
51             break;
52         default:
53             errno = EINVAL;
54             return SIG_ERR;
55     }
56     return oldhandler;
57 }
58
59 #endif
60
61 #ifdef TEST
62 #include "_PDCLIB_test.h"
63
64 int main( void )
65 {
66     /* Testing covered by raise.c */
67     return TEST_RESULTS;
68 }
69 #endif