Commit | Line | Data |
---|---|---|
98a25cff | 1 | /* signalsim.c 4.4 84/11/04 */ |
e5a60e87 BJ |
2 | |
3 | /* | |
1669d3ec | 4 | * Almost backwards compatible signal. |
e5a60e87 | 5 | */ |
aa0c42e6 | 6 | #include <signal.h> |
e5a60e87 | 7 | |
98a25cff KM |
8 | enum {NATIVE = 0x0, UNKNOWN = 0x1, SIMULATE = 0x3} _sigsim = UNKNOWN; |
9 | ||
aa0c42e6 | 10 | int (* |
98a25cff | 11 | signalsim(s, a))() |
aa0c42e6 | 12 | int s, (*a)(); |
e5a60e87 | 13 | { |
aa0c42e6 | 14 | struct sigvec osv, sv; |
98a25cff KM |
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 | } | |
e5a60e87 | 37 | |
98a25cff KM |
38 | /* |
39 | * Signal call will trap to here if not implemented | |
40 | */ | |
41 | badcall() | |
42 | { | |
43 | _sigsim = SIMULATE; | |
e5a60e87 | 44 | } |