X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/e05192c777ae9a285d9681d4284a44502080945d..32a54d49158271df4ffa0cf4422f612647973022:/sail/dr_main.c diff --git a/sail/dr_main.c b/sail/dr_main.c index 265bdb32..167c512a 100644 --- a/sail/dr_main.c +++ b/sail/dr_main.c @@ -1,4 +1,4 @@ -/* $NetBSD: dr_main.c,v 1.4 1995/04/22 10:36:52 cgd Exp $ */ +/* $NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $ */ /* * Copyright (c) 1983, 1993 @@ -12,11 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -33,44 +29,58 @@ * SUCH DAMAGE. */ +#include #ifndef lint #if 0 static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94"; #else -static char rcsid[] = "$NetBSD: dr_main.c,v 1.4 1995/04/22 10:36:52 cgd Exp $"; +__RCSID("$NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $"); #endif #endif /* not lint */ +#include +#include +#include +#include +#include +#include +#include "extern.h" #include "driver.h" +#include "player.h" /* XXX for LEAVE_FORK */ +#include "restart.h" -dr_main() +static int driver_wait_fd = -1; + +int +dr_main(void) { - register int n; - register struct ship *sp; + int n; + struct ship *sp; int nat[NNATION]; int value = 0; - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGQUIT, SIG_IGN); - (void) signal(SIGTSTP, SIG_IGN); - if (issetuid) - (void) setuid(geteuid()); + /* + * XXX need a way to print diagnostics back to the player + * process instead of stomping on the curses screen. + */ + + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + signal(SIGTSTP, SIG_IGN); if (game < 0 || game >= NSCENE) { - fprintf(stderr, "DRIVER: Bad game number %d\n", game); - exit(1); + errx(1, "\ndriver: Bad game number %d", game); } cc = &scene[game]; ls = SHIP(cc->vessels); if (sync_open() < 0) { - perror("driver: syncfile"); - exit(1); + err(1, "\ndriver: syncfile"); } for (n = 0; n < NNATION; n++) nat[n] = 0; foreachship(sp) { if (sp->file == NULL && - (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) { - (void) fprintf(stderr, "DRIVER: Out of memory.\n"); + (sp->file = calloc(1, sizeof (struct File))) == NULL) { + fprintf(stderr, "\nDRIVER: Out of memory.\n"); exit(1); } sp->file->index = sp - SHIP(0); @@ -86,6 +96,12 @@ dr_main() windspeed = cc->windspeed; winddir = cc->winddir; people = 0; + + /* report back to the player process that we've started */ + if (driver_wait_fd >= 0) { + close(driver_wait_fd); + } + for (;;) { sleep(7); if (Sync() < 0) { @@ -112,3 +128,35 @@ dr_main() sync_close(1); return value; } + +void +startdriver(void) +{ + int fds[2]; + char c; + + if (pipe(fds)) { + warn("pipe"); + leave(LEAVE_FORK); + return; + } + + switch (fork()) { + case 0: + close(fds[0]); + driver_wait_fd = fds[1]; + longjmp(restart, MODE_DRIVER); + /*NOTREACHED*/ + case -1: + warn("fork"); + close(fds[0]); + close(fds[1]); + leave(LEAVE_FORK); + break; + default: + hasdriver++; + close(fds[1]); + read(fds[0], &c, 1); + close(fds[0]); + } +}