diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 0ab47a58..3b4016ab 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -162,6 +162,7 @@ init.o \ ioleast.o \ isatty.o \ kernelinfo.o \ +kill.o \ localeconv.o \ lseek.o \ memstat.o \ @@ -172,6 +173,7 @@ open.o \ pipe.o \ print.o \ putc.o \ +raise.o \ rand.o \ readdirents.o \ read.o \ @@ -182,6 +184,9 @@ setjmp.o \ setlocale.o \ settermmode.o \ sfork.o \ +SIG_DFL.o \ +SIG_ERR.o \ +SIG_IGN.o \ signal.o \ sleep.o \ stat.o \ diff --git a/libmaxsi/SIG_DFL.cpp b/libmaxsi/SIG_DFL.cpp new file mode 100644 index 00000000..73e49e99 --- /dev/null +++ b/libmaxsi/SIG_DFL.cpp @@ -0,0 +1,63 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + SIG_DFL.cpp + Default signal handler. + +*******************************************************************************/ + +#include +#include + +static void Core(int signum) +{ + exit(128 + signum); +} + +extern "C" void SIG_DFL(int signum) +{ + if ( signum == SIGHUP ) { exit(128 + signum); } else + if ( signum == SIGINT ) { exit(128 + signum); } else + if ( signum == SIGQUIT ) { Core(signum); } else + if ( signum == SIGTRAP ) { Core(signum); } else + if ( signum == SIGABRT ) { Core(signum); } else + if ( signum == SIGEMT ) { Core(signum); } else + if ( signum == SIGFPE ) { Core(signum); } else + if ( signum == SIGKILL ) { exit(128 + signum); } else + if ( signum == SIGBUS ) { Core(signum); } else + if ( signum == SIGSEGV ) { Core(signum); } else + if ( signum == SIGSYS ) { Core(signum); } else + if ( signum == SIGPIPE ) { exit(128 + signum); } else + if ( signum == SIGALRM ) { exit(128 + signum); } else + if ( signum == SIGTERM ) { exit(128 + signum); } else + if ( signum == SIGUSR1 ) { exit(128 + signum); } else + if ( signum == SIGUSR2 ) { exit(128 + signum); } else + if ( signum == SIGCHLD ) { /* Ignore this signal. */ } else + if ( signum == SIGPWR ) { /* Ignore this signal. */ } else + if ( signum == SIGWINCH ) { /* Ignore this signal. */ } else + if ( signum == SIGURG ) { /* Ignore this signal. */ } else + if ( signum == SIGCONT ) { /* Ignore this signal. */ } else + if ( signum == SIGVTALRM ) { /* Ignore this signal. */ } else + if ( signum == SIGXCPU ) { Core(signum); } else + if ( signum == SIGXFSZ ) { Core(signum); } else + if ( signum == SIGWAITING ) { /* Ignore this signal. */ } else + if ( signum == SIGLWP ) { /* Ignore this signal. */ } else + if ( signum == SIGAIO ) { /* Ignore this signal. */ } else + { /* Ignore this signal. */ } +} diff --git a/libmaxsi/SIG_ERR.cpp b/libmaxsi/SIG_ERR.cpp new file mode 100644 index 00000000..469012d9 --- /dev/null +++ b/libmaxsi/SIG_ERR.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + SIG_ERR.cpp + Abort on signal. + +*******************************************************************************/ + +#include +#include + +extern "C" void SIG_ERR(int /*signum*/) +{ + abort(); +} diff --git a/libmaxsi/SIG_IGN.cpp b/libmaxsi/SIG_IGN.cpp new file mode 100644 index 00000000..232ca170 --- /dev/null +++ b/libmaxsi/SIG_IGN.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + SIG_IGN.cpp + Ignore signal. + +*******************************************************************************/ + +#include +#include + +extern "C" void SIG_IGN(int /*signum*/) +{ + +} diff --git a/libmaxsi/kill.cpp b/libmaxsi/kill.cpp new file mode 100644 index 00000000..99c9dcac --- /dev/null +++ b/libmaxsi/kill.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + kill.cpp + Send signal to process. + +*******************************************************************************/ + +#include +#include +#include + +DEFN_SYSCALL2(int, sys_kill, SYSCALL_KILL, pid_t, int); + +extern "C" int kill(pid_t pid, int signum) +{ + return sys_kill(pid, signum); +} diff --git a/libmaxsi/raise.cpp b/libmaxsi/raise.cpp new file mode 100644 index 00000000..c091c740 --- /dev/null +++ b/libmaxsi/raise.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + raise.cpp + Send signal to current process. + +*******************************************************************************/ + +#include +#include +#include + +DEFN_SYSCALL1(int, sys_raise, SYSCALL_RAISE, int); + +extern "C" int raise(int signum) +{ + return sys_raise(signum); +} diff --git a/libmaxsi/signal.cpp b/libmaxsi/signal.cpp index b67d1141..4c68c8ff 100644 --- a/libmaxsi/signal.cpp +++ b/libmaxsi/signal.cpp @@ -22,111 +22,33 @@ *******************************************************************************/ +#include #include -#include -#include #include -#include -namespace Maxsi +const int MAX_SIGNALS = 128; +sighandler_t handlers[MAX_SIGNALS]; + +extern "C" void SignalHandlerAssembly(int signum); +extern "C" void SignalHandler(int signum) { - namespace Signal - { - typedef void (*Handler)(int); - - void Core(int signum) - { - exit(128 + signum); - } - - extern "C" void SIG_DFL(int signum) - { - if ( signum == SIGHUP ) { exit(128 + signum); } else - if ( signum == SIGINT ) { exit(128 + signum); } else - if ( signum == SIGQUIT ) { Core(signum); } else - if ( signum == SIGTRAP ) { Core(signum); } else - if ( signum == SIGABRT ) { Core(signum); } else - if ( signum == SIGEMT ) { Core(signum); } else - if ( signum == SIGFPE ) { Core(signum); } else - if ( signum == SIGKILL ) { exit(128 + signum); } else - if ( signum == SIGBUS ) { Core(signum); } else - if ( signum == SIGSEGV ) { Core(signum); } else - if ( signum == SIGSYS ) { Core(signum); } else - if ( signum == SIGPIPE ) { exit(128 + signum); } else - if ( signum == SIGALRM ) { exit(128 + signum); } else - if ( signum == SIGTERM ) { exit(128 + signum); } else - if ( signum == SIGUSR1 ) { exit(128 + signum); } else - if ( signum == SIGUSR2 ) { exit(128 + signum); } else - if ( signum == SIGCHLD ) { /* Ignore this signal. */ } else - if ( signum == SIGPWR ) { /* Ignore this signal. */ } else - if ( signum == SIGWINCH ) { /* Ignore this signal. */ } else - if ( signum == SIGURG ) { /* Ignore this signal. */ } else - if ( signum == SIGCONT ) { /* Ignore this signal. */ } else - if ( signum == SIGVTALRM ) { /* Ignore this signal. */ } else - if ( signum == SIGXCPU ) { Core(signum); } else - if ( signum == SIGXFSZ ) { Core(signum); } else - if ( signum == SIGWAITING ) { /* Ignore this signal. */ } else - if ( signum == SIGLWP ) { /* Ignore this signal. */ } else - if ( signum == SIGAIO ) { /* Ignore this signal. */ } else - { /* Ignore this signal. */ } - } - - extern "C" void SIG_IGN(int /*signum*/) - { - - } - - extern "C" void SIG_ERR(int /*signum*/) - { - abort(); - } - - const int MAX_SIGNALS = 128; - sighandler_t handlers[MAX_SIGNALS]; - - extern "C" void SignalHandlerAssembly(int signum); - extern "C" void SignalHandler(int signum) - { - if ( 0 <= signum && signum < (int) MAX_SIGNALS ) - { - handlers[signum](signum); - } - } - - DEFN_SYSCALL1_VOID(SysRegisterSignalHandler, SYSCALL_REGISTER_SIGNAL_HANDLER, sighandler_t); - DEFN_SYSCALL2(int, SysKill, SYSCALL_KILL, pid_t, int); - DEFN_SYSCALL1(int, SysRaise, SYSCALL_RAISE, int); - - extern "C" void init_signal() - { - for ( int i = 0; i < MAX_SIGNALS; i++ ) - { - handlers[i] = SIG_DFL; - } - - // Tell the kernel which function we want called upon signals. - SysRegisterSignalHandler(&SignalHandlerAssembly); - } - - Handler RegisterHandler(int signum, Handler handler) - { - if ( signum < 0 || MAX_SIGNALS <= signum ) { return SIG_ERR; } - return handlers[signum] = handler; - } - - extern "C" sighandler_t signal(int signum, sighandler_t handler) - { - return RegisterHandler(signum, handler); - } - - extern "C" int kill(pid_t pid, int signum) - { - return SysKill(pid, signum); - } - - extern "C" int raise(int signum) - { - return SysRaise(signum); - } - } + if ( 0 <= signum && signum < (int) MAX_SIGNALS ) + handlers[signum](signum); +} + +DEFN_SYSCALL1_VOID(sys_register_signal_handler, SYSCALL_REGISTER_SIGNAL_HANDLER, sighandler_t); + +extern "C" void init_signal() +{ + for ( int i = 0; i < MAX_SIGNALS; i++ ) + handlers[i] = SIG_DFL; + + // Tell the kernel which function we want called upon signals. + sys_register_signal_handler(&SignalHandlerAssembly); +} + +extern "C" sighandler_t signal(int signum, sighandler_t handler) +{ + if ( signum < 0 || MAX_SIGNALS <= signum ) { return SIG_ERR; } + return handlers[signum] = handler; }