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