1 /* signalsim.c 4.4 84/11/04 */
2
3 /*
4 * Almost backwards compatible signal.
5 */
6 #include <signal.h>
7
8 enum {NATIVE = 0x0, UNKNOWN = 0x1, SIMULATE = 0x3} _sigsim = UNKNOWN;
9
10 int (*
11 signalsim(s, a))()
12 int s, (*a)();
13 {
14 struct sigvec osv, sv;
15 int badcall();
16
17 switch (_sigsim) {
18 case UNKNOWN:
19 sv.sv_handler = badcall;
20 sv.sv_mask = sv.sv_onstack = 0;
21 if (sigvec(SIGSYS, &sv, &osv) < 0) {
22 _sigsim = SIMULATE;
23 } else {
24 _sigsim = NATIVE;
25 signal(SIGSYS, osv.sv_handler);
26 }
27 /* fall through */
28 case NATIVE:
29 case SIMULATE:
30 sv.sv_handler = a;
31 sv.sv_mask = sv.sv_onstack = 0;
32 if (sigvec(s, &sv, &osv) < 0)
33 return (BADSIG);
34 return (osv.sv_handler);
35 }
36 }
37
38 /*
39 * Signal call will trap to here if not implemented
40 */
badcall()41 badcall()
42 {
43 _sigsim = SIMULATE;
44 }
45