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