|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)pl_1.c 5.3 (Berkeley) 6/18/88";
20: #endif /* not lint */
21:
22: #include "player.h"
23: #include <sys/types.h>
24: #include <sys/wait.h>
25:
26: /*
27: * If we get here before a ship is chosen, then ms == 0 and
28: * we don't want to update the score file, or do any Write's either.
29: * We can assume the sync file is already created and may need
30: * to be removed.
31: * Of course, we don't do any more Sync()'s if we got here
32: * because of a Sync() failure.
33: */
34: leave(conditions)
35: int conditions;
36: {
37: (void) signal(SIGHUP, SIG_IGN);
38: (void) signal(SIGINT, SIG_IGN);
39: (void) signal(SIGQUIT, SIG_IGN);
40: (void) signal(SIGALRM, SIG_IGN);
41: (void) signal(SIGCHLD, SIG_IGN);
42:
43: if (done_curses) {
44: Signal("It looks like you've had it!",
45: (struct ship *)0);
46: switch (conditions) {
47: case LEAVE_QUIT:
48: break;
49: case LEAVE_CAPTURED:
50: Signal("Your ship was captured.",
51: (struct ship *)0);
52: break;
53: case LEAVE_HURRICAN:
54: Signal("Hurricane! All ships destroyed.",
55: (struct ship *)0);
56: break;
57: case LEAVE_DRIVER:
58: Signal("The driver died.", (struct ship *)0);
59: break;
60: case LEAVE_SYNC:
61: Signal("Synchronization error.", (struct ship *)0);
62: break;
63: default:
64: Signal("A funny thing happened (%d).",
65: (struct ship *)0, conditions);
66: }
67: } else {
68: switch (conditions) {
69: case LEAVE_QUIT:
70: break;
71: case LEAVE_DRIVER:
72: printf("The driver died.\n");
73: break;
74: case LEAVE_FORK:
75: perror("fork");
76: break;
77: case LEAVE_SYNC:
78: printf("Synchronization error\n.");
79: break;
80: default:
81: printf("A funny thing happened (%d).\n",
82: conditions);
83: }
84: }
85:
86: if (ms != 0) {
87: log(ms);
88: if (conditions != LEAVE_SYNC) {
89: makesignal(ms, "Captain %s relinquishing.",
90: (struct ship *)0, mf->captain);
91: Write(W_END, ms, 0, 0, 0, 0, 0);
92: (void) Sync();
93: }
94: }
95: sync_close(!hasdriver);
96: cleanupscreen();
97: exit(0);
98: }
99:
100: choke()
101: {
102: leave(LEAVE_QUIT);
103: }
104:
105: child()
106: {
107: union wait status;
108: int pid;
109:
110: (void) signal(SIGCHLD, SIG_IGN);
111: do {
112: pid = wait3(&status, WNOHANG, (struct rusage *)0);
113: if (pid < 0 || pid > 0 && !WIFSTOPPED(status))
114: hasdriver = 0;
115: } while (pid > 0);
116: (void) signal(SIGCHLD, child);
117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.