1 #include <crtdll/signal.h>
2 #include <crtdll/stdlib.h>
3 #include <crtdll/errno.h>
4 #include <crtdll/string.h>
5 #include <crtdll/internal/file.h>
7 void _default_handler(int signal);
9 typedef struct _sig_element
16 static sig_element signal_list[SIGMAX] =
18 { 0, "Signal 0", SIG_DFL },
19 { SIGABRT, "Aborted",SIG_DFL },
20 { SIGFPE, "Erroneous arithmetic operation",SIG_DFL },
21 { SIGILL, "Illegal instruction",SIG_DFL },
22 { SIGINT, "Interrupt",SIG_DFL },
23 { SIGSEGV, "Invalid access to storage",SIG_DFL },
24 { SIGTERM, "Terminated",SIG_DFL },
25 { SIGHUP, "Hangup",SIG_DFL },
26 { SIGQUIT, "Quit",SIG_DFL },
27 { SIGPIPE, "Broken pipe",SIG_DFL },
28 { SIGKILL, "Killed",SIG_DFL },
29 { SIGALRM, "Alarm clock",SIG_DFL },
30 { 0, "Stopped (signal)",SIG_DFL },
31 { 0, "Stopped",SIG_DFL },
32 { 0, "Continued",SIG_DFL },
33 { 0, "Child exited",SIG_DFL },
34 { 0, "Stopped (tty input)",SIG_DFL },
35 { 0, "Stopped (tty output)",SIG_DFL },
41 _p_sig_fn_t signal(int sig, _p_sig_fn_t func)
45 if(sig <= 0 || sig > SIGMAX || sig == SIGKILL)
50 // check with IsBadCodePtr
52 if ( func < (_p_sig_fn_t)4096 ) {
57 for(i=0;i<nsignal;i++) {
58 if ( signal_list[i].signal == sig ) {
59 temp = signal_list[i].handler;
60 signal_list[i].handler = func;
64 temp = signal_list[i].handler;
65 signal_list[i].handler = func;
66 signal_list[i].signal = sig;
67 signal_list[i].signame = "";
78 _p_sig_fn_t temp = SIG_DFL;
84 for(i=0;i<nsignal;i++) {
85 if ( signal_list[i].signal == sig ) {
86 temp = signal_list[i].handler;
89 if(temp == (_p_sig_fn_t)SIG_IGN
90 || (sig == SIGQUIT && temp == (_p_sig_fn_t)SIG_DFL))
91 return 0; /* Ignore it */
92 if(temp == (_p_sig_fn_t)SIG_DFL)
93 _default_handler(sig); /* this does not return */
102 void _default_handler(int sig)