:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / crtdll / signal / signal.c
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>
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 _p_sig_fn_t     signal(int sig, _p_sig_fn_t func)
42 {
43   _p_sig_fn_t temp;
44   int i;
45   if(sig <= 0 || sig > SIGMAX || sig == SIGKILL)
46   {
47     __set_errno(EINVAL);
48     return SIG_ERR;
49   }
50 // check with IsBadCodePtr
51
52   if ( func < (_p_sig_fn_t)4096 ) {
53         __set_errno(EINVAL);
54         return SIG_ERR;
55   }
56
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;
61                 return temp;
62         }
63   }
64   temp = signal_list[i].handler;
65   signal_list[i].handler = func;
66   signal_list[i].signal = sig;
67   signal_list[i].signame = "";
68   nsignal++;
69   return temp;
70   
71
72 }
73
74
75 int
76 raise(int sig)
77 {
78   _p_sig_fn_t temp = SIG_DFL;
79   int i;
80   if(sig <= 0)
81     return -1;
82   if(sig > SIGMAX)
83     return -1;
84   for(i=0;i<nsignal;i++) {
85         if ( signal_list[i].signal == sig ) {
86                 temp = signal_list[i].handler;
87         }
88   }
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 */
94   else
95     temp(sig);
96
97   return 0;
98 }
99
100
101
102 void _default_handler(int sig)
103 {
104         _exit(3);
105 }
106
107