sig.c revision 1.4 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.4 christos sig_init(void)
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.3 kamil cont_catcher(int x)
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.4 christos mytstp(void)
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.4 christos finalize(int status)
98 1.1 kamil {
99 1.1 kamil if (bizarre)
100 1.1 kamil resetty();
101 1.1 kamil if (status < 0) {
102 1.1 kamil chdir("/usr/tmp");
103 1.1 kamil sigset(SIGILL,SIG_DFL);
104 1.1 kamil abort();
105 1.1 kamil }
106 1.1 kamil exit(status);
107 1.1 kamil }
108 1.1 kamil
109 1.1 kamil /* come here on signal other than interrupt, stop, or cont */
110 1.1 kamil
111 1.1 kamil void
112 1.3 kamil sig_catcher(int signo)
113 1.1 kamil {
114 1.1 kamil #ifdef VERBOSE
115 1.4 christos static const char *signame[] = {
116 1.1 kamil "",
117 1.1 kamil "HUP",
118 1.1 kamil "INT",
119 1.1 kamil "QUIT",
120 1.1 kamil "ILL",
121 1.1 kamil "TRAP",
122 1.1 kamil "IOT",
123 1.1 kamil "EMT",
124 1.1 kamil "FPE",
125 1.1 kamil "KILL",
126 1.1 kamil "BUS",
127 1.1 kamil "SEGV",
128 1.1 kamil "SYS",
129 1.1 kamil "PIPE",
130 1.1 kamil "ALRM",
131 1.1 kamil "TERM",
132 1.1 kamil "???"
133 1.1 kamil #ifdef SIGTSTP
134 1.1 kamil ,"STOP",
135 1.1 kamil "TSTP",
136 1.1 kamil "CONT",
137 1.1 kamil "CHLD",
138 1.1 kamil "TTIN",
139 1.1 kamil "TTOU",
140 1.1 kamil "TINT",
141 1.1 kamil "XCPU",
142 1.1 kamil "XFSZ"
143 1.1 kamil #ifdef SIGPROF
144 1.1 kamil ,"VTALARM",
145 1.1 kamil "PROF"
146 1.1 kamil #endif
147 1.1 kamil #endif
148 1.1 kamil };
149 1.1 kamil #endif
150 1.1 kamil
151 1.1 kamil #ifdef SIGTTOU
152 1.1 kamil #ifndef lint
153 1.1 kamil sigignore(SIGTTOU);
154 1.1 kamil #endif /* lint */
155 1.1 kamil #endif
156 1.1 kamil #ifdef DEBUGGING
157 1.1 kamil if (debug) {
158 1.1 kamil printf("\r\nSIG%s--game not saved in debug\r\n",signame[signo]);
159 1.1 kamil finalize(-1);
160 1.1 kamil }
161 1.1 kamil #endif
162 1.1 kamil panic++;
163 1.1 kamil if (panic >= 2) {
164 1.1 kamil if (panic >= 3)
165 1.1 kamil abort();
166 1.1 kamil chdir(SAVEDIR);
167 1.1 kamil kill(0,SIGIOT);
168 1.1 kamil }
169 1.1 kamil (void) sigset(SIGILL,SIG_DFL);
170 1.1 kamil if (signo == SIGHUP && (timer < 10 || didkill))
171 1.1 kamil signo = SIGQUIT;
172 1.1 kamil if (signo == SIGQUIT) { /* can't let them bomb out without penalty */
173 1.1 kamil if (smarts < 20)
174 1.1 kamil smarts += 4;
175 1.1 kamil else if (smarts < 35)
176 1.1 kamil smarts += 2;
177 1.1 kamil else
178 1.1 kamil smarts++;
179 1.1 kamil totalscore -= possiblescore / 2;
180 1.1 kamil }
181 1.1 kamil save_game();
182 1.4 christos if (signo != SIGHUP && signo != SIGQUIT) {
183 1.1 kamil #ifdef VERBOSE
184 1.1 kamil IF(verbose)
185 1.1 kamil printf("\r\nCaught %s%s--%s\r\n",
186 1.1 kamil signo ? "a SIG" : "an internal error", signame[signo],
187 1.1 kamil experimenting ? "game saved" : "bye bye");
188 1.1 kamil ELSE
189 1.1 kamil #endif
190 1.1 kamil #ifdef TERSE
191 1.4 christos printf("\r\nsignal %d--bye bye\r\n",signo);
192 1.1 kamil #endif
193 1.4 christos }
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.3 kamil stop_catcher(int sig)
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