]> pd.if.org Git - pdclib/commitdiff
Preliminary signal handling.
authorsolar <unknown>
Thu, 9 Dec 2010 07:13:57 +0000 (07:13 +0000)
committersolar <unknown>
Thu, 9 Dec 2010 07:13:57 +0000 (07:13 +0000)
functions/signal/raise.c [new file with mode: 0644]
functions/signal/signal.c [new file with mode: 0644]
includes/signal.h [new file with mode: 0644]
platform/example/internals/_PDCLIB_config.h
platform/example_64/internals/_PDCLIB_config.h
platform/example_cygwin/internals/_PDCLIB_config.h

diff --git a/functions/signal/raise.c b/functions/signal/raise.c
new file mode 100644 (file)
index 0000000..29afe15
--- /dev/null
@@ -0,0 +1,60 @@
+/* $Id$ */
+
+/* raise( int )
+
+   This file is part of the Public Domain C Library (PDCLib).
+   Permission is granted to use, modify, and / or redistribute at will.
+*/
+
+#include <signal.h>
+
+#ifndef REGTEST
+
+extern void (*_PDCLIB_sigabrt)( int );
+extern void (*_PDCLIB_sigfpe)( int );
+extern void (*_PDCLIB_sigill)( int );
+extern void (*_PDCLIB_sigint)( int );
+extern void (*_PDCLIB_sigsegv)( int );
+extern void (*_PDCLIB_sigterm)( int );
+
+int raise( int sig )
+{
+    switch ( sig )
+    {
+        case SIGABRT:
+            _PDCLIB_sigabrt( sig );
+            break;
+        case SIGFPE:
+            _PDCLIB_sigfpe( sig );
+            break;
+        case SIGILL:
+            _PDCLIB_sigill( sig );
+            break;
+        case SIGINT:
+            _PDCLIB_sigint( sig );
+            break;
+        case SIGSEGV:
+            _PDCLIB_sigsegv( sig );
+            break;
+        case SIGTERM:
+            _PDCLIB_sigterm( sig );
+            break;
+        default:
+            /* TODO: Implement. */
+            break;
+    }
+    /* TODO: Implement. */
+    return 0;
+}
+
+#endif
+
+#ifdef TEST
+#include <_PDCLIB_test.h>
+
+int main( void )
+{
+    TESTCASE( NO_TESTDRIVER );
+    return TEST_RESULTS;
+}
+#endif
diff --git a/functions/signal/signal.c b/functions/signal/signal.c
new file mode 100644 (file)
index 0000000..fb1ff0b
--- /dev/null
@@ -0,0 +1,74 @@
+/* $Id$ */
+
+/* signal( int sig, void (*func)( int ) )
+
+   This file is part of the Public Domain C Library (PDCLib).
+   Permission is granted to use, modify, and / or redistribute at will.
+*/
+
+#include <signal.h>
+
+#ifndef REGTEST
+
+#include <stdlib.h>
+
+static void default_handler( int sig )
+{
+    /* TODO: Implement error message */
+    exit( EXIT_FAILURE );
+}
+
+void (*_PDCLIB_sigabrt)( int ) = default_handler;
+void (*_PDCLIB_sigfpe)( int )  = default_handler;
+void (*_PDCLIB_sigill)( int )  = default_handler;
+void (*_PDCLIB_sigint)( int )  = default_handler;
+void (*_PDCLIB_sigsegv)( int ) = default_handler;
+void (*_PDCLIB_sigterm)( int ) = default_handler;
+
+void (*signal( int sig, void (*func)( int ) ) )( int )
+{
+    void (*oldhandler)( int );
+    switch ( sig )
+    {
+        case SIGABRT:
+            oldhandler = _PDCLIB_sigabrt;
+            _PDCLIB_sigabrt = func;
+            break;
+        case SIGFPE:
+            oldhandler = _PDCLIB_sigfpe;
+            _PDCLIB_sigfpe = func;
+            break;
+        case SIGILL:
+            oldhandler = _PDCLIB_sigill;
+            _PDCLIB_sigill = func;
+            break;
+        case SIGINT:
+            oldhandler = _PDCLIB_sigint;
+            _PDCLIB_sigint = func;
+            break;
+        case SIGSEGV:
+            oldhandler = _PDCLIB_sigsegv;
+            _PDCLIB_sigsegv = func;
+            break;
+        case SIGTERM:
+            oldhandler = _PDCLIB_sigterm;
+            _PDCLIB_sigterm = func;
+            break;
+        default:
+            /* TODO: Implement. */
+            break;
+    }
+    return oldhandler;
+}
+
+#endif
+
+#ifdef TEST
+#include <_PDCLIB_test.h>
+
+int main( void )
+{
+    TESTCASE( NO_TESTDRIVER );
+    return TEST_RESULTS;
+}
+#endif
diff --git a/includes/signal.h b/includes/signal.h
new file mode 100644 (file)
index 0000000..7123b4a
--- /dev/null
@@ -0,0 +1,39 @@
+/* $Id$ */
+
+/* Signal handling <string.h>
+
+   This file is part of the Public Domain C Library (PDCLib).
+   Permission is granted to use, modify, and / or redistribute at will.
+*/
+
+#ifndef _PDCLIB_SIGNAL_H
+#define _PDCLIB_SIGNAL_H _PDCLIB_SIGNAL_H
+
+#ifndef _PDCLIB_CONFIG_H
+#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H
+#include <_PDCLIB_config.h>
+#endif
+
+typedef _PDCLIB_sig_atomic sig_atomic_t;
+
+#define SIG_DFL _PDCLIB_SIG_DFL
+#define SIG_ERR _PDCLIB_SIG_ERR
+#define SIG_IGN _PDCLIB_SIG_IGN
+
+#define SIGABRT _PDCLIB_SIGABRT
+#define SIGFPE  _PDCLIB_SIGFPE
+#define SIGILL  _PDCLIB_SIGILL
+#define SIGINT  _PDCLIB_SIGINT
+#define SIGSEGV _PDCLIB_SIGSEGV
+#define SIGTERM _PDCLIB_SIGTERM
+
+/* Returns the value of func for the most recent successful call to signal()
+   for the signal sig. Returns SIG_ERR and sets errno to a positive value
+   otherwise.
+*/
+void (*signal( int sig, void (*func)( int ) ) )( int );
+
+/* Returns zero if successful, nonzero otherwise. */
+int raise( int sig );
+
+#endif
index 92d5662b541cc4ab1e986107a8fae6d041366fab..0f0c21c7e5fc5ea02dacbb43a3a74ebc5a6c7cb0 100644 (file)
@@ -286,3 +286,38 @@ typedef int _PDCLIB_fd_t;
 */
 #define _PDCLIB_UNGETCBUFSIZE 1
 
+/* Signals ------------------------------------------------------------------ */
+
+/* A word on signals, to the people using PDCLib in their OS projects.
+
+   The way they are defined by the C standard severely limits their usefulness,
+   to the point where a library implementation need not interface with the OS'
+   signals at all (which is what the PDCLib example implementation does).
+   (Other issues include, for example, that signal handlers are not re-entrant.)
+
+   Thus, it is strongly discouraged to try bolting on a signal handling infra-
+   structure onto <signal.h>. Since C's signal handling is so limited to begin
+   with, and code using it is pretty much non-portable anyway, it would be
+   smarter to keep <signal.h> in the barely functional state it is in, and
+   instead create a better, OS-specific API.
+
+   That being said, the below signals require to be defined to a positive int
+   value. I took what my Linux box defined them to; if you have to change them,
+   and what value to change them *to*, depends heavily on your environment and
+   what you are expecting <signal.h> to accomplish (see above).
+*/
+#define _PDCLIB_SIGABRT 6
+#define _PDCLIB_SIGFPE  8
+#define _PDCLIB_SIGILL  4
+#define _PDCLIB_SIGINT  2
+#define _PDCLIB_SIGSEGV 11
+#define _PDCLIB_SIGTERM 15
+
+/* The following should be defined to pointer values that could NEVER point to
+   a valid function. (They are used as special arguments to signal().) Again, I
+   took the values of my Linux box, which should be as good as any other value.
+*/
+#define _PDCLIB_SIG_DFL (void (*)( int ))0
+#define _PDCLIB_SIG_ERR (void (*)( int ))-1
+#define _PDCLIB_SIG_IGN (void (*)( int ))1
+
index 9ab6b2f8eae94b24b36886911fa2869d885e152e..ba3de27e9483dbfe8eb5e7f4e71323f8d703b453 100644 (file)
@@ -279,3 +279,38 @@ typedef int _PDCLIB_fd_t;
 */
 #define _PDCLIB_UNGETCBUFSIZE 1
 
+/* Signals ------------------------------------------------------------------ */
+
+/* A word on signals, to the people using PDCLib in their OS projects.
+
+   The way they are defined by the C standard severely limits their usefulness,
+   to the point where a library implementation need not interface with the OS'
+   signals at all (which is what the PDCLib example implementation does).
+   (Other issues include, for example, that signal handlers are not re-entrant.)
+
+   Thus, it is strongly discouraged to try bolting on a signal handling infra-
+   structure onto <signal.h>. Since C's signal handling is so limited to begin
+   with, and code using it is pretty much non-portable anyway, it would be
+   smarter to keep <signal.h> in the barely functional state it is in, and
+   instead create a better, OS-specific API.
+
+   That being said, the below signals require to be defined to a positive int
+   value. I took what my Linux box defined them to; if you have to change them,
+   and what value to change them *to*, depends heavily on your environment and
+   what you are expecting <signal.h> to accomplish (see above).
+*/
+#define _PDCLIB_SIGABRT 6
+#define _PDCLIB_SIGFPE  8
+#define _PDCLIB_SIGILL  4
+#define _PDCLIB_SIGINT  2
+#define _PDCLIB_SIGSEGV 11
+#define _PDCLIB_SIGTERM 15
+
+/* The following should be defined to pointer values that could NEVER point to
+   a valid function. (They are used as special arguments to signal().) Again, I
+   took the values of my Linux box, which should be as good as any other value.
+*/
+#define _PDCLIB_SIG_DFL (void (*)( int ))0
+#define _PDCLIB_SIG_ERR (void (*)( int ))-1
+#define _PDCLIB_SIG_IGN (void (*)( int ))1
+
index 2fd09e9706becf513c23796fe4748d5c071eb4f8..8512ad9295d7b85976756fe330c8cacd868fec92 100644 (file)
@@ -287,3 +287,39 @@ typedef int _PDCLIB_fd_t;
 #define _PDCLIB_UNGETCBUFSIZE 1
 
 typedef long wint_t;
+
+/* Signals ------------------------------------------------------------------ */
+
+/* A word on signals, to the people using PDCLib in their OS projects.
+
+   The way they are defined by the C standard severely limits their usefulness,
+   to the point where a library implementation need not interface with the OS'
+   signals at all (which is what the PDCLib example implementation does).
+   (Other issues include, for example, that signal handlers are not re-entrant.)
+
+   Thus, it is strongly discouraged to try bolting on a signal handling infra-
+   structure onto <signal.h>. Since C's signal handling is so limited to begin
+   with, and code using it is pretty much non-portable anyway, it would be
+   smarter to keep <signal.h> in the barely functional state it is in, and
+   instead create a better, OS-specific API.
+
+   That being said, the below signals require to be defined to a positive int
+   value. I took what my Linux box defined them to; if you have to change them,
+   and what value to change them *to*, depends heavily on your environment and
+   what you are expecting <signal.h> to accomplish (see above).
+*/
+#define _PDCLIB_SIGABRT 6
+#define _PDCLIB_SIGFPE  8
+#define _PDCLIB_SIGILL  4
+#define _PDCLIB_SIGINT  2
+#define _PDCLIB_SIGSEGV 11
+#define _PDCLIB_SIGTERM 15
+
+/* The following should be defined to pointer values that could NEVER point to
+   a valid function. (They are used as special arguments to signal().) Again, I
+   took the values of my Linux box, which should be as good as any other value.
+*/
+#define _PDCLIB_SIG_DFL (void (*)( int ))0
+#define _PDCLIB_SIG_ERR (void (*)( int ))-1
+#define _PDCLIB_SIG_IGN (void (*)( int ))1
+