crap.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "../plan9/lib.h"
  2. #include "../plan9/sys9.h"
  3. #include <signal.h>
  4. #include <setjmp.h>
  5. /* A stack to hold pcs when signals nest */
  6. #define MAXSIGSTACK 20
  7. typedef struct Pcstack Pcstack;
  8. static struct Pcstack {
  9. int sig;
  10. void (*hdlr)(int, char*, Ureg*);
  11. unsigned long restorepc;
  12. Ureg *u;
  13. } pcstack[MAXSIGSTACK];
  14. static int nstack = 0;
  15. static void notecont(Ureg*, char*);
  16. void
  17. _notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u)
  18. {
  19. Pcstack *p;
  20. if(nstack >= MAXSIGSTACK)
  21. _NOTED(1); /* nesting too deep; just do system default */
  22. p = &pcstack[nstack];
  23. p->restorepc = u->pc;
  24. p->sig = sig;
  25. p->hdlr = hdlr;
  26. p->u = u;
  27. nstack++;
  28. u->pc = (unsigned long) notecont;
  29. _NOTED(2); /* NSAVE: clear note but hold state */
  30. }
  31. static void
  32. notecont(Ureg *u, char *s)
  33. {
  34. Pcstack *p;
  35. void(*f)(int, char*, Ureg*);
  36. p = &pcstack[nstack-1];
  37. f = p->hdlr;
  38. u->pc = p->restorepc;
  39. nstack--;
  40. (*f)(p->sig, s, u);
  41. _NOTED(3); /* NRSTR */
  42. }
  43. #define JMPBUFPC 1
  44. #define JMPBUFSP 0
  45. extern sigset_t _psigblocked;
  46. void
  47. siglongjmp(sigjmp_buf j, int ret)
  48. {
  49. struct Ureg *u;
  50. write(1,"_", 1);
  51. if(j[0])
  52. _psigblocked = j[1];
  53. if(nstack == 0 || pcstack[nstack-1].u->sp > j[2+JMPBUFSP])
  54. longjmp(j+2, ret);
  55. write(1,"!", 1);
  56. u = pcstack[nstack-1].u;
  57. nstack--;
  58. u->ax = ret;
  59. if(ret == 0)
  60. u->ax = 1;
  61. u->pc = j[2+JMPBUFPC];
  62. u->sp = j[2+JMPBUFSP] + 4;
  63. write(1,"?", 1);
  64. _NOTED(3); /* NRSTR */
  65. }