home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum7.lzh
/
RICO
/
C
/
LIBSOURCE
/
SIGNAL
/
signal.c
< prev
next >
Wrap
Text File
|
2009-11-06
|
2KB
|
106 lines
/* OS9 signal facility */
#include <signal.h>
#define FALSE 0
#define TRUE 1
#define BADSIGNAL -1
#define FIRSTSIG 0
#define LASTSIG 3
/* Traps are negative */
#define FIRSTTRAP -9
#define LASTTRAP -1
#define ADDRESS unsigned long
typedef /* void */ int (* handler_func)();
extern int intercept_traps(),intercept();
static handler_func signal_table[] = { SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL };
static handler_func trap_table[] = { SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL,
SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL,
SIG_DFL };
static int signal_flag_table[] = { FALSE,FALSE,FALSE,FALSE };
static int trap_flag_table[] = { FALSE,FALSE,FALSE,FALSE,FALSE,
FALSE,FALSE,FALSE,FALSE };
static int signal_handler(sig)
int sig;
{
if ((sig >= FIRSTSIG)&&(sig <= LASTSIG))
{
if (signal_flag_table[sig] == FALSE)
{
/* Legal signal */
switch ((ADDRESS)(signal_table[sig]))
{
case SIG_DFL:
/* Default is abort */
exit(sig);
break;
case SIG_IGN:
/* Ignore */
break;
default:
/* Set flag */
signal_flag_table[sig] = TRUE;
signal_table[sig](sig);
/* Clear flag */
signal_flag_table[sig] = FALSE;
break;
}
}
} else
{
/* Unknown signal, abort */
exit(sig);
}
}
static short intercept_installed = FALSE;
static short traps_installed = FALSE;
handler_func signal(sig,func)
int sig;
handler_func func;
{
handler_func oldfunc;
int error;
if ((sig >= FIRSTSIG)&&(sig <= LASTSIG))
{
/* Install signal handler */
oldfunc = signal_table[sig];
signal_table[sig] = func;
signal_flag_table[sig] = FALSE;
} else
if ((sig >= FIRSTTRAP)&&(sig <= LASTTRAP))
{
/* Install trap handler, note : traps are negative offsets ! */
sig = -sig-1;
oldfunc = trap_table[sig];
trap_table[sig] = func;
trap_flag_table[sig] = FALSE;
} else
{
/* Unknown signal or trap, report error */
return BADSIGNAL;
}
if (!intercept_installed)
{
intercept(signal_handler);
intercept_installed = TRUE;
}
if (!traps_installed)
{
if (error = intercept_traps(trap_table,trap_flag_table))
exit(error);
traps_installed = TRUE;
}
return oldfunc;
}