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