1*17335Smckusick /* signalsim.c 4.4 84/11/04 */
212904Sroot
312904Sroot /*
413624Ssam * Almost backwards compatible signal.
512904Sroot */
612976Ssam #include <signal.h>
712904Sroot
8*17335Smckusick enum {NATIVE = 0x0, UNKNOWN = 0x1, SIMULATE = 0x3} _sigsim = UNKNOWN;
9*17335Smckusick
1012976Ssam int (*
11*17335Smckusick signalsim(s, a))()
1212976Ssam int s, (*a)();
1312904Sroot {
1412976Ssam struct sigvec osv, sv;
15*17335Smckusick int badcall();
1612904Sroot
17*17335Smckusick switch (_sigsim) {
18*17335Smckusick case UNKNOWN:
19*17335Smckusick sv.sv_handler = badcall;
20*17335Smckusick sv.sv_mask = sv.sv_onstack = 0;
21*17335Smckusick if (sigvec(SIGSYS, &sv, &osv) < 0) {
22*17335Smckusick _sigsim = SIMULATE;
23*17335Smckusick } else {
24*17335Smckusick _sigsim = NATIVE;
25*17335Smckusick signal(SIGSYS, osv.sv_handler);
26*17335Smckusick }
27*17335Smckusick /* fall through */
28*17335Smckusick case NATIVE:
29*17335Smckusick case SIMULATE:
30*17335Smckusick sv.sv_handler = a;
31*17335Smckusick sv.sv_mask = sv.sv_onstack = 0;
32*17335Smckusick if (sigvec(s, &sv, &osv) < 0)
33*17335Smckusick return (BADSIG);
34*17335Smckusick return (osv.sv_handler);
35*17335Smckusick }
3612904Sroot }
37*17335Smckusick
38*17335Smckusick /*
39*17335Smckusick * Signal call will trap to here if not implemented
40*17335Smckusick */
badcall()41*17335Smckusick badcall()
42*17335Smckusick {
43*17335Smckusick _sigsim = SIMULATE;
44*17335Smckusick }
45