/* * Copyright (c) 1985 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)signal.c 5.3 (Berkeley) 08/02/88"; #endif /* LIBC_SCCS and not lint */ /* * Almost backwards compatible signal. */ #include int (* signal(s, a))() int s, (*a)(); { struct sigvec osv, sv; static int mask[NSIG]; static int flags[NSIG]; sv.sv_handler = a; sv.sv_mask = mask[s]; sv.sv_flags = flags[s]; if (sigvec(s, &sv, &osv) < 0) return (BADSIG); if (sv.sv_mask != osv.sv_mask || sv.sv_flags != osv.sv_flags) { mask[s] = sv.sv_mask = osv.sv_mask; flags[s] = sv.sv_flags = osv.sv_flags; if (sigvec(s, &sv, 0) < 0) return (BADSIG); } return (osv.sv_handler); }