xref: /csrg-svn/lib/libc/gen/signal.c (revision 22111)
1*22111Smckusick /*
2*22111Smckusick  * Copyright (c) 1985 Regents of the University of California.
3*22111Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*22111Smckusick  * specifies the terms and conditions for redistribution.
5*22111Smckusick  */
618296Smckusick 
7*22111Smckusick #ifndef lint
8*22111Smckusick static char sccsid[] = "@(#)signal.c	5.1 (Berkeley) 06/05/85";
9*22111Smckusick #endif not lint
10*22111Smckusick 
1116498Sralph /*
1216498Sralph  * Almost backwards compatible signal.
1316498Sralph  */
1418296Smckusick #include <signal.h>
1516498Sralph 
1618296Smckusick int (*
1718296Smckusick signal(s, a))()
1818296Smckusick 	int s, (*a)();
1918296Smckusick {
2018296Smckusick 	struct sigvec osv, sv;
2118296Smckusick 	static int mask[NSIG];
2218296Smckusick 	static int flags[NSIG];
2318296Smckusick 
2418296Smckusick 	sv.sv_handler = a;
2518296Smckusick 	sv.sv_mask = mask[s];
2618296Smckusick 	sv.sv_flags = flags[s];
2718296Smckusick 	if (sigvec(s, &sv, &osv) < 0)
2818296Smckusick 		return (BADSIG);
2918296Smckusick 	if (sv.sv_mask != osv.sv_mask || sv.sv_flags != osv.sv_flags) {
3018296Smckusick 		mask[s] = sv.sv_mask = osv.sv_mask;
3118296Smckusick 		flags[s] = sv.sv_flags = osv.sv_flags;
3218296Smckusick 		if (sigvec(s, &sv, 0) < 0)
3318296Smckusick 			return (BADSIG);
3418296Smckusick 	}
3518296Smckusick 	return (osv.sv_handler);
3618296Smckusick }
37