File: Signal.c

package info (click to toggle)
oo2c64 1.5.0-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 8,904 kB
  • ctags: 5,775
  • sloc: ansic: 97,209; sh: 473; makefile: 344; perl: 57; lisp: 21
file content (292 lines) | stat: -rw-r--r-- 6,204 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/* $Id: Signal.c,v 1.9 1999/10/03 11:48:56 ooc-devel Exp $ */
/*  Signal handling facilities.
    Copyright (C) 1997, 1998, 1999  Michael van Acken

    This module 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 2 of
    the License, or (at your option) any later version.

    This module 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 OOC. If not, write to the Free Software Foundation,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

#include "__oo2c.h"
#include "Signal.h"


Exception__Source Signal__exception;
Signal__SigHandler Signal__handlerDefault;
Signal__SigHandler Signal__handlerIgnore;
Signal__SigHandler Signal__handlerException;
Signal__SigHandler Signal__handlerError;


Signal__SigNumber Signal__Map (Signal__SigNumber signum) {
  switch (signum) {
  case Signal__sigfpe:
#ifdef SIGFPE
    return SIGFPE;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigill:
#ifdef SIGILL
    return SIGILL;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigsegv:
#ifdef SIGSEGV
    return SIGSEGV;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigbus:
#ifdef SIGBUS
    return SIGBUS;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigabrt:
#ifdef SIGABRT
    return SIGABRT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigiot:
#ifdef SIGIOT
    return SIGIOT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigtrap:
#ifdef SIGTRAP
    return SIGTRAP;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigemt:
#ifdef SIGEMT
    return SIGEMT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigsys:
#ifdef SIGSYS
    return SIGSYS;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigstkflt:
#ifdef SIGSTKFLT
    return SIGSTKFLT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigterm:
#ifdef SIGTERM
    return SIGTERM;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigint:
#ifdef SIGINT
    return SIGINT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigquit:
#ifdef SIGQUIT
    return SIGQUIT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigkill:
#ifdef SIGKILL
    return SIGKILL;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sighup:
#ifdef SIGHUP
    return SIGHUP;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigalrm:
#ifdef SIGALRM
    return SIGALRM;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigvtalrm:
#ifdef SIGVTALRM
    return SIGVTALRM;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigio:
#ifdef SIGIO
    return SIGIO;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigurg:
#ifdef SIGURG
    return SIGURG;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigpoll:
#ifdef SIGPOLL
    return SIGPOLL;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigchld:
#ifdef SIGCHLD
    return SIGCHLD;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigcld:
#ifdef SIGCLD
    return SIGCLD;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigcont:
#ifdef SIGCONT
    return SIGCONT;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigstop:
#ifdef SIGSTOP
    return SIGSTOP;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigtstp:
#ifdef SIGTSTP
    return SIGTSTP;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigttin:
#ifdef SIGTTIN
    return SIGTTIN;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigttou:
#ifdef SIGTTOU
    return SIGTTOU;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigpipe:
#ifdef SIGPIPE
    return SIGPIPE;
#else
    return Signal__unknownSignal;
#endif
  case Signal__siglost:
#ifdef SIGLOST
    return SIGLOST;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigxcpu:
#ifdef SIGXCPU
    return SIGXCPU;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigxfsz:
#ifdef SIGXFSZ
    return SIGXFSZ;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigpwr:
#ifdef SIGPWR
    return SIGPWR;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigusr1:
#ifdef SIGUSR1
    return SIGUSR1;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigusr2:
#ifdef SIGUSR2
    return SIGUSR2;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigwinch:
#ifdef SIGWINCH
    return SIGWINCH;
#else
    return Signal__unknownSignal;
#endif
  case Signal__siginfo:
#ifdef SIGINFO
    return SIGINFO;
#else
    return Signal__unknownSignal;
#endif
  case Signal__sigdil:
#ifdef SIGDIL
    return SIGDIL;
#else
    return Signal__unknownSignal;
#endif
  default:
    return Signal__unknownSignal;
  }
}

Signal__SigHandler Signal__SetHandler (Signal__SigNumber signum, Signal__SigHandler action) {
  if (action) {
    return (Signal__SigHandler) signal((int)signum, action);
  } else {
    return (Signal__SigHandler) signal((int)signum, SIG_DFL);
  }
}

static void handle_exception(Signal__SigNumber signum) {
  char str[64];

  (void)signal((int)signum, handle_exception);
  sprintf(str, "[Signal] Caught signal number %i", signum);
  Exception__RAISE(Signal__exception, signum, (CHAR*)str, strlen(str));
}

void Signal__Raise(Signal__SigNumber signum) {
  (void)kill(getpid(), (int)signum);
}

void Signal_init(void) {
  Exception__AllocateSource(&Signal__exception);
  _exception_signal = Signal__exception;
  Signal__handlerDefault = (Signal__SigHandler)SIG_DFL;
  Signal__handlerIgnore = (Signal__SigHandler)SIG_IGN;
  Signal__handlerException = (Signal__SigHandler)(&handle_exception);
  Signal__handlerError = (Signal__SigHandler)SIG_ERR;
}