]> pd.if.org Git - pdclib/blobdiff - platform/example/functions/signal/raise.c
Completed <signal.h>, and moved into platform.
[pdclib] / platform / example / functions / signal / raise.c
similarity index 65%
rename from functions/signal/raise.c
rename to platform/example/functions/signal/raise.c
index 29afe151f9b611d6fe0f5f776aa88b5f16496e60..b16249c2ee75c0dc1941b9944a8ef7bbe0f17f38 100644 (file)
@@ -10,6 +10,8 @@
 
 #ifndef REGTEST
 
+#include <stdlib.h>
+
 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;
 }