ack/mach/sun2/libsys/sigvec.c
1988-05-04 16:16:41 +00:00

37 lines
687 B
C

#include "syscall.h"
#include <errno.h>
struct sigvec { int (*handler)(); int mask,flags; };
int (*(_sigfunc[32]))();
extern int _sigtramp();
extern int errno;
sigvec(sig,vec,ovec)
register struct sigvec *vec;
struct sigvec *ovec;
{
struct sigvec tmp;
int (*old)();
if ((unsigned) sig >= 32) {
errno = EINVAL;
return -1;
}
old = _sigfunc[sig];
if (vec) {
tmp = *vec;
vec = &tmp;
if (vec->handler && vec->handler != (int (*)()) 1) {
_sigfunc[sig] = vec->handler;
vec->handler = _sigtramp;
}
}
if (syscall(SYS_sigvec,sig,vec,ovec) < 0) {
_sigfunc[sig] = old;
return -1;
}
if (ovec && ovec->handler == _sigtramp) {
ovec->handler = old;
}
return 0;
}