ack/util/int/m_sigtrp.c

147 lines
3 KiB
C
Raw Normal View History

2019-03-17 14:42:00 +00:00
/** @file
* Dedicated treatment of the sigtrp system call, MON 48.
*/
1988-06-22 16:57:09 +00:00
1994-06-24 11:31:16 +00:00
/* $Id$ */
1988-06-22 16:57:09 +00:00
#include <signal.h>
#include "global.h"
#include "log.h"
#include "warn.h"
#include "trap.h"
2019-03-17 14:42:00 +00:00
#include "m_sigtrp.h"
#include "io.h"
1988-06-22 16:57:09 +00:00
/*************************** SIGTRP *************************************
* The monitor call "sigtrp()" is handled by "do_sigtrp()". The first *
* argument is a EM-trap number (0<=tn<=252), the second a UNIX signal *
* number. The user wants trap "tn" to be generated, in case signal *
* "sn" occurs. The report about this interpreter has a section, *
* giving all details about signal handling. Do_sigtrp() returns the *
* previous trap-number "sn" was mapped onto. A return value of -1 *
* indicates an error. *
************************************************************************/
#define UNIX_trap(sn) (SIGILL <= sn && sn <= SIGSYS)
1991-10-22 09:07:31 +00:00
#ifndef NSIG
#define NSIG _NSIG
#endif
2019-03-17 14:42:00 +00:00
PRIVATE int sig_map[NSIG + 1]; /* maps signals onto trap numbers */
1988-06-22 16:57:09 +00:00
2019-03-17 14:42:00 +00:00
PRIVATE void HndlIntSig(int); /* handle signal to interpreter */
PRIVATE void HndlEmSig(int); /* handle signal to user program */
1988-06-22 16:57:09 +00:00
2019-03-17 14:42:00 +00:00
void init_signals(void)
{
1988-06-22 16:57:09 +00:00
int sn;
2019-03-17 14:42:00 +00:00
for (sn = 0; sn < NSIG + 1; sn++)
{
sig_map[sn] = -2; /* Default EM trap number */
1988-06-22 16:57:09 +00:00
}
2019-03-17 14:42:00 +00:00
for (sn = 0; sn < NSIG + 1; sn++)
{
1988-06-22 16:57:09 +00:00
/* for all signals that would cause termination */
2019-03-17 14:42:00 +00:00
if (!UNIX_trap(sn))
{
#ifdef SIGCHLD
2019-03-17 14:42:00 +00:00
if (sn == SIGCHLD)
continue;
#endif
#ifdef SIGIO
2019-03-17 14:42:00 +00:00
if (sn == SIGIO)
continue;
#endif
#ifdef SIGWINCH
2019-03-17 14:42:00 +00:00
if (sn == SIGWINCH)
continue;
#endif
2019-03-17 14:42:00 +00:00
if (signal(sn, SIG_IGN) != SIG_IGN)
{
1988-06-22 16:57:09 +00:00
/* we take our fate in our own hand */
signal(sn, HndlIntSig);
}
}
}
}
2019-03-17 14:42:00 +00:00
int do_sigtrp(
int tn, /* EM trap number */
int sn /* UNIX signal number */
)
1988-06-22 16:57:09 +00:00
{
register int old_tn;
2019-03-17 14:42:00 +00:00
if (sn <= 0 || sn > NSIG)
{
1988-06-22 16:57:09 +00:00
einval(WILLSN);
return (-1);
}
2019-03-17 14:42:00 +00:00
if (UNIX_trap(sn))
{
1988-06-22 16:57:09 +00:00
einval(WUNIXTR);
return (-1);
}
old_tn = sig_map[sn];
sig_map[sn] = tn;
2019-03-17 14:42:00 +00:00
if (tn == -2)
{ /* reset default for signal sn */
1988-06-22 16:57:09 +00:00
signal(sn, SIG_DFL);
}
2019-03-17 14:42:00 +00:00
else if (tn == -3)
{ /* ignore signal sn */
1988-06-22 16:57:09 +00:00
signal(sn, SIG_IGN);
}
2019-03-17 14:42:00 +00:00
else if (tn >= 0 && tn <= 252)
{/* legal tn */
if ((int) signal(sn, HndlEmSig) == -1)
{
1988-06-22 16:57:09 +00:00
sig_map[sn] = old_tn;
return (-1);
}
}
2019-03-17 14:42:00 +00:00
else
{
1988-06-22 16:57:09 +00:00
/* illegal trap number */
einval(WILLTN);
2019-03-17 14:42:00 +00:00
sig_map[sn] = old_tn; /* restore sig_map */
1988-06-22 16:57:09 +00:00
return (-1);
}
return (old_tn);
}
2019-03-17 14:42:00 +00:00
/** Execute the trap belonging to the signal that came in during
* the last instruction
*/
void trap_signal(void)
1988-06-22 16:57:09 +00:00
{
register int old_sig = signalled;
signalled = 0;
trap(sig_map[old_sig]);
}
2019-03-17 14:42:00 +00:00
PRIVATE void HndlIntSig(int sn)
1988-06-22 16:57:09 +00:00
{
/* The interpreter got the signal */
2019-03-17 14:42:00 +00:00
signal(sn, SIG_IGN); /* peace and quiet for close_down() */
1988-06-22 16:57:09 +00:00
LOG(("@t1 signal %d caught by interpreter", sn));
2019-03-17 14:42:00 +00:00
message(
"interpreter received signal %d, which was not caught by the interpreted program",
sn);
1988-06-22 16:57:09 +00:00
close_down(1);
}
2019-03-17 14:42:00 +00:00
PRIVATE void HndlEmSig(int sn)
1988-06-22 16:57:09 +00:00
{
/* The EM machine got the signal */
2019-03-17 14:42:00 +00:00
signal(sn, HndlIntSig); /* Revert to old situation */
1988-06-22 16:57:09 +00:00
signalled = sn;
}