1*30493Slepreau static char Sccsid[] = "@(#)setsig.c	1.2	02/15/87";
2*30493Slepreau 
330491Slepreau # include	"signal.h"
430491Slepreau #undef NSIG
530491Slepreau # ifdef PWB
630491Slepreau #define NSIG 16
730491Slepreau # else
830491Slepreau #define NSIG 4
930491Slepreau # endif
1030491Slepreau # include	"../hdr/macros.h"
1130491Slepreau 
1230491Slepreau /*
1330491Slepreau 	General-purpose signal setting routine.
1430491Slepreau 	All non-ignored, non-caught signals are caught.
1530491Slepreau 	If a signal other than hangup, interrupt, or quit is caught,
1630491Slepreau 	a "user-oriented" message is printed on file descriptor 2 with
1730491Slepreau 	a number for help(I).
1830491Slepreau 	If hangup, interrupt or quit is caught, that signal
1930491Slepreau 	is set to ignore.
2030491Slepreau 	Termination is like that of "fatal",
2130491Slepreau 	via "clean_up(sig)" (sig is the signal number)
2230491Slepreau 	and "exit(userexit(1))".
2330491Slepreau 
2430491Slepreau 	If the file "dump.core" exists in the current directory
2530491Slepreau 	the function commits
2630491Slepreau 	suicide to produce a core dump
2730491Slepreau 	(after calling clean_up, but before calling userexit).
2830491Slepreau */
2930491Slepreau 
3030491Slepreau 
31*30493Slepreau char	*Mesg[NSIG] = {
3230491Slepreau 	0,
3330491Slepreau 	0,	/* Hangup */
3430491Slepreau 	0,	/* Interrupt */
3530491Slepreau 	0,	/* Quit */
3630491Slepreau # ifdef PWB
3730491Slepreau 	"Illegal instruction",
3830491Slepreau 	"Trace/BPT trap",
3930491Slepreau 	"IOT trap",
4030491Slepreau 	"EMT trap",
4130491Slepreau 	"Floating exception",
4230491Slepreau 	"Killed",
4330491Slepreau 	"Bus error",
4430491Slepreau 	"Memory fault",
4530491Slepreau 	"Bad system call",
4630491Slepreau 	"Broken pipe",
4730491Slepreau 	"Alarm clock",
4830491Slepreau 	"Terminated"
4930491Slepreau # endif PWB
5030491Slepreau };
5130491Slepreau 
5230491Slepreau 
5330491Slepreau setsig()
5430491Slepreau {
5530491Slepreau 	extern int setsig1();
5630491Slepreau 	register int j, n;
5730491Slepreau 
5830491Slepreau 	for (j=1; j<NSIG; j++)
5930491Slepreau 		if (n=signal(j,setsig1))
6030491Slepreau 			signal(j,n);
6130491Slepreau }
6230491Slepreau 
6330491Slepreau 
64*30493Slepreau static char preface[] = "SIGNAL: ";
65*30493Slepreau static char endmsg[] = " (ut12)\n";
6630491Slepreau 
6730491Slepreau setsig1(sig)
6830491Slepreau int sig;
6930491Slepreau {
7030491Slepreau # ifndef PWB
7130491Slepreau 	sig = 2;
7230491Slepreau # endif PWB
7330491Slepreau 	if (Mesg[sig]) {
7430491Slepreau 		syswrite(2,preface,length(preface));
7530491Slepreau 		syswrite(2,Mesg[sig],length(Mesg[sig]));
7630491Slepreau 		syswrite(2,endmsg,length(endmsg));
7730491Slepreau 	}
7830491Slepreau 	else
7930491Slepreau 		signal(sig,1);
8030491Slepreau 	clean_up(sig);
8130491Slepreau 	if(open("dump.core",0) > 0) {
8230491Slepreau 		signal(SIGIOT,0);
8330491Slepreau 		abort();
8430491Slepreau 	}
8530491Slepreau 	exit(userexit(1));
8630491Slepreau }
87