_WCRTLINK int raise( int sig ) { __sig_func func; func = _RWD_sigtab[ sig ]; switch( sig ) { #if !defined( __WINDOWS_386__ ) case SIGFPE: __sigfpe_handler( FPE_EXPLICITGEN ); break; case SIGABRT: if( func == SIG_DFL ) { __terminate(); } case SIGINT: if( func != SIG_IGN && func != SIG_DFL && func != SIG_ERR ) { _RWD_sigtab[ sig ] = SIG_DFL; /* 09-nov-87 FWC */ __restore_int23(); (*func)( sig ); } break; case SIGBREAK: if( func != SIG_IGN && func != SIG_DFL && func != SIG_ERR ) { _RWD_sigtab[ sig ] = SIG_DFL; /* 09-nov-87 FWC */ __restore_int_ctrl_break(); (*func)( sig ); } break; #else case SIGABRT: case SIGFPE: case SIGINT: case SIGBREAK: #endif case SIGILL: case SIGSEGV: case SIGTERM: case SIGUSR1: case SIGUSR2: case SIGUSR3: case SIGIDIVZ: case SIGIOVFL: if( func != SIG_IGN && func != SIG_DFL && func != SIG_ERR ) { _RWD_sigtab[ sig ] = SIG_DFL; /* 09-nov-87 FWC */ (*func)( sig ); } break; default: return( -1 ); } return( 0 ); }
_WCRTLINK __sig_func signal( int sig, __sig_func func ) { __sig_func prev_func; if(( sig < 1 ) || ( sig > __SIGLAST )) { _RWD_errno = EINVAL; return( SIG_ERR ); } _RWD_abort = __sigabort; /* change the abort rtn address */ #if !defined( __WINDOWS_386__ ) if( sig == SIGINT ) { if( func == SIG_DFL ) { __restore_int23(); } else if( func != SIG_ERR ) { __grab_int23(); } } else if( sig == SIGBREAK ) { if( func == SIG_DFL ) { __restore_int_ctrl_break(); } else if( func != SIG_ERR ) { __grab_int_ctrl_break(); } #if defined( __DOS__ ) } else if( sig == SIGFPE ) { if( func == SIG_DFL ) { __restore_FPE_handler(); } else if( func != SIG_ERR ) { __grab_FPE_handler(); } #endif } #endif prev_func = _RWD_sigtab[ sig ]; _RWD_sigtab[ sig ] = func; return( prev_func ); }
static void __restore_int( void ) { __restore_int23(); __restore_int_ctrl_break(); }