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