|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 3380 (0xd34)
Types: TextFile
Notes: UNIX file
Names: »trap.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/rsh/trap.c«
└─⟦this⟧ »cmd/sh/trap.c«
#include "sh.h"
#include <signal.h>
/*
* Interrupt flags.
*/
int intflag = 0;
int realint = 0;
int norecur = 0;
/*
* Trap storage area.
*/
typedef struct {
int t_cnt; /* Signal received */
int (*t_set)(); /* Current action */
int (*t_def)(); /* Default action */
char *t_act; /* Action to take */
} TRAP;
TRAP trap[NSIG+1];
/*
* Set default traps for various contexts.
*/
dflttrp(context)
register int context;
{
extern int sigintr();
register int sig;
switch (context) {
case IRDY: /* Trap initialisation */
for (sig=0; sig<=NSIG; sig+=1)
deftrp(sig, signal(sig, SIG_IGN));
if (iflag) {
signal(SIGINT, sigintr);
signal(SIGTERM, SIG_IGN);
}
#ifndef DEBUG
signal(SIGQUIT, SIG_IGN);
#endif
break;
case IBACK: /* Background initialisation */
deftrp(SIGINT, SIG_IGN);
deftrp(SIGQUIT, SIG_IGN);
break;
case IFORK: /* Sub-shell initialization */
signal(SIGINT, trap[SIGINT].t_set);
signal(SIGTERM, trap[SIGTERM].t_set);
break;
case ICMD: /* Command execution initialisation */
signal(SIGQUIT, trap[SIGQUIT].t_set);
break;
}
}
deftrp(sig, def)
register int sig;
register int (*def)();
{
signal(sig, def);
trap[sig].t_cnt = 0;
trap[sig].t_set = def;
trap[sig].t_def = def;
sfree(trap[sig].t_act);
trap[sig].t_act = NULL;
}
/*
* Show the contents of traps.
*/
telltrp()
{
register int sig;
register int (*act)();
register char *what;
if ((what=trap[0].t_act) != NULL)
prints("0=exit: %s\n", what);
for (sig=1; sig<=NSIG; sig+=1) {
act = trap[sig].t_set;
if (act==SIG_IGN)
what = "ignored";
else if (act==sigintr)
what = trap[sig].t_act;
else
what = NULL;
if (what)
prints("%d=%s: %s\n", sig, signame[sig], what);
}
return (0);
}
/*
* Set a trap.
*/
setstrp(sig, actp)
register int sig;
register char *actp;
{
int spc;
if (sig < 0 || sig > NSIG) {
printe("Bad trap: %d", sig);
return (1);
}
spc = (iflag && (sig==SIGINT||sig==SIGTERM)) || sig==SIGQUIT;
sfree(trap[sig].t_act);
trap[sig].t_act = NULL;
if (actp==NULL) {
if (! spc)
signal(sig, trap[sig].t_def);
trap[sig].t_set = trap[sig].t_def;
} else if (*actp=='\0') {
if (! spc)
signal(sig, SIG_IGN);
trap[sig].t_set = SIG_IGN;
} else if (trap[sig].t_def == SIG_IGN) {
;
} else {
trap[sig].t_act = duplstr(actp, 1);
if (! spc)
signal(sig, sigintr);
trap[sig].t_set = sigintr;
}
return (0);
}
/*
* Execute a trap action.
*/
/*
* Interrupt routine.
*/
sigintr(sig)
register int sig;
{
signal(sig, sigintr);
intflag += 1;
trap[sig].t_cnt += 1;
if (sig==SIGINT && iflag) {
noeflag += 1;
realint += 1;
}
}
/*
* Recover from an interrupt.
*/
recover(context)
{
register int sig;
register char *actp;
if ( ! intflag || norecur)
return (1);
norecur++;
realint = realint && iflag; /* iflag may have been cleared */
switch (context) {
case IRDY:
case ICMD:
break;
case ILEX:
case IEVAL:
norecur = 0;
return ( ! realint);
}
for (sig = 0; sig <= NSIG; sig += 1) {
if (trap[sig].t_cnt) {
trap[sig].t_cnt = 0;
if (actp = trap[sig].t_act) {
trap[sig].t_act = NULL;
session(SARGS, actp);
trap[sig].t_act = actp;
setstrp(sig, NULL);
} else if (sig==SIGINT) {
if (! realint)
kill(getpid(), SIGINT);
}
}
}
intflag = 0;
norecur = 0;
if (realint) {
noeflag = 0;
realint = 0;
reset(RINT);
NOTREACHED;
}
return (1);
}