Blob


1 #include <u.h>
2 #include <signal.h>
3 #define NOPLAN9DEFINES
4 #include <libc.h>
5 #include "9proc.h"
7 extern char *_p9sigstr(int, char*);
9 static struct {
10 int sig;
11 int restart;
12 } sigs[] = {
13 SIGHUP, 0,
14 SIGINT, 0,
15 SIGQUIT, 0,
16 SIGILL, 0,
17 SIGTRAP, 0,
18 /* SIGABRT, */
19 #ifdef SIGEMT
20 SIGEMT, 0,
21 #endif
22 SIGFPE, 0,
23 SIGBUS, 0,
24 /* SIGSEGV, */
25 SIGCHLD, 1,
26 SIGSYS, 0,
27 SIGPIPE, 0,
28 SIGALRM, 0,
29 SIGTERM, 0,
30 SIGTSTP, 1,
31 SIGTTIN, 1,
32 SIGTTOU, 1,
33 SIGXCPU, 0,
34 SIGXFSZ, 0,
35 SIGVTALRM, 0,
36 SIGUSR1, 0,
37 SIGUSR2, 0,
38 SIGWINCH, 1,
39 #ifdef SIGINFO
40 SIGINFO, 0,
41 #endif
42 };
44 static void (*notifyf)(void*, char*);
46 static void
47 notifysigf(int sig)
48 {
49 int v;
50 char tmp[64];
51 Uproc *up;
53 up = _p9uproc(1);
54 v = p9setjmp(up->notejb);
55 if(v == 0 && notifyf)
56 (*notifyf)(nil, _p9sigstr(sig, tmp));
57 else if(v == 2){
58 if(0)print("HANDLED %d\n", sig);
59 return;
60 }
61 if(0)print("DEFAULT %d\n", sig);
62 signal(sig, SIG_DFL);
63 kill(getpid(), sig);
64 }
66 int
67 notify(void (*f)(void*, char*))
68 {
69 int i;
70 struct sigaction sa, osa;
72 _p9uproc(0);
73 memset(&sa, 0, sizeof sa);
74 if(f == 0)
75 sa.sa_handler = SIG_DFL;
76 else{
77 notifyf = f;
78 sa.sa_handler = notifysigf;
79 }
80 for(i=0; i<nelem(sigs); i++){
81 /*
82 * If someone has already installed a handler,
83 * It's probably some ld preload nonsense,
84 * like pct (a SIGVTALRM-based profiler).
85 * Leave it alone.
86 */
87 sigaction(sigs[i].sig, nil, &osa);
88 if(osa.sa_handler != SIG_DFL)
89 continue;
90 sigemptyset(&sa.sa_mask);
91 sigaddset(&sa.sa_mask, i);
92 if(sigs[i].restart)
93 sa.sa_flags |= SA_RESTART;
94 else
95 sa.sa_flags &= ~SA_RESTART;
96 sigaction(sigs[i].sig, &sa, nil);
97 }
98 return 0;
99 }
101 int
102 noted(int v)
104 Uproc *up;
106 up = _p9uproc(1);
107 p9longjmp(up->notejb, v==NCONT ? 2 : 1);
108 abort();
109 return 0;