|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)pl_1.c 5.1 (Berkeley) 5/29/85"; ! 9: #endif not lint ! 10: ! 11: #include "player.h" ! 12: #include <sys/types.h> ! 13: #include <sys/wait.h> ! 14: ! 15: /* ! 16: * If we get here before a ship is chosen, then ms == 0 and ! 17: * we don't want to update the score file, or do any Write's either. ! 18: * We can assume the sync file is already created and may need ! 19: * to be removed. ! 20: * Of course, we don't do any more Sync()'s if we got here ! 21: * because of a Sync() failure. ! 22: */ ! 23: leave(conditions) ! 24: int conditions; ! 25: { ! 26: (void) signal(SIGHUP, SIG_IGN); ! 27: (void) signal(SIGINT, SIG_IGN); ! 28: (void) signal(SIGQUIT, SIG_IGN); ! 29: (void) signal(SIGALRM, SIG_IGN); ! 30: (void) signal(SIGCHLD, SIG_IGN); ! 31: ! 32: if (done_curses) { ! 33: Signal("It looks like you've had it!", ! 34: (struct ship *)0); ! 35: switch (conditions) { ! 36: case LEAVE_QUIT: ! 37: break; ! 38: case LEAVE_CAPTURED: ! 39: Signal("Your ship was captured.", ! 40: (struct ship *)0); ! 41: break; ! 42: case LEAVE_HURRICAN: ! 43: Signal("Hurricane! All ships destroyed.", ! 44: (struct ship *)0); ! 45: break; ! 46: case LEAVE_DRIVER: ! 47: Signal("The driver died.", (struct ship *)0); ! 48: break; ! 49: case LEAVE_SYNC: ! 50: Signal("Synchronization error.", (struct ship *)0); ! 51: break; ! 52: default: ! 53: Signal("A funny thing happened (%d).", ! 54: (struct ship *)0, conditions); ! 55: } ! 56: } else { ! 57: switch (conditions) { ! 58: case LEAVE_QUIT: ! 59: break; ! 60: case LEAVE_DRIVER: ! 61: printf("The driver died.\n"); ! 62: break; ! 63: case LEAVE_FORK: ! 64: perror("fork"); ! 65: break; ! 66: case LEAVE_SYNC: ! 67: printf("Synchronization error\n."); ! 68: break; ! 69: default: ! 70: printf("A funny thing happened (%d).\n", ! 71: conditions); ! 72: } ! 73: } ! 74: ! 75: if (ms != 0) { ! 76: log(ms); ! 77: if (conditions != LEAVE_SYNC) { ! 78: makesignal(ms, "Captain %s relinquishing.", ! 79: (struct ship *)0, mf->captain); ! 80: Write(W_END, ms, 0, 0, 0, 0, 0); ! 81: (void) Sync(); ! 82: } ! 83: } ! 84: sync_close(!hasdriver); ! 85: cleanupscreen(); ! 86: exit(0); ! 87: } ! 88: ! 89: choke() ! 90: { ! 91: leave(LEAVE_QUIT); ! 92: } ! 93: ! 94: child() ! 95: { ! 96: union wait status; ! 97: int pid; ! 98: ! 99: (void) signal(SIGCHLD, SIG_IGN); ! 100: do { ! 101: pid = wait3(&status, WNOHANG, (struct rusage *)0); ! 102: if (pid < 0 || pid > 0 && !WIFSTOPPED(status)) ! 103: hasdriver = 0; ! 104: } while (pid > 0); ! 105: (void) signal(SIGCHLD, child); ! 106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.