
/* Copyright Massachusetts Institute of Technology 1990,1991 */

#ifndef lint
static char rcsid[] = "$Header: _change_signal.c,v 1.3 91/06/06 13:44:09 dcurtis Exp $";
#endif lint
/* $Log:	_change_signal.c,v $
 * Revision 1.3  91/06/06  13:44:09  dcurtis
 * added copyright notice
 * 
 * Revision 1.2  91/06/03  17:07:47  root
 * sparcstation compatibility: decompose a union variable
 * 
 * Revision 1.1  91/02/04  23:20:17  mtv
 * Initial revision
 * 
 */

/*						*/
/*						*/
/*		IMPLEMENTATION OF		*/
/*			_change_signal		*/
/*						*/

#include <signal.h>
#undef signal

#include "pclu_err.h"
#include "pclu_sys.h"

extern int errno;
extern CLUREF empty_string;

errcode _change_signal(sig, label, ans)
CLUREF sig, label, *ans;
{
int err;
struct sigaction vec, ovec;
sigset_t newmask;

	/* literally 0xff7bf0e0 */
	sigemptyset(&newmask);
        sigaddset(&newmask, SIGABRT);   /* == IOT */
	sigaddset(&newmask, SIGEMT);
	sigaddset(&newmask, SIGFPE);
	sigaddset(&newmask, SIGPIPE);
	sigaddset(&newmask, SIGALRM);
	sigaddset(&newmask, SIGTERM);
	sigaddset(&newmask, SIGURG);
        sigaddset(&newmask, SIGSTOP);
        sigaddset(&newmask, SIGTSTP);
        sigaddset(&newmask, SIGIO);
        sigaddset(&newmask, SIGCHLD);
        sigaddset(&newmask, SIGTTIN);
        sigaddset(&newmask, SIGWINCH);
        sigaddset(&newmask, SIGXFSZ);
        sigaddset(&newmask, SIGVTALRM);
        sigaddset(&newmask, SIGPROF);
        sigaddset(&newmask, SIGUSR1);
        sigaddset(&newmask, SIGUSR2);

	vec.sa_handler = (void (*)())label.ref;
	vec.sa_mask = newmask;
	vec.sa_flags = SA_ONSTACK | SA_SIGINFO;

	err = sigaction(sig.num, &vec, &ovec);
	if (err != 0) {
		elist[0] = _unix_erstr(errno);
		signal(ERR_not_possible);
		}
	ans->num = (int)ovec.sa_handler;
	signal(ERR_ok);
	}

