xref: /csrg-svn/lib/libc/gen/signal.c (revision 18296)
1*18296Smckusick /*	signal.c	4.3	85/03/11	*/
2*18296Smckusick 
316498Sralph /*
416498Sralph  * Almost backwards compatible signal.
516498Sralph  */
6*18296Smckusick #include <signal.h>
716498Sralph 
8*18296Smckusick int (*
9*18296Smckusick signal(s, a))()
10*18296Smckusick 	int s, (*a)();
11*18296Smckusick {
12*18296Smckusick 	struct sigvec osv, sv;
13*18296Smckusick 	static int mask[NSIG];
14*18296Smckusick 	static int flags[NSIG];
15*18296Smckusick 
16*18296Smckusick 	sv.sv_handler = a;
17*18296Smckusick 	sv.sv_mask = mask[s];
18*18296Smckusick 	sv.sv_flags = flags[s];
19*18296Smckusick 	if (sigvec(s, &sv, &osv) < 0)
20*18296Smckusick 		return (BADSIG);
21*18296Smckusick 	if (sv.sv_mask != osv.sv_mask || sv.sv_flags != osv.sv_flags) {
22*18296Smckusick 		mask[s] = sv.sv_mask = osv.sv_mask;
23*18296Smckusick 		flags[s] = sv.sv_flags = osv.sv_flags;
24*18296Smckusick 		if (sigvec(s, &sv, 0) < 0)
25*18296Smckusick 			return (BADSIG);
26*18296Smckusick 	}
27*18296Smckusick 	return (osv.sv_handler);
28*18296Smckusick }
29