X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=platform%2Fexample%2Ffunctions%2Fsignal%2Fraise.c;fp=functions%2Fsignal%2Fraise.c;h=b16249c2ee75c0dc1941b9944a8ef7bbe0f17f38;hp=29afe151f9b611d6fe0f5f776aa88b5f16496e60;hb=702bdf4497a72b422c591f69c45aa0be0ee23731;hpb=bce3bbfa01d267e2bf7f76750cc7936907bab491 diff --git a/functions/signal/raise.c b/platform/example/functions/signal/raise.c similarity index 65% rename from functions/signal/raise.c rename to platform/example/functions/signal/raise.c index 29afe15..b16249c 100644 --- a/functions/signal/raise.c +++ b/platform/example/functions/signal/raise.c @@ -10,6 +10,8 @@ #ifndef REGTEST +#include + extern void (*_PDCLIB_sigabrt)( int ); extern void (*_PDCLIB_sigfpe)( int ); extern void (*_PDCLIB_sigill)( int ); @@ -19,31 +21,40 @@ extern void (*_PDCLIB_sigterm)( int ); int raise( int sig ) { + void (*sighandler)( int ); switch ( sig ) { case SIGABRT: - _PDCLIB_sigabrt( sig ); + sighandler = _PDCLIB_sigabrt; break; case SIGFPE: - _PDCLIB_sigfpe( sig ); + sighandler = _PDCLIB_sigfpe; break; case SIGILL: - _PDCLIB_sigill( sig ); + sighandler = _PDCLIB_sigill; break; case SIGINT: - _PDCLIB_sigint( sig ); + sighandler = _PDCLIB_sigint; break; case SIGSEGV: - _PDCLIB_sigsegv( sig ); + sighandler = _PDCLIB_sigsegv; break; case SIGTERM: - _PDCLIB_sigterm( sig ); + sighandler = _PDCLIB_sigterm; break; default: /* TODO: Implement. */ break; } - /* TODO: Implement. */ + if ( sighandler == SIG_DFL ) + { + _Exit( EXIT_FAILURE ); + } + else if ( sighandler != SIG_IGN ) + { + sighandler = signal( sig, SIG_DFL ); + sighandler( sig ); + } return 0; }