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