update for HEAD-2003091401
[reactos.git] / lib / crtdll / signal / signal.c
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>
6
7 void _default_handler(int signal);
8
9 typedef struct _sig_element 
10 {
11         int signal;
12         char *signame;
13         _p_sig_fn_t handler;
14 } sig_element;
15
16 static sig_element signal_list[SIGMAX] =
17   {
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 },
36     { 0, NULL, SIG_DFL }
37   };
38
39 int nsignal = 21;
40
41 /*
42  * @implemented
43  */
44 _p_sig_fn_t     signal(int sig, _p_sig_fn_t func)
45 {
46   _p_sig_fn_t temp;
47   int i;
48   if(sig <= 0 || sig > SIGMAX || sig == SIGKILL)
49   {
50     __set_errno(EINVAL);
51     return SIG_ERR;
52   }
53 // check with IsBadCodePtr
54
55   if ( func < (_p_sig_fn_t)4096 ) {
56         __set_errno(EINVAL);
57         return SIG_ERR;
58   }
59
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;
64                 return temp;
65         }
66   }
67   temp = signal_list[i].handler;
68   signal_list[i].handler = func;
69   signal_list[i].signal = sig;
70   signal_list[i].signame = "";
71   nsignal++;
72   return temp;
73   
74
75 }
76
77
78 /*
79  * @implemented
80  */
81 int
82 raise(int sig)
83 {
84   _p_sig_fn_t temp = SIG_DFL;
85   int i;
86   if(sig <= 0)
87     return -1;
88   if(sig > SIGMAX)
89     return -1;
90   for(i=0;i<nsignal;i++) {
91         if ( signal_list[i].signal == sig ) {
92                 temp = signal_list[i].handler;
93         }
94   }
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 */
100   else
101     temp(sig);
102
103   return 0;
104 }
105
106
107
108 void _default_handler(int sig)
109 {
110         _exit(3);
111 }
112
113