X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=platform%2Fexample%2Ffunctions%2Fsignal%2Fraise.c;fp=functions%2Fsignal%2Fraise.c;h=b16249c2ee75c0dc1941b9944a8ef7bbe0f17f38;hb=d2c7499692ec324dee9fa2e81942fd6478ee24f5;hp=29afe151f9b611d6fe0f5f776aa88b5f16496e60;hpb=5b6ac4fcc65f0a5de1e4f51ef2af243c1eef8e7c;p=pdclib.old 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; }