shithub: npe

ref: 989775c21c262c29a9a717f628f2cf8ea701806a
dir: /libnpe/sigaction.c/

View raw version
#include <signal.h>
#include <thread.h>

/* FIXME this only supports a single handler */

static sa_handler last;

static int
handler(void*, char *s)
{
	/* kill is kill */
	if(strcmp(s, "kill") != 0 && strcmp(s, "threadint") != 0){
		fprint(2, "%s: %s\n", threadgetname(), s);
		last(SIGSEGV);
	}
	return 0;
}

void
sigaction(int, struct sigaction *act, struct sigaction *)
{
	if(act != nil && last == nil){
		last = act->sa_handler;
		atnotify(handler, 1);
	}else if(act == nil){
		atnotify(handler, 0);
	}
}