Blame


1 fd04aace 2003-11-23 devnull #include <u.h>
2 8ad51794 2004-03-25 devnull #include <signal.h>
3 fd04aace 2003-11-23 devnull #define NOPLAN9DEFINES
4 fd04aace 2003-11-23 devnull #include <libc.h>
5 fd04aace 2003-11-23 devnull
6 fd04aace 2003-11-23 devnull extern char *_p9sigstr(int, char*);
7 fd04aace 2003-11-23 devnull
8 49588d5d 2003-12-17 devnull static struct {
9 49588d5d 2003-12-17 devnull int sig;
10 49588d5d 2003-12-17 devnull int restart;
11 49588d5d 2003-12-17 devnull } sigs[] = {
12 49588d5d 2003-12-17 devnull SIGHUP, 0,
13 49588d5d 2003-12-17 devnull SIGINT, 0,
14 49588d5d 2003-12-17 devnull SIGQUIT, 0,
15 49588d5d 2003-12-17 devnull SIGILL, 0,
16 49588d5d 2003-12-17 devnull SIGTRAP, 0,
17 669250d1 2003-12-03 devnull /* SIGABRT, */
18 d2c4ee9e 2003-11-24 devnull #ifdef SIGEMT
19 49588d5d 2003-12-17 devnull SIGEMT, 0,
20 d2c4ee9e 2003-11-24 devnull #endif
21 49588d5d 2003-12-17 devnull SIGFPE, 0,
22 49588d5d 2003-12-17 devnull SIGBUS, 0,
23 32f69c36 2003-12-11 devnull /* SIGSEGV, */
24 49588d5d 2003-12-17 devnull SIGCHLD, 1,
25 49588d5d 2003-12-17 devnull SIGSYS, 0,
26 49588d5d 2003-12-17 devnull SIGPIPE, 0,
27 49588d5d 2003-12-17 devnull SIGALRM, 0,
28 49588d5d 2003-12-17 devnull SIGTERM, 0,
29 49588d5d 2003-12-17 devnull SIGTSTP, 1,
30 49588d5d 2003-12-17 devnull SIGTTIN, 1,
31 49588d5d 2003-12-17 devnull SIGTTOU, 1,
32 49588d5d 2003-12-17 devnull SIGXCPU, 0,
33 49588d5d 2003-12-17 devnull SIGXFSZ, 0,
34 49588d5d 2003-12-17 devnull SIGVTALRM, 0,
35 49588d5d 2003-12-17 devnull SIGUSR1, 0,
36 49588d5d 2003-12-17 devnull SIGUSR2, 0,
37 6c746070 2004-05-23 devnull SIGWINCH, 1,
38 d2c4ee9e 2003-11-24 devnull #ifdef SIGINFO
39 49588d5d 2003-12-17 devnull SIGINFO, 0,
40 d2c4ee9e 2003-11-24 devnull #endif
41 fd04aace 2003-11-23 devnull };
42 fd04aace 2003-11-23 devnull
43 05d8c6df 2004-09-23 devnull typedef struct Jmp Jmp;
44 05d8c6df 2004-09-23 devnull struct Jmp
45 05d8c6df 2004-09-23 devnull {
46 05d8c6df 2004-09-23 devnull p9jmp_buf b;
47 05d8c6df 2004-09-23 devnull };
48 05d8c6df 2004-09-23 devnull
49 05d8c6df 2004-09-23 devnull static Jmp onejmp;
50 05d8c6df 2004-09-23 devnull
51 05d8c6df 2004-09-23 devnull static Jmp*
52 05d8c6df 2004-09-23 devnull getonejmp(void)
53 05d8c6df 2004-09-23 devnull {
54 05d8c6df 2004-09-23 devnull return &onejmp;
55 05d8c6df 2004-09-23 devnull }
56 05d8c6df 2004-09-23 devnull
57 05d8c6df 2004-09-23 devnull Jmp *(*_notejmpbuf)(void) = getonejmp;
58 fd04aace 2003-11-23 devnull static void (*notifyf)(void*, char*);
59 fd04aace 2003-11-23 devnull
60 fd04aace 2003-11-23 devnull static void
61 fd04aace 2003-11-23 devnull notifysigf(int sig)
62 fd04aace 2003-11-23 devnull {
63 fd04aace 2003-11-23 devnull int v;
64 fd04aace 2003-11-23 devnull char tmp[64];
65 05d8c6df 2004-09-23 devnull Jmp *j;
66 fd04aace 2003-11-23 devnull
67 05d8c6df 2004-09-23 devnull j = (*_notejmpbuf)();
68 05d8c6df 2004-09-23 devnull v = p9setjmp(j->b);
69 fd04aace 2003-11-23 devnull if(v == 0 && notifyf)
70 fd04aace 2003-11-23 devnull (*notifyf)(nil, _p9sigstr(sig, tmp));
71 fd04aace 2003-11-23 devnull else if(v == 2){
72 05d8c6df 2004-09-23 devnull if(0)print("HANDLED %d\n", sig);
73 fd04aace 2003-11-23 devnull return;
74 fd04aace 2003-11-23 devnull }
75 05d8c6df 2004-09-23 devnull if(0)print("DEFAULT %d\n", sig);
76 fd04aace 2003-11-23 devnull signal(sig, SIG_DFL);
77 05d8c6df 2004-09-23 devnull raise(sig);
78 fd04aace 2003-11-23 devnull }
79 05d8c6df 2004-09-23 devnull
80 fd04aace 2003-11-23 devnull int
81 05d8c6df 2004-09-23 devnull noted(int v)
82 05d8c6df 2004-09-23 devnull {
83 05d8c6df 2004-09-23 devnull p9longjmp((*_notejmpbuf)()->b, v==NCONT ? 2 : 1);
84 05d8c6df 2004-09-23 devnull abort();
85 05d8c6df 2004-09-23 devnull return 0;
86 05d8c6df 2004-09-23 devnull }
87 05d8c6df 2004-09-23 devnull
88 05d8c6df 2004-09-23 devnull int
89 fd04aace 2003-11-23 devnull notify(void (*f)(void*, char*))
90 fd04aace 2003-11-23 devnull {
91 fd04aace 2003-11-23 devnull int i;
92 c4097c29 2004-05-11 devnull struct sigaction sa, osa;
93 fd04aace 2003-11-23 devnull
94 669250d1 2003-12-03 devnull memset(&sa, 0, sizeof sa);
95 d99b2f34 2004-03-26 devnull if(f == 0)
96 669250d1 2003-12-03 devnull sa.sa_handler = SIG_DFL;
97 fd04aace 2003-11-23 devnull else{
98 fd04aace 2003-11-23 devnull notifyf = f;
99 669250d1 2003-12-03 devnull sa.sa_handler = notifysigf;
100 fd04aace 2003-11-23 devnull }
101 49588d5d 2003-12-17 devnull for(i=0; i<nelem(sigs); i++){
102 c4097c29 2004-05-11 devnull /*
103 c4097c29 2004-05-11 devnull * If someone has already installed a handler,
104 c4097c29 2004-05-11 devnull * It's probably some ld preload nonsense,
105 c4097c29 2004-05-11 devnull * like pct (a SIGVTALRM-based profiler).
106 c4097c29 2004-05-11 devnull * Leave it alone.
107 c4097c29 2004-05-11 devnull */
108 c4097c29 2004-05-11 devnull sigaction(sigs[i].sig, nil, &osa);
109 c4097c29 2004-05-11 devnull if(osa.sa_handler != SIG_DFL)
110 c4097c29 2004-05-11 devnull continue;
111 05d8c6df 2004-09-23 devnull /*
112 05d8c6df 2004-09-23 devnull * We assume that one jump buffer per thread
113 05d8c6df 2004-09-23 devnull * is okay, which means that we can't deal with
114 05d8c6df 2004-09-23 devnull * signal handlers called during signal handlers.
115 05d8c6df 2004-09-23 devnull */
116 05d8c6df 2004-09-23 devnull sigfillset(&sa.sa_mask);
117 49588d5d 2003-12-17 devnull if(sigs[i].restart)
118 49588d5d 2003-12-17 devnull sa.sa_flags |= SA_RESTART;
119 49588d5d 2003-12-17 devnull else
120 49588d5d 2003-12-17 devnull sa.sa_flags &= ~SA_RESTART;
121 c4097c29 2004-05-11 devnull sigaction(sigs[i].sig, &sa, nil);
122 49588d5d 2003-12-17 devnull }
123 fd04aace 2003-11-23 devnull return 0;
124 fd04aace 2003-11-23 devnull }