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;
}