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