1*30491Slepreau # include	"signal.h"
2*30491Slepreau #undef NSIG
3*30491Slepreau # ifdef PWB
4*30491Slepreau #define NSIG 16
5*30491Slepreau # else
6*30491Slepreau #define NSIG 4
7*30491Slepreau # endif
8*30491Slepreau # include	"../hdr/macros.h"
9*30491Slepreau SCCSID(@(#)setsig	2.1);
10*30491Slepreau 
11*30491Slepreau /*
12*30491Slepreau 	General-purpose signal setting routine.
13*30491Slepreau 	All non-ignored, non-caught signals are caught.
14*30491Slepreau 	If a signal other than hangup, interrupt, or quit is caught,
15*30491Slepreau 	a "user-oriented" message is printed on file descriptor 2 with
16*30491Slepreau 	a number for help(I).
17*30491Slepreau 	If hangup, interrupt or quit is caught, that signal
18*30491Slepreau 	is set to ignore.
19*30491Slepreau 	Termination is like that of "fatal",
20*30491Slepreau 	via "clean_up(sig)" (sig is the signal number)
21*30491Slepreau 	and "exit(userexit(1))".
22*30491Slepreau 
23*30491Slepreau 	If the file "dump.core" exists in the current directory
24*30491Slepreau 	the function commits
25*30491Slepreau 	suicide to produce a core dump
26*30491Slepreau 	(after calling clean_up, but before calling userexit).
27*30491Slepreau */
28*30491Slepreau 
29*30491Slepreau 
30*30491Slepreau char	*Mesg[NSIG] {
31*30491Slepreau 	0,
32*30491Slepreau 	0,	/* Hangup */
33*30491Slepreau 	0,	/* Interrupt */
34*30491Slepreau 	0,	/* Quit */
35*30491Slepreau # ifdef PWB
36*30491Slepreau 	"Illegal instruction",
37*30491Slepreau 	"Trace/BPT trap",
38*30491Slepreau 	"IOT trap",
39*30491Slepreau 	"EMT trap",
40*30491Slepreau 	"Floating exception",
41*30491Slepreau 	"Killed",
42*30491Slepreau 	"Bus error",
43*30491Slepreau 	"Memory fault",
44*30491Slepreau 	"Bad system call",
45*30491Slepreau 	"Broken pipe",
46*30491Slepreau 	"Alarm clock",
47*30491Slepreau 	"Terminated"
48*30491Slepreau # endif PWB
49*30491Slepreau };
50*30491Slepreau 
51*30491Slepreau 
52*30491Slepreau setsig()
53*30491Slepreau {
54*30491Slepreau 	extern int setsig1();
55*30491Slepreau 	register int j, n;
56*30491Slepreau 
57*30491Slepreau 	for (j=1; j<NSIG; j++)
58*30491Slepreau 		if (n=signal(j,setsig1))
59*30491Slepreau 			signal(j,n);
60*30491Slepreau }
61*30491Slepreau 
62*30491Slepreau 
63*30491Slepreau static char preface[]	"SIGNAL: ";
64*30491Slepreau static char endmsg[]	" (ut12)\n";
65*30491Slepreau 
66*30491Slepreau setsig1(sig)
67*30491Slepreau int sig;
68*30491Slepreau {
69*30491Slepreau # ifndef PWB
70*30491Slepreau 	sig = 2;
71*30491Slepreau # endif PWB
72*30491Slepreau 	if (Mesg[sig]) {
73*30491Slepreau 		syswrite(2,preface,length(preface));
74*30491Slepreau 		syswrite(2,Mesg[sig],length(Mesg[sig]));
75*30491Slepreau 		syswrite(2,endmsg,length(endmsg));
76*30491Slepreau 	}
77*30491Slepreau 	else
78*30491Slepreau 		signal(sig,1);
79*30491Slepreau 	clean_up(sig);
80*30491Slepreau 	if(open("dump.core",0) > 0) {
81*30491Slepreau 		signal(SIGIOT,0);
82*30491Slepreau 		abort();
83*30491Slepreau 	}
84*30491Slepreau 	exit(userexit(1));
85*30491Slepreau }
86