X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fsignals.c;h=532f09b732f57fe4ba9907218478b579df1a1301;hb=7f2068235fabc311332962711cd3220ce8ee2638;hp=ddaf5448f33050db33904b78e3783f9797694ada;hpb=17e16b3110b4c5124b0707435e0427993d696545;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/signals.c b/Usermode/Libraries/libc.so_src/signals.c index ddaf5448..532f09b7 100644 --- a/Usermode/Libraries/libc.so_src/signals.c +++ b/Usermode/Libraries/libc.so_src/signals.c @@ -2,23 +2,72 @@ * AcessOS Basic C Library * signals.c */ -#include +#include #include #include #include "lib.h" +#include // === CONSTANTS === -#define NUM_SIGNALS 32 +#define NUM_SIGNALS 40 // === GLOBALS === -sighandler_t sighandlers[NUM_SIGNALS]; +struct sigaction sighandlers[NUM_SIGNALS]; // === CODE === sighandler_t signal(int num, sighandler_t handler) { sighandler_t prev; if(num < 0 || num >= NUM_SIGNALS) return NULL; - prev = sighandlers[num]; - sighandlers[num] = handler; + prev = sighandlers[num].sa_handler; + sighandlers[num].sa_handler = handler; + sighandlers[num].sa_mask = 0; return prev; } + +int raise(int signal) +{ + if( signal < 0 || signal > NUM_SIGNALS ) + return 1; + switch(signal) + { + case SIGABRT: + abort(); + break; + } + return 0; +} + +void abort(void) +{ + // raise(SIGABRT); + _SysDebug("abort() - %p", __builtin_return_address(0)); + _exit(-1); +} + +// POSIX +int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) +{ + if( signum < 0 || signum >= NUM_SIGNALS ) { + errno = EINVAL; + return 1; + } + + if( oldact ) + *oldact = sighandlers[signum]; + if( act ) + sighandlers[signum] = *act; + + return 0; +} + +int sigemptyset(sigset_t *set) +{ + *set = 0; + return 0; +} +int sigfillset(sigset_t *set) +{ + *set = -1; + return 0; +}