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