sigvec.c 681 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include "syscall.h"
  2. #include <errno.h>
  3. struct sigvec { int (*handler)(); int mask,flags; };
  4. int (*(_sigfunc[32]))();
  5. extern int _sigtramp();
  6. extern int errno;
  7. sigvec(sig,vec,ovec)
  8. register struct sigvec *vec;
  9. struct sigvec *ovec;
  10. {
  11. struct sigvec tmp;
  12. int (*old)();
  13. if ((unsigned) sig >= 32) {
  14. errno = EINVAL;
  15. return -1;
  16. }
  17. old = _sigfunc[sig];
  18. if (vec) {
  19. tmp = *vec;
  20. vec = &tmp;
  21. if (vec->handler && vec->handler != (int (*)()) 1) {
  22. _sigfunc[sig] = vec->handler;
  23. vec->handler = _sigtramp;
  24. }
  25. }
  26. if (sigvec_scall(sig,vec,ovec) < 0) {
  27. _sigfunc[sig] = old;
  28. return -1;
  29. }
  30. if (ovec && ovec->handler == _sigtramp) {
  31. ovec->handler = old;
  32. }
  33. return 0;
  34. }