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