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