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