1 /* $NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1983, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 #ifndef lint 34 #if 0 35 static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94"; 36 #else 37 __RCSID("$NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 #include <err.h> 42 #include <setjmp.h> 43 #include <signal.h> 44 #include <stdio.h> 45 #include <stdlib.h> 46 #include <unistd.h> 47 #include "extern.h" 48 #include "driver.h" 49 #include "player.h" /* XXX for LEAVE_FORK */ 50 #include "restart.h" 51 52 static int driver_wait_fd = -1; 53 54 int 55 dr_main(void) 56 { 57 int n; 58 struct ship *sp; 59 int nat[NNATION]; 60 int value = 0; 61 62 /* 63 * XXX need a way to print diagnostics back to the player 64 * process instead of stomping on the curses screen. 65 */ 66 67 signal(SIGINT, SIG_IGN); 68 signal(SIGQUIT, SIG_IGN); 69 signal(SIGTSTP, SIG_IGN); 70 if (game < 0 || game >= NSCENE) { 71 errx(1, "\ndriver: Bad game number %d", game); 72 } 73 cc = &scene[game]; 74 ls = SHIP(cc->vessels); 75 if (sync_open() < 0) { 76 err(1, "\ndriver: syncfile"); 77 } 78 for (n = 0; n < NNATION; n++) 79 nat[n] = 0; 80 foreachship(sp) { 81 if (sp->file == NULL && 82 (sp->file = calloc(1, sizeof (struct File))) == NULL) { 83 fprintf(stderr, "\nDRIVER: Out of memory.\n"); 84 exit(1); 85 } 86 sp->file->index = sp - SHIP(0); 87 sp->file->loadL = L_ROUND; 88 sp->file->loadR = L_ROUND; 89 sp->file->readyR = R_LOADED|R_INITIAL; 90 sp->file->readyL = R_LOADED|R_INITIAL; 91 sp->file->stern = nat[sp->nationality]++; 92 sp->file->dir = sp->shipdir; 93 sp->file->row = sp->shiprow; 94 sp->file->col = sp->shipcol; 95 } 96 windspeed = cc->windspeed; 97 winddir = cc->winddir; 98 people = 0; 99 100 /* report back to the player process that we've started */ 101 if (driver_wait_fd >= 0) { 102 close(driver_wait_fd); 103 } 104 105 for (;;) { 106 sleep(7); 107 if (Sync() < 0) { 108 value = 1; 109 break; 110 } 111 if (next() < 0) 112 break; 113 unfoul(); 114 checkup(); 115 prizecheck(); 116 moveall(); 117 thinkofgrapples(); 118 boardcomp(); 119 compcombat(); 120 resolve(); 121 reload(); 122 checksails(); 123 if (Sync() < 0) { 124 value = 1; 125 break; 126 } 127 } 128 sync_close(1); 129 return value; 130 } 131 132 void 133 startdriver(void) 134 { 135 int fds[2]; 136 char c; 137 138 if (pipe(fds)) { 139 warn("pipe"); 140 leave(LEAVE_FORK); 141 return; 142 } 143 144 switch (fork()) { 145 case 0: 146 close(fds[0]); 147 driver_wait_fd = fds[1]; 148 longjmp(restart, MODE_DRIVER); 149 /*NOTREACHED*/ 150 case -1: 151 warn("fork"); 152 close(fds[0]); 153 close(fds[1]); 154 leave(LEAVE_FORK); 155 break; 156 default: 157 hasdriver++; 158 close(fds[1]); 159 read(fds[0], &c, 1); 160 close(fds[0]); 161 } 162 } 163