_WCRTLINK __sig_func signal( int sig, __sig_func func ) { __sig_func prev_func; if(( sig < 1 ) || ( sig > __SIGLAST )) { __set_errno( EINVAL ); return( SIG_ERR ); } _RWD_abort = __sigabort; /* change the abort rtn address */ if( _RWD_sigtab[ sig ].os_sig_code != 0 ) { if( func != SIG_DFL && func != SIG_ERR ) { if( _RWD_sigtab[ sig ].os_func == NULL ) { DosSetSigHandler( (PFNSIGHANDLER)break_handler, &_RWD_sigtab[ sig ].os_func, &_RWD_sigtab[ sig ].prev_action, 2, _RWD_sigtab[ sig ].os_sig_code ); __int23_exit = restore_handler; } } } else if( sig == SIGFPE ) { if( func == SIG_DFL ) { __restore_FPE_handler(); } else if( func != SIG_ERR ) { __grab_FPE_handler(); } } prev_func = _RWD_sigtab[ sig ].func; _RWD_sigtab[ sig ].func = func; return( prev_func ); }
_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 ); }