From fd04aacee17b348da206c13a550dc1029669805f Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 23 Nov 2003 18:12:54 +0000 Subject: Various additions and fixes. --- src/lib9/notify.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/lib9/notify.c (limited to 'src/lib9/notify.c') diff --git a/src/lib9/notify.c b/src/lib9/notify.c new file mode 100644 index 00000000..095a3f54 --- /dev/null +++ b/src/lib9/notify.c @@ -0,0 +1,83 @@ +#include + +#include +#define NOPLAN9DEFINES +#include +#include "9proc.h" + +extern char *_p9sigstr(int, char*); + +static int sigs[] = { + SIGHUP, + SIGINT, + SIGQUIT, + SIGILL, + SIGTRAP, + SIGABRT, + SIGEMT, + SIGFPE, + SIGBUS, + SIGSEGV, + SIGSYS, + SIGPIPE, + SIGALRM, + SIGTERM, + SIGTSTP, + SIGTTIN, + SIGTTOU, + SIGXCPU, + SIGXFSZ, + SIGVTALRM, + SIGUSR1, + SIGUSR2, +}; + +static void (*notifyf)(void*, char*); + +static void +notifysigf(int sig) +{ + int v; + char tmp[64]; + Uproc *up; + + up = _p9uproc(); + v = p9setjmp(up->notejb); + if(v == 0 && notifyf) + (*notifyf)(nil, _p9sigstr(sig, tmp)); + else if(v == 2){ +if(0)print("HANDLED %d\n", sig); + return; + } +if(0)print("DEFAULT %d\n", sig); + signal(sig, SIG_DFL); + kill(getpid(), sig); +} + +int +notify(void (*f)(void*, char*)) +{ + int i; + void (*sf)(int); + + if(f == nil) + sf = SIG_DFL; + else{ + notifyf = f; + sf = notifysigf; + } + for(i=0; inotejb, v==NCONT ? 2 : 1); + abort(); + return 0; +} -- cgit v1.2.3