X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/3c786d433a6b285c1afa50b8c0ca339c4e861c69..86fc742d6e099e71b543e9da978c27fcf5cb6504:/sail/dr_main.c diff --git a/sail/dr_main.c b/sail/dr_main.c index c3f145d7..167c512a 100644 --- a/sail/dr_main.c +++ b/sail/dr_main.c @@ -1,4 +1,4 @@ -/* $NetBSD: dr_main.c,v 1.11 2001/02/05 01:10:09 christos 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. * @@ -38,16 +34,22 @@ #if 0 static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94"; #else -__RCSID("$NetBSD: dr_main.c,v 1.11 2001/02/05 01:10:09 christos 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" + +static int driver_wait_fd = -1; int dr_main(void) @@ -57,25 +59,28 @@ dr_main(void) int nat[NNATION]; int value = 0; + /* + * 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) { - 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); @@ -91,6 +96,12 @@ dr_main(void) 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) { @@ -117,3 +128,35 @@ dr_main(void) 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]); + } +}