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