#include #include "include/internal/wine/msvcrt.h" static sig_element signal_list[] = { { SIGINT, "CTRL+C",SIG_DFL }, { SIGILL, "Illegal instruction",SIG_DFL }, { SIGFPE, "Floating-point exception",SIG_DFL }, { SIGSEGV, "Illegal storage access",SIG_DFL }, { SIGTERM, "Termination request",SIG_DFL }, { SIGBREAK, "CTRL+BREAK",SIG_DFL }, { SIGABRT, "Abnormal termination",SIG_DFL } }; //int nsignal = 21; /* * @implemented */ //void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig ); __p_sig_fn_t signal(int sig, __p_sig_fn_t func) { __p_sig_fn_t temp; unsigned int i; switch (sig) { case SIGINT: case SIGILL: case SIGFPE: case SIGSEGV: case SIGTERM: case SIGBREAK: case SIGABRT: break; default: _set_errno(EINVAL); return SIG_ERR; } // check with IsBadCodePtr if ( (uintptr_t)func < 4096 && func != SIG_DFL && func != SIG_IGN) { _set_errno(EINVAL); return SIG_ERR; } for(i=0; i < sizeof(signal_list)/sizeof(signal_list[0]); i++) { if ( signal_list[i].signal == sig ) { temp = signal_list[i].handler; signal_list[i].handler = func; return temp; } } /* should be impossible to get here */ _set_errno(EINVAL); return SIG_ERR; } /* * @implemented */ int raise(int sig) { __p_sig_fn_t temp = 0; unsigned int i; switch (sig) { case SIGINT: case SIGILL: case SIGFPE: case SIGSEGV: case SIGTERM: case SIGBREAK: case SIGABRT: break; default: //FIXME: set last err? return -1; } // if(sig <= 0) // return -1; // if(sig > SIGMAX) // return -1; for(i=0;i