Blob
1 #include <u.h>2 #include <signal.h>3 #define NOPLAN9DEFINES4 #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 SIGEMT20 SIGEMT, 0,21 #endif22 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 SIGINFO40 SIGINFO, 0,41 #endif42 };44 static void (*notifyf)(void*, char*);46 static void47 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 int67 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 else95 sa.sa_flags &= ~SA_RESTART;96 sigaction(sigs[i].sig, &sa, nil);97 }98 return 0;99 }101 int102 noted(int v)103 {104 Uproc *up;106 up = _p9uproc(1);107 p9longjmp(up->notejb, v==NCONT ? 2 : 1);108 abort();109 return 0;110 }