X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/77e3814f0c0e3dea4d0032e25666f77e6f83bfff..e30950ccc7c7c31c69f1d31c16b0212bbf168ceb:/larn/signal.c diff --git a/larn/signal.c b/larn/signal.c index 60bd6ce1..42493424 100644 --- a/larn/signal.c +++ b/larn/signal.c @@ -1,148 +1,142 @@ +/* $NetBSD: signal.c,v 1.8 2004/01/27 20:30:30 jsm Exp $ */ + +/* "Larn is copyrighted 1986 by Noah Morgan.\n" */ + +#include +#ifndef lint +__RCSID("$NetBSD: signal.c,v 1.8 2004/01/27 20:30:30 jsm Exp $"); +#endif /* not lint */ + #include -#include "header.h" /* "Larn is copyrighted 1986 by Noah Morgan.\n" */ +#include +#include +#include +#include "header.h" +#include "extern.h" + +static void s2choose(void); +static void cntlc(int); +static void sgam(int); +static void tstop(int); +static void sigpanic(int); + #define BIT(a) (1<<((a)-1)) -extern char savefilename[],wizard,predostuff,nosignal; -static s2choose() /* text to be displayed if ^C during intro screen */ - { - cursor(1,24); lprcat("Press "); setbold(); lprcat("return"); resetbold(); - lprcat(" to continue: "); lflush(); - } static void -cntlc() /* what to do for a ^C */ - { - if (nosignal) return; /* don't do anything if inhibited */ - signal(SIGQUIT,SIG_IGN); signal(SIGINT,SIG_IGN); - quit(); if (predostuff==1) s2choose(); else showplayer(); +s2choose() +{ /* text to be displayed if ^C during intro + * screen */ + cursor(1, 24); + lprcat("Press "); + setbold(); + lprcat("return"); + resetbold(); + lprcat(" to continue: "); + lflush(); +} + +static void +cntlc(n) + int n; +{ /* what to do for a ^C */ + if (nosignal) + return; /* don't do anything if inhibited */ + signal(SIGQUIT, SIG_IGN); + signal(SIGINT, SIG_IGN); + quit(); + if (predostuff == 1) + s2choose(); + else + showplayer(); lflush(); - signal(SIGQUIT,cntlc); signal(SIGINT,cntlc); - } + signal(SIGQUIT, cntlc); + signal(SIGINT, cntlc); +} /* * subroutine to save the game if a hangup signal */ static void -sgam() - { - savegame(savefilename); wizard=1; died(-257); /* hangup signal */ - } +sgam(n) + int n; +{ + savegame(savefilename); + wizard = 1; + died(-257); /* hangup signal */ +} #ifdef SIGTSTP static void -tstop() /* control Y */ - { - if (nosignal) return; /* nothing if inhibited */ - lcreat((char*)0); clearvt100(); lflush(); signal(SIGTSTP,SIG_DFL); +tstop(n) + int n; +{ /* control Y */ + if (nosignal) + return; /* nothing if inhibited */ + lcreat((char *) 0); + clearvt100(); + lflush(); + signal(SIGTSTP, SIG_DFL); #ifdef SIGVTALRM - /* looks like BSD4.2 or higher - must clr mask for signal to take effect*/ - sigsetmask(sigblock(0)& ~BIT(SIGTSTP)); + /* + * looks like BSD4.2 or higher - must clr mask for signal to take + * effect + */ + sigsetmask(sigblock(0) & ~BIT(SIGTSTP)); #endif - kill(getpid(),SIGTSTP); + kill(getpid(), SIGTSTP); - setupvt100(); signal(SIGTSTP,tstop); - if (predostuff==1) s2choose(); else drawscreen(); - showplayer(); lflush(); - } -#endif SIGTSTP + setupvt100(); + signal(SIGTSTP, tstop); + if (predostuff == 1) + s2choose(); + else + drawscreen(); + showplayer(); + lflush(); +} +#endif /* SIGTSTP */ /* * subroutine to issue the needed signal traps called from main() */ -static void sigpanic(); -static void sigill() { sigpanic(SIGILL); } -static void sigtrap() { sigpanic(SIGTRAP); } -static void sigiot() { sigpanic(SIGIOT); } -static void sigemt() { sigpanic(SIGEMT); } -static void sigfpe() { sigpanic(SIGFPE); } -static void sigbus() { sigpanic(SIGBUS); } -static void sigsegv() { sigpanic(SIGSEGV); } -static void sigsys() { sigpanic(SIGSYS); } -static void sigpipe() { sigpanic(SIGPIPE); } -static void sigterm() { sigpanic(SIGTERM); } +void sigsetup() - { - signal(SIGQUIT, cntlc); signal(SIGINT, cntlc); - signal(SIGKILL, SIG_IGN); signal(SIGHUP, sgam); - signal(SIGILL, sigill); signal(SIGTRAP, sigtrap); - signal(SIGIOT, sigiot); signal(SIGEMT, sigemt); - signal(SIGFPE, sigfpe); signal(SIGBUS, sigbus); - signal(SIGSEGV, sigsegv); signal(SIGSYS, sigsys); - signal(SIGPIPE, sigpipe); signal(SIGTERM, sigterm); +{ + signal(SIGQUIT, cntlc); + signal(SIGINT, cntlc); + signal(SIGKILL, SIG_IGN); + signal(SIGHUP, sgam); + signal(SIGILL, sigpanic); + signal(SIGTRAP, sigpanic); + signal(SIGIOT, sigpanic); + signal(SIGEMT, sigpanic); + signal(SIGFPE, sigpanic); + signal(SIGBUS, sigpanic); + signal(SIGSEGV, sigpanic); + signal(SIGSYS, sigpanic); + signal(SIGPIPE, sigpanic); + signal(SIGTERM, sigpanic); #ifdef SIGTSTP - signal(SIGTSTP,tstop); signal(SIGSTOP,tstop); -#endif SIGTSTP - } - -#ifdef BSD /* for BSD UNIX? */ - -static char *signame[NSIG] = { "", -"SIGHUP", /* 1 hangup */ -"SIGINT", /* 2 interrupt */ -"SIGQUIT", /* 3 quit */ -"SIGILL", /* 4 illegal instruction (not reset when caught) */ -"SIGTRAP", /* 5 trace trap (not reset when caught) */ -"SIGIOT", /* 6 IOT instruction */ -"SIGEMT", /* 7 EMT instruction */ -"SIGFPE", /* 8 floating point exception */ -"SIGKILL", /* 9 kill (cannot be caught or ignored) */ -"SIGBUS", /* 10 bus error */ -"SIGSEGV", /* 11 segmentation violation */ -"SIGSYS", /* 12 bad argument to system call */ -"SIGPIPE", /* 13 write on a pipe with no one to read it */ -"SIGALRM", /* 14 alarm clock */ -"SIGTERM", /* 15 software termination signal from kill */ -"SIGURG", /* 16 urgent condition on IO channel */ -"SIGSTOP", /* 17 sendable stop signal not from tty */ -"SIGTSTP", /* 18 stop signal from tty */ -"SIGCONT", /* 19 continue a stopped process */ -"SIGCHLD", /* 20 to parent on child stop or exit */ -"SIGTTIN", /* 21 to readers pgrp upon background tty read */ -"SIGTTOU", /* 22 like TTIN for output if (tp->t_local<OSTOP) */ -"SIGIO", /* 23 input/output possible signal */ -"SIGXCPU", /* 24 exceeded CPU time limit */ -"SIGXFSZ", /* 25 exceeded file size limit */ -"SIGVTALRM",/* 26 virtual time alarm */ -"SIGPROF", /* 27 profiling time alarm */ -"","","","" }; - -#else BSD /* for system V? */ - -static char *signame[NSIG] = { "", -"SIGHUP", /* 1 hangup */ -"SIGINT", /* 2 interrupt */ -"SIGQUIT", /* 3 quit */ -"SIGILL", /* 4 illegal instruction (not reset when caught) */ -"SIGTRAP", /* 5 trace trap (not reset when caught) */ -"SIGIOT", /* 6 IOT instruction */ -"SIGEMT", /* 7 EMT instruction */ -"SIGFPE", /* 8 floating point exception */ -"SIGKILL", /* 9 kill (cannot be caught or ignored) */ -"SIGBUS", /* 10 bus error */ -"SIGSEGV", /* 11 segmentation violation */ -"SIGSYS", /* 12 bad argument to system call */ -"SIGPIPE", /* 13 write on a pipe with no one to read it */ -"SIGALRM", /* 14 alarm clock */ -"SIGTERM", /* 15 software termination signal from kill */ -"SIGUSR1", /* 16 user defines signal 1 */ -"SIGUSR2", /* 17 user defines signal 2 */ -"SIGCLD", /* 18 child death */ -"SIGPWR", /* 19 power fail */ -"","","","","","","","","","","","" }; - -#endif BSD + signal(SIGTSTP, tstop); + signal(SIGSTOP, tstop); +#endif /* SIGTSTP */ +} /* * routine to process a fatal error signal */ static void sigpanic(sig) - int sig; - { - char buf[128]; - signal(sig,SIG_DFL); - sprintf(buf,"\nLarn - Panic! Signal %d received [%s]",sig,signame[sig]); - write(2,buf,strlen(buf)); sleep(2); + int sig; +{ + char buf[128]; + signal(sig, SIG_DFL); + snprintf(buf, sizeof(buf), + "\nLarn - Panic! Signal %d received [SIG%s]", sig, + sys_signame[sig]); + write(2, buf, strlen(buf)); + sleep(2); sncbr(); - savegame(savefilename); - kill(getpid(),sig); /* this will terminate us */ - } + savegame(savefilename); + kill(getpid(), sig); /* this will terminate us */ +}