#include <ncbi.h>
#include <gishlib.h>

void LIBCALL
(*sys_signal(int signo, void (*disp)(int)))(int)
{
#ifndef SA_SIGINFO
	return signal(signo, disp);
#else
	struct sigaction	act, oact;

	memset(&act, 0, sizeof(act));
	act.sa_handler = disp;
	sigemptyset(&act.sa_mask);
	if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
		act.sa_flags |= SA_INTERRUPT; /* SunOS */
#endif
	}
	else {
#ifdef SA_RESTART
		act.sa_flags |= SA_RESTART; /* SysV */
#endif
	}
	if (sigaction(signo, &act, &oact) < 0)
		return SIG_ERR;
	return oact.sa_handler;
#endif
}

void LIBCALL
sys_sigpurge(int signo)
{
	void	(*handler)();
	sigset_t	mask, omask;

	handler = sys_signal(signo, SIG_IGN);
	if (handler == SIG_ERR)
		return;

	sys_sigsetmask(0, NULL, &omask);
	mask = omask;
	sigdelset(&mask, signo);
	sys_sigsetmask(SIG_SETMASK, &mask, NULL); /* interrupted before it returns */
	sys_sigsetmask(SIG_SETMASK, &omask, NULL);

	sys_signal(signo, handler);
}

int LIBCALL
sys_sigsetmask(int how, sigset_t *mask, sigset_t *omask)
{
#ifdef SOLARIS_THREADS_AVAIL
	return thr_sigsetmask(how, mask, omask);
#else
	return sigprocmask(how, mask, omask);
#endif
}

