1 #include <msvcrt/signal.h>
2 #include <msvcrt/stdlib.h>
3 #include <msvcrt/errno.h>
4 #include <msvcrt/string.h>
5 #include <msvcrt/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 },
44 _p_sig_fn_t signal(int sig, _p_sig_fn_t func)
48 if(sig <= 0 || sig > SIGMAX || sig == SIGKILL)
53 // check with IsBadCodePtr
55 if ( func < (_p_sig_fn_t)4096 ) {
60 for(i=0;i<nsignal;i++) {
61 if ( signal_list[i].signal == sig ) {
62 temp = signal_list[i].handler;
63 signal_list[i].handler = func;
67 temp = signal_list[i].handler;
68 signal_list[i].handler = func;
69 signal_list[i].signal = sig;
70 signal_list[i].signame = "";
84 _p_sig_fn_t temp = SIG_DFL;
90 for(i=0;i<nsignal;i++) {
91 if ( signal_list[i].signal == sig ) {
92 temp = signal_list[i].handler;
95 if(temp == (_p_sig_fn_t)SIG_IGN
96 || (sig == SIGQUIT && temp == (_p_sig_fn_t)SIG_DFL))
97 return 0; /* Ignore it */
98 if(temp == (_p_sig_fn_t)SIG_DFL)
99 _default_handler(sig); /* this does not return */
108 void _default_handler(int sig)