123456789101112131415161718192021222324252627282930313233343536 |
- #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 (sigvec_scall(sig,vec,ovec) < 0) {
- _sigfunc[sig] = old;
- return -1;
- }
- if (ovec && ovec->handler == _sigtramp) {
- ovec->handler = old;
- }
- return 0;
- }
|