sig.c revision 1.2 1 1.2 kamil /* Header: /usr/src/games/warp/RCS/sig.c,v 1.1 87/07/03 01:47:11 games Exp */
2 1.1 kamil
3 1.2 kamil /* Log: sig.c,v
4 1.1 kamil * Revision 7.0.1.1a 87/07/03 01:47:11 games
5 1.1 kamil * Changed sigsetmask to use sigmask instead of calculating it (incorrectly)
6 1.1 kamil * by hand.
7 1.1 kamil *
8 1.1 kamil * Revision 7.0.1.1 86/12/12 17:02:44 lwall
9 1.1 kamil * Baseline for net release.
10 1.1 kamil *
11 1.1 kamil * Revision 7.0 86/10/08 15:13:24 lwall
12 1.1 kamil * Split into separate files. Added amoebas and pirates.
13 1.1 kamil *
14 1.1 kamil */
15 1.1 kamil
16 1.1 kamil #include "EXTERN.h"
17 1.1 kamil #include "warp.h"
18 1.1 kamil #include "play.h"
19 1.1 kamil #include "score.h"
20 1.1 kamil #include "term.h"
21 1.1 kamil #include "util.h"
22 1.1 kamil #include "INTERN.h"
23 1.1 kamil #include "sig.h"
24 1.1 kamil
25 1.1 kamil void
26 1.1 kamil sig_init()
27 1.1 kamil {
28 1.1 kamil #ifdef lint
29 1.1 kamil ;
30 1.1 kamil #else
31 1.1 kamil sigignore(SIGINT); /* for inquiry of existence via kill call */
32 1.1 kamil #ifdef SIGTTOU
33 1.1 kamil sigignore(SIGTTOU);
34 1.1 kamil #endif
35 1.1 kamil
36 1.1 kamil sigset(SIGHUP, sig_catcher);
37 1.1 kamil if (!debugging) {
38 1.1 kamil sigset(SIGQUIT, sig_catcher);
39 1.1 kamil sigset(SIGILL, sig_catcher);
40 1.1 kamil sigset(SIGFPE, sig_catcher);
41 1.1 kamil sigset(SIGBUS, sig_catcher);
42 1.1 kamil sigset(SIGSEGV, sig_catcher);
43 1.1 kamil sigset(SIGSYS, sig_catcher);
44 1.1 kamil sigset(SIGTERM, sig_catcher);
45 1.1 kamil }
46 1.1 kamil #ifdef SIGXCPU
47 1.1 kamil sigset(SIGXCPU, sig_catcher);
48 1.1 kamil #endif
49 1.1 kamil #ifdef SIGCONT
50 1.1 kamil sigset(SIGCONT, cont_catcher);
51 1.1 kamil #endif
52 1.1 kamil #ifdef SIGTSTP
53 1.1 kamil sigset(SIGTSTP, stop_catcher);
54 1.1 kamil sigset(SIGSTOP, stop_catcher);
55 1.1 kamil #endif
56 1.1 kamil #endif /* lint */
57 1.1 kamil }
58 1.1 kamil
59 1.1 kamil #ifdef SIGTSTP
60 1.1 kamil void
61 1.1 kamil cont_catcher()
62 1.1 kamil {
63 1.1 kamil #ifndef lint
64 1.1 kamil sigset(SIGCONT,cont_catcher);
65 1.1 kamil #endif
66 1.1 kamil savetty();
67 1.1 kamil crmode();
68 1.1 kamil raw();
69 1.1 kamil noecho();
70 1.1 kamil nonl();
71 1.1 kamil }
72 1.1 kamil #endif
73 1.1 kamil
74 1.1 kamil void
75 1.1 kamil mytstp()
76 1.1 kamil {
77 1.1 kamil resetty();
78 1.1 kamil #ifdef SIGTSTP
79 1.1 kamil kill(0,SIGTSTP);
80 1.1 kamil #else
81 1.1 kamil if (fork())
82 1.1 kamil wait(0);
83 1.1 kamil else {
84 1.1 kamil char *shell = getenv("SHELL");
85 1.1 kamil
86 1.1 kamil setuid(getuid());
87 1.1 kamil if (!*shell)
88 1.1 kamil shell = "/bin/sh";
89 1.1 kamil execl(shell,shell,0);
90 1.1 kamil exit(1);
91 1.1 kamil }
92 1.1 kamil #endif
93 1.1 kamil rewrite();
94 1.1 kamil }
95 1.1 kamil
96 1.1 kamil void /* very much void */
97 1.1 kamil finalize(status)
98 1.1 kamil int status;
99 1.1 kamil {
100 1.1 kamil if (bizarre)
101 1.1 kamil resetty();
102 1.1 kamil if (status < 0) {
103 1.1 kamil chdir("/usr/tmp");
104 1.1 kamil sigset(SIGILL,SIG_DFL);
105 1.1 kamil abort();
106 1.1 kamil }
107 1.1 kamil exit(status);
108 1.1 kamil }
109 1.1 kamil
110 1.1 kamil /* come here on signal other than interrupt, stop, or cont */
111 1.1 kamil
112 1.1 kamil void
113 1.1 kamil sig_catcher(signo)
114 1.1 kamil {
115 1.1 kamil #ifdef VERBOSE
116 1.1 kamil static char *signame[] = {
117 1.1 kamil "",
118 1.1 kamil "HUP",
119 1.1 kamil "INT",
120 1.1 kamil "QUIT",
121 1.1 kamil "ILL",
122 1.1 kamil "TRAP",
123 1.1 kamil "IOT",
124 1.1 kamil "EMT",
125 1.1 kamil "FPE",
126 1.1 kamil "KILL",
127 1.1 kamil "BUS",
128 1.1 kamil "SEGV",
129 1.1 kamil "SYS",
130 1.1 kamil "PIPE",
131 1.1 kamil "ALRM",
132 1.1 kamil "TERM",
133 1.1 kamil "???"
134 1.1 kamil #ifdef SIGTSTP
135 1.1 kamil ,"STOP",
136 1.1 kamil "TSTP",
137 1.1 kamil "CONT",
138 1.1 kamil "CHLD",
139 1.1 kamil "TTIN",
140 1.1 kamil "TTOU",
141 1.1 kamil "TINT",
142 1.1 kamil "XCPU",
143 1.1 kamil "XFSZ"
144 1.1 kamil #ifdef SIGPROF
145 1.1 kamil ,"VTALARM",
146 1.1 kamil "PROF"
147 1.1 kamil #endif
148 1.1 kamil #endif
149 1.1 kamil };
150 1.1 kamil #endif
151 1.1 kamil
152 1.1 kamil #ifdef SIGTTOU
153 1.1 kamil #ifndef lint
154 1.1 kamil sigignore(SIGTTOU);
155 1.1 kamil #endif /* lint */
156 1.1 kamil #endif
157 1.1 kamil #ifdef DEBUGGING
158 1.1 kamil if (debug) {
159 1.1 kamil printf("\r\nSIG%s--game not saved in debug\r\n",signame[signo]);
160 1.1 kamil finalize(-1);
161 1.1 kamil }
162 1.1 kamil #endif
163 1.1 kamil panic++;
164 1.1 kamil if (panic >= 2) {
165 1.1 kamil if (panic >= 3)
166 1.1 kamil abort();
167 1.1 kamil chdir(SAVEDIR);
168 1.1 kamil kill(0,SIGIOT);
169 1.1 kamil }
170 1.1 kamil (void) sigset(SIGILL,SIG_DFL);
171 1.1 kamil if (signo == SIGHUP && (timer < 10 || didkill))
172 1.1 kamil signo = SIGQUIT;
173 1.1 kamil if (signo == SIGQUIT) { /* can't let them bomb out without penalty */
174 1.1 kamil if (smarts < 20)
175 1.1 kamil smarts += 4;
176 1.1 kamil else if (smarts < 35)
177 1.1 kamil smarts += 2;
178 1.1 kamil else
179 1.1 kamil smarts++;
180 1.1 kamil totalscore -= possiblescore / 2;
181 1.1 kamil }
182 1.1 kamil save_game();
183 1.1 kamil if (signo != SIGHUP && signo != SIGQUIT)
184 1.1 kamil #ifdef VERBOSE
185 1.1 kamil IF(verbose)
186 1.1 kamil printf("\r\nCaught %s%s--%s\r\n",
187 1.1 kamil signo ? "a SIG" : "an internal error", signame[signo],
188 1.1 kamil experimenting ? "game saved" : "bye bye");
189 1.1 kamil ELSE
190 1.1 kamil #endif
191 1.1 kamil #ifdef TERSE
192 1.1 kamil printf("\r\nSignal %d--bye bye\r\n",signo);
193 1.1 kamil #endif
194 1.1 kamil switch (signo) {
195 1.1 kamil case SIGBUS:
196 1.1 kamil case SIGILL:
197 1.1 kamil case SIGSEGV:
198 1.1 kamil finalize(-signo);
199 1.1 kamil }
200 1.1 kamil finalize(1); /* and blow up */
201 1.1 kamil }
202 1.1 kamil
203 1.1 kamil #ifdef SIGTSTP
204 1.1 kamil /* come here on stop signal */
205 1.1 kamil
206 1.1 kamil void
207 1.1 kamil stop_catcher()
208 1.1 kamil {
209 1.1 kamil if (!waiting) {
210 1.1 kamil resetty(); /* this is the point of all this */
211 1.1 kamil #ifdef DEBUGGING
212 1.1 kamil if (debug)
213 1.1 kamil write(2,"stop_catcher\r\n",13);
214 1.1 kamil #endif
215 1.1 kamil sigset(SIGTSTP,SIG_DFL); /* enable stop */
216 1.1 kamil #ifdef BSD42
217 1.1 kamil sigsetmask(sigblock(0L) & ~sigmask(SIGTSTP));
218 1.1 kamil #endif
219 1.1 kamil kill(0,SIGTSTP); /* and do the stop */
220 1.1 kamil }
221 1.1 kamil #ifndef lint
222 1.1 kamil sigset(SIGTSTP,stop_catcher); /* unenable the stop */
223 1.1 kamil #endif
224 1.1 kamil }
225 1.1 kamil #endif
226