xref: /original-bsd/games/sail/pl_1.c (revision e188a54c)
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) 06/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 }
118