From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/lib/ap/plan9/signal.c | 136 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 sys/src/ape/lib/ap/plan9/signal.c (limited to 'sys/src/ape/lib/ap/plan9/signal.c') diff --git a/sys/src/ape/lib/ap/plan9/signal.c b/sys/src/ape/lib/ap/plan9/signal.c new file mode 100755 index 000000000..cf8a823ef --- /dev/null +++ b/sys/src/ape/lib/ap/plan9/signal.c @@ -0,0 +1,136 @@ +#include "lib.h" +#include "sys9.h" +#include +#include +#include +#include + +extern sigset_t _psigblocked; + +static struct { + char *msg; /* just check prefix */ + int num; +} sigtab[] = { + {"hangup", SIGHUP}, + {"interrupt", SIGINT}, + {"quit", SIGQUIT}, + {"alarm", SIGALRM}, + {"sys: trap: illegal instruction", SIGILL}, + {"sys: trap: reserved instruction", SIGILL}, + {"sys: trap: reserved", SIGILL}, + {"sys: trap: arithmetic overflow", SIGFPE}, + {"abort", SIGABRT}, + {"sys: fp:", SIGFPE}, + {"exit", SIGKILL}, + {"die", SIGKILL}, + {"kill", SIGKILL}, + {"sys: trap: bus error", SIGSEGV}, + {"sys: trap: address error", SIGSEGV}, + {"sys: trap: TLB", SIGSEGV}, + {"sys: write on closed pipe", SIGPIPE}, + {"alarm", SIGALRM}, + {"term", SIGTERM}, + {"usr1", SIGUSR1}, + {"usr2", SIGUSR2}, +}; +#define NSIGTAB ((sizeof sigtab)/(sizeof (sigtab[0]))) + +void (*_sighdlr[MAXSIG+1])(int, char*, Ureg*); /* 0 initialized: SIG_DFL */ + +void +(*signal(int sig, void (*func)(int, char*, Ureg*)))(int, char*, Ureg*) +{ + void(*oldf)(int, char*, Ureg*); + + if(sig <= 0 || sig > MAXSIG){ + errno = EINVAL; + return SIG_ERR; + } + oldf = _sighdlr[sig]; + if(sig == SIGKILL) + return oldf; /* can't catch or ignore SIGKILL */ + _sighdlr[sig] = func; + return oldf; +} + +/* BAD CODE - see /sys/src/ape/lib/ap/$objtype/setjmp.s for real code +int +sigsetjmp(sigjmp_buf buf, int savemask) +{ + int r; + + buf[0] = savemask; + buf[1] = _psigblocked; + return setjmp(&buf[2]); +} +*/ + +/* + * BUG: improper handling of process signal mask + */ +int +sigaction(int sig, struct sigaction *act, struct sigaction *oact) +{ + if(sig <= 0 || sig > MAXSIG || sig == SIGKILL){ + errno = EINVAL; + return -1; + } + if(oact){ + oact->sa_handler = _sighdlr[sig]; + oact->sa_mask = _psigblocked; + oact->sa_flags = 0; + } + if(act){ + _sighdlr[sig] = act->sa_handler; + } + return 0; +} + +/* this is registered in _envsetup */ +int +_notehandler(Ureg *u, char *msg) +{ + int i; + void(*f)(int, char*, Ureg*); + extern void _doatexits(void); /* in stdio/exit.c */ + + if(_finishing) + _finish(0, 0); + for(i = 0; i