V10/cmd/sh/fault.c
/* @(#)fault.c 1.5 */
/*
* UNIX shell
*
* Bell Telephone Laboratories
*
*/
#include "defs.h"
extern int done();
char *trapcom[MAXTRAP];
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, /* unassigned */
#ifndef SYSV
0, /* non-tty stop signal */
0, /* tty stop signal */
0, /* continue */
0, /* death of child */
0, /* tty input */
0, /* tty output */
0, /* lintrup (berkeley weirdness) */
0, /* exceeded cpu limit */
0, /* exceeded file limit */
#endif
};
int (*(sigval[]))() =
{
0,
done,
fault,
fault,
/* temporary hack */
/*done,*/0,
done,
done,
done,
done,
0,
done,
done,
done,
done,
fault,
fault,
done,
0,
#ifndef SYSV
0,
0,
0,
0,
0,
0,
0,
0,
0
#endif
};
/* ======== fault handling routines ======== */
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++;
}
}
stdsigs()
{
setsig(SIGHUP);
setsig(SIGINT);
ignsig(SIGQUIT);
setsig(SIGPIPE);
setsig(SIGALRM);
setsig(SIGTERM);
#ifndef SYSV
setsig(SIGSTOP);
setsig(SIGTSTP);
setsig(SIGCONT);
setsig(SIGTTIN);
setsig(SIGTTOU);
setsig(SIGXCPU);
setsig(SIGXFSZ);
#endif
}
ignsig(n)
{
register int s;
if ((s = (signal(n, SIG_IGN) == SIG_IGN)) == 0)
{
trapflg[n] |= 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;
{
shfree(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();
}
}
}
}