Files
Arquivotheca.SunOS-4.1.3/lib/libc/sys/common/sigvec.c
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

57 lines
1.1 KiB
C

#if !defined(lint) && defined(SCCSIDS)
static char sccsid[] = "@(#)sigvec.c 1.1 92/07/30";
#endif
/*
* Copyright (c) 1983 by Sun Microsystems, Inc.
*/
#include <signal.h>
#include <syscall.h>
#include <errno.h>
void (*_sigfunc[NSIG])();
extern void _sigtramp();
extern int errno;
sigvec(sig, vec, ovec)
int sig;
register struct sigvec *vec, *ovec;
{
struct sigvec avec;
register void (*osig)(), (*nsig)();
register int omask, saved_errno;
if (sig <= 0 || sig >= NSIG) {
errno = EINVAL;
return (-1);
}
omask = sigblock(sigmask(sig));
osig = _sigfunc[sig];
if (_sigvec(sig, vec, ovec) < 0)
goto error;
if (vec) {
avec = *vec;
vec = &avec;
if ((nsig = vec->sv_handler) != SIG_DFL && nsig != SIG_IGN) {
_sigfunc[sig] = nsig;
vec->sv_handler = _sigtramp;
}
if (_sigvec(sig, vec, (struct sigvec *)0) < 0)
goto error;
}
if (ovec && ovec->sv_handler == _sigtramp)
ovec->sv_handler = osig;
(void)sigsetmask(omask);
return (0);
error:
saved_errno = errno;
(void)sigsetmask(omask);
_sigfunc[sig] = osig;
errno = saved_errno;
return (-1);
}