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