Blame


1 fd04aace 2003-11-23 devnull #include <signal.h>
2 fd04aace 2003-11-23 devnull
3 fd04aace 2003-11-23 devnull #include <u.h>
4 fd04aace 2003-11-23 devnull #define NOPLAN9DEFINES
5 fd04aace 2003-11-23 devnull #include <libc.h>
6 fd04aace 2003-11-23 devnull #include "9proc.h"
7 fd04aace 2003-11-23 devnull
8 fd04aace 2003-11-23 devnull extern char *_p9sigstr(int, char*);
9 fd04aace 2003-11-23 devnull
10 49588d5d 2003-12-17 devnull static struct {
11 49588d5d 2003-12-17 devnull int sig;
12 49588d5d 2003-12-17 devnull int restart;
13 49588d5d 2003-12-17 devnull } sigs[] = {
14 49588d5d 2003-12-17 devnull SIGHUP, 0,
15 49588d5d 2003-12-17 devnull SIGINT, 0,
16 49588d5d 2003-12-17 devnull SIGQUIT, 0,
17 49588d5d 2003-12-17 devnull SIGILL, 0,
18 49588d5d 2003-12-17 devnull SIGTRAP, 0,
19 669250d1 2003-12-03 devnull /* SIGABRT, */
20 d2c4ee9e 2003-11-24 devnull #ifdef SIGEMT
21 49588d5d 2003-12-17 devnull SIGEMT, 0,
22 d2c4ee9e 2003-11-24 devnull #endif
23 49588d5d 2003-12-17 devnull SIGFPE, 0,
24 49588d5d 2003-12-17 devnull SIGBUS, 0,
25 32f69c36 2003-12-11 devnull /* SIGSEGV, */
26 49588d5d 2003-12-17 devnull SIGCHLD, 1,
27 49588d5d 2003-12-17 devnull SIGSYS, 0,
28 49588d5d 2003-12-17 devnull SIGPIPE, 0,
29 49588d5d 2003-12-17 devnull SIGALRM, 0,
30 49588d5d 2003-12-17 devnull SIGTERM, 0,
31 49588d5d 2003-12-17 devnull SIGTSTP, 1,
32 49588d5d 2003-12-17 devnull SIGTTIN, 1,
33 49588d5d 2003-12-17 devnull SIGTTOU, 1,
34 49588d5d 2003-12-17 devnull SIGXCPU, 0,
35 49588d5d 2003-12-17 devnull SIGXFSZ, 0,
36 49588d5d 2003-12-17 devnull SIGVTALRM, 0,
37 49588d5d 2003-12-17 devnull SIGUSR1, 0,
38 49588d5d 2003-12-17 devnull SIGUSR2, 0,
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 fd04aace 2003-11-23 devnull up = _p9uproc();
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 669250d1 2003-12-03 devnull struct sigaction sa;
71 fd04aace 2003-11-23 devnull
72 669250d1 2003-12-03 devnull memset(&sa, 0, sizeof sa);
73 fd04aace 2003-11-23 devnull if(f == nil)
74 669250d1 2003-12-03 devnull sa.sa_handler = SIG_DFL;
75 fd04aace 2003-11-23 devnull else{
76 fd04aace 2003-11-23 devnull notifyf = f;
77 669250d1 2003-12-03 devnull sa.sa_handler = notifysigf;
78 fd04aace 2003-11-23 devnull }
79 49588d5d 2003-12-17 devnull for(i=0; i<nelem(sigs); i++){
80 49588d5d 2003-12-17 devnull if(sigs[i].restart)
81 49588d5d 2003-12-17 devnull sa.sa_flags |= SA_RESTART;
82 49588d5d 2003-12-17 devnull else
83 49588d5d 2003-12-17 devnull sa.sa_flags &= ~SA_RESTART;
84 49588d5d 2003-12-17 devnull sigaction(sigs[i].sig, &sa, 0);
85 49588d5d 2003-12-17 devnull }
86 fd04aace 2003-11-23 devnull return 0;
87 fd04aace 2003-11-23 devnull }
88 fd04aace 2003-11-23 devnull
89 fd04aace 2003-11-23 devnull int
90 fd04aace 2003-11-23 devnull noted(int v)
91 fd04aace 2003-11-23 devnull {
92 fd04aace 2003-11-23 devnull Uproc *up;
93 fd04aace 2003-11-23 devnull
94 fd04aace 2003-11-23 devnull up = _p9uproc();
95 fd04aace 2003-11-23 devnull p9longjmp(up->notejb, v==NCONT ? 2 : 1);
96 fd04aace 2003-11-23 devnull abort();
97 fd04aace 2003-11-23 devnull return 0;
98 fd04aace 2003-11-23 devnull }