X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/77e3814f0c0e3dea4d0032e25666f77e6f83bfff..32a54d49158271df4ffa0cf4422f612647973022:/sail/dr_main.c diff --git a/sail/dr_main.c b/sail/dr_main.c index c6e49681..167c512a 100644 --- a/sail/dr_main.c +++ b/sail/dr_main.c @@ -1,6 +1,8 @@ +/* $NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $ */ + /* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,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. * @@ -31,40 +29,58 @@ * SUCH DAMAGE. */ +#include #ifndef lint -static char sccsid[] = "@(#)dr_main.c 5.5 (Berkeley) 6/1/90"; +#if 0 +static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94"; +#else +__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; -dr_main() +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) setruid(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); @@ -80,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) { @@ -106,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]); + } +}