#include "syscall.h"
#include <errno.h>
struct sigvec { int (*handler)(); int mask,flags; };
int (*(_sigfunc[32]))();
extern int _sigtramp();
extern int errno;

_sigvec(sig,vec,ovec)
	register struct sigvec *vec;
	struct sigvec *ovec;
{
	struct sigvec tmp;
	int (*old)();

	if ((unsigned) sig >= 32) {
		errno = EINVAL;
		return -1;
	}
	old = _sigfunc[sig];
	if (vec) {
		tmp = *vec;
		vec = &tmp;
		if (vec->handler && vec->handler != (int (*)()) 1) {
			_sigfunc[sig] = vec->handler;
			vec->handler = _sigtramp;
		}
	}
	if (_syscall(SYS_sigvec,sig,vec,ovec) < 0) {
		_sigfunc[sig] = old;
		return -1;
	}
	if (ovec && ovec->handler == _sigtramp) {
		ovec->handler = old;
	}
	return 0;
}
