diff options
Diffstat (limited to 'sail/dr_main.c')
-rw-r--r-- | sail/dr_main.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/sail/dr_main.c b/sail/dr_main.c index 71c141dd..167c512a 100644 --- a/sail/dr_main.c +++ b/sail/dr_main.c @@ -1,4 +1,4 @@ -/* $NetBSD: dr_main.c,v 1.14 2009/03/14 19:36:42 dholland Exp $ */ +/* $NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $ */ /* * Copyright (c) 1983, 1993 @@ -34,17 +34,22 @@ #if 0 static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94"; #else -__RCSID("$NetBSD: dr_main.c,v 1.14 2009/03/14 19:36:42 dholland Exp $"); +__RCSID("$NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $"); #endif #endif /* not lint */ #include <err.h> +#include <setjmp.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #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) @@ -54,23 +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) { - errx(1, "driver: Bad game number %d", game); + errx(1, "\ndriver: Bad game number %d", game); } cc = &scene[game]; ls = SHIP(cc->vessels); if (sync_open() < 0) { - err(1, "driver: syncfile"); + err(1, "\ndriver: syncfile"); } for (n = 0; n < NNATION; n++) nat[n] = 0; foreachship(sp) { if (sp->file == NULL && (sp->file = calloc(1, sizeof (struct File))) == NULL) { - fprintf(stderr, "DRIVER: Out of memory.\n"); + fprintf(stderr, "\nDRIVER: Out of memory.\n"); exit(1); } sp->file->index = sp - SHIP(0); @@ -86,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) { @@ -112,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]); + } +} |