#include <signal.h>
#include "header.h"
static void s2choose(void);
static void cntlc(int);
static void sgam(int);
#ifdef SIGTSTP
static void tstop(int);
#endif
static void sigill(int);
static void sigtrap(int);
static void sigiot(int);
static void sigemt(int);
static void sigfpe(int);
static void sigbus(int);
static void sigsegv(int);
static void sigsys(int);
static void sigpipe(int);
static void sigterm(int);
static void sigpanic(int);
#define BIT(a) (1<<((a)-1))
static void
s2choose(void)
{
cursor(1, 24);
lprcat("Press ");
setbold();
lprcat("return");
resetbold();
lprcat(" to continue: ");
lflush();
}
static void
cntlc(__unused int sig)
{
if (nosignal)
return;
signal(SIGQUIT, SIG_IGN);
signal(SIGINT, SIG_IGN);
quit();
if (predostuff == 1)
s2choose();
else
showplayer();
lflush();
signal(SIGQUIT, cntlc);
signal(SIGINT, cntlc);
}
static void
sgam(__unused int sig)
{
savegame(savefilename);
wizard = 1;
died(-257);
}
#ifdef SIGTSTP
static void
tstop(__unused int sig)
{
if (nosignal)
return;
lcreat(NULL);
clearvt100();
lflush();
signal(SIGTSTP, SIG_DFL);
#ifdef SIGVTALRM
sigsetmask(sigblock(0) & ~BIT(SIGTSTP));
#endif
kill(getpid(), SIGTSTP);
setupvt100();
signal(SIGTSTP, tstop);
if (predostuff == 1)
s2choose();
else
drawscreen();
showplayer();
lflush();
}
#endif
static void
sigill(__unused int sig)
{
sigpanic(SIGILL);
}
static void
sigtrap(__unused int sig)
{
sigpanic(SIGTRAP);
}
static void
sigiot(__unused int sig)
{
sigpanic(SIGIOT);
}
static void
sigemt(__unused int sig)
{
sigpanic(SIGEMT);
}
static void
sigfpe(__unused int sig)
{
sigpanic(SIGFPE);
}
static void
sigbus(__unused int sig)
{
sigpanic(SIGBUS);
}
static void
sigsegv(__unused int sig)
{
sigpanic(SIGSEGV);
}
static void
sigsys(__unused int sig)
{
sigpanic(SIGSYS);
}
static void
sigpipe(__unused int sig)
{
sigpanic(SIGPIPE);
}
static void
sigterm(__unused int sig)
{
sigpanic(SIGTERM);
}
void
sigsetup(void)
{
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);
#ifdef SIGTSTP
signal(SIGTSTP, tstop);
signal(SIGSTOP, tstop);
#endif
}
static const char *signame[NSIG] = { "",
"SIGHUP",
"SIGINT",
"SIGQUIT",
"SIGILL",
"SIGTRAP",
"SIGIOT",
"SIGEMT",
"SIGFPE",
"SIGKILL",
"SIGBUS",
"SIGSEGV",
"SIGSYS",
"SIGPIPE",
"SIGALRM",
"SIGTERM",
"SIGURG",
"SIGSTOP",
"SIGTSTP",
"SIGCONT",
"SIGCHLD",
"SIGTTIN",
"SIGTTOU",
"SIGIO",
"SIGXCPU",
"SIGXFSZ",
"SIGVTALRM",
"SIGPROF",
"SIGWINCH",
"SIGINFO",
"SIGUSR1",
"SIGUSR2",
};
static void
sigpanic(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);
sncbr();
savegame(savefilename);
kill(getpid(), sig);
}