xref: /csrg-svn/lib/libc/gen/signalsim.c (revision 17335)
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