xref: /original-bsd/lib/libc/gen/signalsim.c (revision e59fb703)
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  */
41 badcall()
42 {
43 	_sigsim = SIMULATE;
44 }
45