signal.c 568 B

12345678910111213141516171819202122232425
  1. static long masks[32];
  2. static long flags[32];
  3. void (*
  4. signal(sig,handler))()
  5. void (*handler)();
  6. {
  7. struct {
  8. void (*sv_handler)();
  9. long sv_mask;
  10. long sv_flags;
  11. } v, ov;
  12. v.sv_handler = handler;
  13. v.sv_mask = masks[sig];
  14. v.sv_flags = flags[sig];
  15. if (_sigvec(sig,&v, &ov) < 0) return (void (*)()) -1;
  16. if (v.sv_mask != ov.sv_mask || v.sv_flags != ov.sv_flags) {
  17. v.sv_mask = ov.sv_mask;
  18. masks[sig] = ov.sv_mask;
  19. v.sv_flags = ov.sv_flags;
  20. flags[sig] = ov.sv_flags;
  21. if (_sigvec(sig,&v,(char *) 0) < 0) return (void (*)()) -1;
  22. }
  23. return ov.sv_handler;
  24. }