|
|
1.1 ! root 1: #include <signal.h> ! 2: #include "header.h" /* "Larn is copyrighted 1986 by Noah Morgan.\n" */ ! 3: #define BIT(a) (1<<((a)-1)) ! 4: extern char savefilename[],wizard,predostuff,nosignal; ! 5: static s2choose() /* text to be displayed if ^C during intro screen */ ! 6: { ! 7: cursor(1,24); lprcat("Press "); setbold(); lprcat("return"); resetbold(); ! 8: lprcat(" to continue: "); lflush(); ! 9: } ! 10: ! 11: static cntlc() /* what to do for a ^C */ ! 12: { ! 13: if (nosignal) return; /* don't do anything if inhibited */ ! 14: signal(SIGQUIT,SIG_IGN); signal(SIGINT,SIG_IGN); ! 15: quit(); if (predostuff==1) s2choose(); else showplayer(); ! 16: lflush(); ! 17: signal(SIGQUIT,cntlc); signal(SIGINT,cntlc); ! 18: } ! 19: ! 20: /* ! 21: * subroutine to save the game if a hangup signal ! 22: */ ! 23: static sgam() ! 24: { ! 25: savegame(savefilename); wizard=1; died(-257); /* hangup signal */ ! 26: } ! 27: ! 28: #ifdef SIGTSTP ! 29: static tstop() /* control Y */ ! 30: { ! 31: if (nosignal) return; /* nothing if inhibited */ ! 32: lcreat((char*)0); clearvt100(); lflush(); signal(SIGTSTP,SIG_DFL); ! 33: #ifdef SIGVTALRM ! 34: /* looks like BSD4.2 or higher - must clr mask for signal to take effect*/ ! 35: sigsetmask(sigblock(0)& ~BIT(SIGTSTP)); ! 36: #endif ! 37: kill(getpid(),SIGTSTP); ! 38: ! 39: setupvt100(); signal(SIGTSTP,tstop); ! 40: if (predostuff==1) s2choose(); else drawscreen(); ! 41: showplayer(); lflush(); ! 42: } ! 43: #endif SIGTSTP ! 44: ! 45: /* ! 46: * subroutine to issue the needed signal traps called from main() ! 47: */ ! 48: static sigill() { sigpanic(SIGILL); } static sigtrap() { sigpanic(SIGTRAP); } ! 49: static sigiot() { sigpanic(SIGIOT); } static sigemt() { sigpanic(SIGEMT); } ! 50: static sigfpe() { sigpanic(SIGFPE); } static sigbus() { sigpanic(SIGBUS); } ! 51: static sigsegv() { sigpanic(SIGSEGV); } static sigsys() { sigpanic(SIGSYS); } ! 52: static sigpipe() { sigpanic(SIGPIPE); } static sigterm() { sigpanic(SIGTERM); } ! 53: sigsetup() ! 54: { ! 55: signal(SIGQUIT, cntlc); signal(SIGINT, cntlc); ! 56: signal(SIGKILL, SIG_IGN); signal(SIGHUP, sgam); ! 57: signal(SIGILL, sigill); signal(SIGTRAP, sigtrap); ! 58: signal(SIGIOT, sigiot); signal(SIGEMT, sigemt); ! 59: signal(SIGFPE, sigfpe); signal(SIGBUS, sigbus); ! 60: signal(SIGSEGV, sigsegv); signal(SIGSYS, sigsys); ! 61: signal(SIGPIPE, sigpipe); signal(SIGTERM, sigterm); ! 62: #ifdef SIGTSTP ! 63: signal(SIGTSTP,tstop); signal(SIGSTOP,tstop); ! 64: #endif SIGTSTP ! 65: } ! 66: ! 67: #ifdef BSD /* for BSD UNIX? */ ! 68: ! 69: static char *signame[NSIG] = { "", ! 70: "SIGHUP", /* 1 hangup */ ! 71: "SIGINT", /* 2 interrupt */ ! 72: "SIGQUIT", /* 3 quit */ ! 73: "SIGILL", /* 4 illegal instruction (not reset when caught) */ ! 74: "SIGTRAP", /* 5 trace trap (not reset when caught) */ ! 75: "SIGIOT", /* 6 IOT instruction */ ! 76: "SIGEMT", /* 7 EMT instruction */ ! 77: "SIGFPE", /* 8 floating point exception */ ! 78: "SIGKILL", /* 9 kill (cannot be caught or ignored) */ ! 79: "SIGBUS", /* 10 bus error */ ! 80: "SIGSEGV", /* 11 segmentation violation */ ! 81: "SIGSYS", /* 12 bad argument to system call */ ! 82: "SIGPIPE", /* 13 write on a pipe with no one to read it */ ! 83: "SIGALRM", /* 14 alarm clock */ ! 84: "SIGTERM", /* 15 software termination signal from kill */ ! 85: "SIGURG", /* 16 urgent condition on IO channel */ ! 86: "SIGSTOP", /* 17 sendable stop signal not from tty */ ! 87: "SIGTSTP", /* 18 stop signal from tty */ ! 88: "SIGCONT", /* 19 continue a stopped process */ ! 89: "SIGCHLD", /* 20 to parent on child stop or exit */ ! 90: "SIGTTIN", /* 21 to readers pgrp upon background tty read */ ! 91: "SIGTTOU", /* 22 like TTIN for output if (tp->t_local<OSTOP) */ ! 92: "SIGIO", /* 23 input/output possible signal */ ! 93: "SIGXCPU", /* 24 exceeded CPU time limit */ ! 94: "SIGXFSZ", /* 25 exceeded file size limit */ ! 95: "SIGVTALRM",/* 26 virtual time alarm */ ! 96: "SIGPROF", /* 27 profiling time alarm */ ! 97: "","","","" }; ! 98: ! 99: #else BSD /* for system V? */ ! 100: ! 101: static char *signame[NSIG] = { "", ! 102: "SIGHUP", /* 1 hangup */ ! 103: "SIGINT", /* 2 interrupt */ ! 104: "SIGQUIT", /* 3 quit */ ! 105: "SIGILL", /* 4 illegal instruction (not reset when caught) */ ! 106: "SIGTRAP", /* 5 trace trap (not reset when caught) */ ! 107: "SIGIOT", /* 6 IOT instruction */ ! 108: "SIGEMT", /* 7 EMT instruction */ ! 109: "SIGFPE", /* 8 floating point exception */ ! 110: "SIGKILL", /* 9 kill (cannot be caught or ignored) */ ! 111: "SIGBUS", /* 10 bus error */ ! 112: "SIGSEGV", /* 11 segmentation violation */ ! 113: "SIGSYS", /* 12 bad argument to system call */ ! 114: "SIGPIPE", /* 13 write on a pipe with no one to read it */ ! 115: "SIGALRM", /* 14 alarm clock */ ! 116: "SIGTERM", /* 15 software termination signal from kill */ ! 117: "SIGUSR1", /* 16 user defines signal 1 */ ! 118: "SIGUSR2", /* 17 user defines signal 2 */ ! 119: "SIGCLD", /* 18 child death */ ! 120: "SIGPWR", /* 19 power fail */ ! 121: "","","","","","","","","","","","" }; ! 122: ! 123: #endif BSD ! 124: ! 125: /* ! 126: * routine to process a fatal error signal ! 127: */ ! 128: static sigpanic(sig) ! 129: int sig; ! 130: { ! 131: char buf[128]; ! 132: signal(sig,SIG_DFL); ! 133: sprintf(buf,"\nLarn - Panic! Signal %d received [%s]",sig,signame[sig]); ! 134: write(2,buf,strlen(buf)); sleep(2); ! 135: sncbr(); ! 136: savegame(savefilename); ! 137: kill(getpid(),sig); /* this will terminate us */ ! 138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.