2021-10-11 18:37:13 -03:00

228 lines
3.8 KiB
C

/* Copyright (c) 1984 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ifndef lint
static char sccsid[] = "@(#)fault.c 1.1 94/10/31 SMI"; /* from S5R3 1.8 */
#endif
/*
* UNIX shell
*/
#include "defs.h"
extern void done();
static void fault();
char *trapcom[MAXTRAP];
BOOL trapjmp;
BOOL trapflg[MAXTRAP] =
{
0,
0, /* hangup */
0, /* interrupt */
0, /* quit */
0, /* illegal instr */
0, /* trace trap */
0, /* IOT */
0, /* EMT */
0, /* float pt. exp */
0, /* kill */
0, /* bus error */
0, /* memory faults */
0, /* bad sys call */
0, /* bad pipe call */
0, /* alarm */
0, /* software termination */
0, /* urgent condition on I/O channel */
0, /* stop not from tty */
0, /* stop from tty */
0, /* continue */
0, /* status change of child */
0, /* stop from background tty read */
0, /* stop from background tty write */
0, /* I/O possible */
0, /* exceeded CPU time limit */
0, /* exceeded file size limit */
0, /* virtual time alarm */
0, /* profiling time alarm */
0, /* window changed */
0, /* resource lost */
0, /* user-defined signal 1 */
0, /* user-defined signal 2 */
};
void (*(sigval[MAXTRAP]))() =
{
SIG_DFL,
done, /* hangup */
fault, /* interrupt */
fault, /* quit */
done, /* illegal instr */
done, /* trace trap */
done, /* IOT */
done, /* EMT */
done, /* float pt. exp */
SIG_DFL, /* kill */
done, /* bus error */
done, /* memory faults */
done, /* bad sys call */
done, /* bad pipe call */
fault, /* alarm */
fault, /* software termination */
SIG_DFL, /* urgent condition on I/O channel */
done, /* stop not from tty */
done, /* stop from tty */
done, /* continue */
SIG_DFL, /* status change of child */
done, /* stop from background tty read */
done, /* stop from background tty write */
SIG_DFL, /* I/O possible */
done, /* exceeded CPU time limit */
done, /* exceeded file size limit */
done, /* virtual time alarm */
done, /* profiling time alarm */
SIG_DFL, /* window changed */
done, /* resource lost */
done, /* user-defined signal 1 */
done, /* user-defined signal 2 */
};
/* ======== fault handling routines ======== */
static void
fault(sig)
register int sig;
{
register int flag;
signal(sig, fault);
if (sig == SIGALRM)
{
if (flags & waiting)
done();
}
else
{
flag = (trapcom[sig] ? TRAPSET : SIGSET);
trapnote |= flag;
trapflg[sig] |= flag;
if (sig == SIGINT)
{
wasintr++;
if (trapjmp)
{
trapjmp = 0;
longjmp(INTbuf, 1);
}
}
}
}
stdsigs()
{
setsig(SIGHUP);
setsig(SIGINT);
ignsig(SIGQUIT);
setsig(SIGILL);
setsig(SIGTRAP);
setsig(SIGIOT);
setsig(SIGEMT);
setsig(SIGFPE);
setsig(SIGBUS);
setsig(SIGSYS);
setsig(SIGPIPE);
setsig(SIGALRM);
setsig(SIGTERM);
setsig(SIGUSR1);
setsig(SIGUSR2);
}
ignsig(n)
{
register int s, i;
if ((s = (signal(i = n, SIG_IGN) == SIG_IGN)) == 0)
{
trapflg[i] |= SIGMOD;
}
return(s);
}
getsig(n)
{
register int i;
if (trapflg[i = n] & SIGMOD || ignsig(i) == 0)
signal(i, fault);
}
setsig(n)
{
register int i;
if (ignsig(i = n) == 0)
signal(i, sigval[i]);
}
oldsigs()
{
register int i;
register char *t;
i = MAXTRAP;
while (i--)
{
t = trapcom[i];
if (t == 0 || *t)
clrsig(i);
trapflg[i] = 0;
}
trapnote = 0;
}
clrsig(i)
int i;
{
free(trapcom[i]);
trapcom[i] = 0;
if (trapflg[i] & SIGMOD)
{
trapflg[i] &= ~SIGMOD;
signal(i, sigval[i]);
}
}
/*
* check for traps
*/
chktrap()
{
register int i = MAXTRAP;
register char *t;
trapnote &= ~TRAPSET;
while (--i)
{
if (trapflg[i] & TRAPSET)
{
trapflg[i] &= ~TRAPSET;
if (t = trapcom[i])
{
int savxit = exitval;
execexp(t, 0);
exitval = savxit;
exitset();
}
}
}
}