]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - sail/dr_main.c
Remove extra semicolon.
[bsdgames-darwin.git] / sail / dr_main.c
index 4e7778c973a44e90950cc38455266224a2be1ac0..167c512aed4d76708a8daaecd9cddede3706bac6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: dr_main.c,v 1.7 2001/01/01 21:57:38 jwise Exp $        */
+/*     $NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $    */
 
 /*
  * Copyright (c) 1983, 1993
  * 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.
  *
 #if 0
 static char sccsid[] = "@(#)dr_main.c  8.2 (Berkeley) 4/16/94";
 #else
-__RCSID("$NetBSD: dr_main.c,v 1.7 2001/01/01 21:57:38 jwise Exp $");
+__RCSID("$NetBSD: dr_main.c,v 1.15 2010/08/06 09:14:40 dholland Exp $");
 #endif
 #endif /* not lint */
 
-#include "driver.h"
+#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,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);
@@ -88,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) {
@@ -114,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]);
+       }
+}