msvcrt: Use signal definitions from public header.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2020-12-01 13:52:20 +01:00 committed by Alexandre Julliard
parent 9e085387ac
commit 2d96d03006
3 changed files with 47 additions and 61 deletions

View File

@ -22,6 +22,7 @@
*/
#include <float.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
@ -44,7 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh);
static MSVCRT_security_error_handler security_error_handler;
#endif
static MSVCRT___sighandler_t sighandlers[MSVCRT_NSIG] = { MSVCRT_SIG_DFL };
static __sighandler_t sighandlers[NSIG] = { SIG_DFL };
static BOOL WINAPI msvcrt_console_handler(DWORD ctrlType)
{
@ -53,10 +54,10 @@ static BOOL WINAPI msvcrt_console_handler(DWORD ctrlType)
switch (ctrlType)
{
case CTRL_C_EVENT:
if (sighandlers[MSVCRT_SIGINT])
if (sighandlers[SIGINT])
{
if (sighandlers[MSVCRT_SIGINT] != MSVCRT_SIG_IGN)
sighandlers[MSVCRT_SIGINT](MSVCRT_SIGINT);
if (sighandlers[SIGINT] != SIG_IGN)
sighandlers[SIGINT](SIGINT);
ret = TRUE;
}
break;
@ -92,7 +93,7 @@ static const struct
static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
{
LONG ret = EXCEPTION_CONTINUE_SEARCH;
MSVCRT___sighandler_t handler;
__sighandler_t handler;
if (!except || !except->ExceptionRecord)
return EXCEPTION_CONTINUE_SEARCH;
@ -100,16 +101,16 @@ static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
switch (except->ExceptionRecord->ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
if ((handler = sighandlers[MSVCRT_SIGSEGV]) != MSVCRT_SIG_DFL)
if ((handler = sighandlers[SIGSEGV]) != SIG_DFL)
{
if (handler != MSVCRT_SIG_IGN)
if (handler != SIG_IGN)
{
EXCEPTION_POINTERS **ep = (EXCEPTION_POINTERS**)MSVCRT___pxcptinfoptrs(), *old_ep;
old_ep = *ep;
*ep = except;
sighandlers[MSVCRT_SIGSEGV] = MSVCRT_SIG_DFL;
handler(MSVCRT_SIGSEGV);
sighandlers[SIGSEGV] = SIG_DFL;
handler(SIGSEGV);
*ep = old_ep;
}
ret = EXCEPTION_CONTINUE_EXECUTION;
@ -126,15 +127,15 @@ static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
case EXCEPTION_FLT_OVERFLOW:
case EXCEPTION_FLT_STACK_CHECK:
case EXCEPTION_FLT_UNDERFLOW:
if ((handler = sighandlers[MSVCRT_SIGFPE]) != MSVCRT_SIG_DFL)
if ((handler = sighandlers[SIGFPE]) != SIG_DFL)
{
if (handler != MSVCRT_SIG_IGN)
if (handler != SIG_IGN)
{
EXCEPTION_POINTERS **ep = (EXCEPTION_POINTERS**)MSVCRT___pxcptinfoptrs(), *old_ep;
unsigned int i;
int float_signal = _FPE_INVALID;
sighandlers[MSVCRT_SIGFPE] = MSVCRT_SIG_DFL;
sighandlers[SIGFPE] = SIG_DFL;
for (i = 0; i < ARRAY_SIZE(float_exception_map); i++)
{
if (float_exception_map[i].status ==
@ -147,7 +148,7 @@ static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
old_ep = *ep;
*ep = except;
((float_handler)handler)(MSVCRT_SIGFPE, float_signal);
((float_handler)handler)(SIGFPE, float_signal);
*ep = old_ep;
}
ret = EXCEPTION_CONTINUE_EXECUTION;
@ -155,16 +156,16 @@ static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
case EXCEPTION_PRIV_INSTRUCTION:
if ((handler = sighandlers[MSVCRT_SIGILL]) != MSVCRT_SIG_DFL)
if ((handler = sighandlers[SIGILL]) != SIG_DFL)
{
if (handler != MSVCRT_SIG_IGN)
if (handler != SIG_IGN)
{
EXCEPTION_POINTERS **ep = (EXCEPTION_POINTERS**)MSVCRT___pxcptinfoptrs(), *old_ep;
old_ep = *ep;
*ep = except;
sighandlers[MSVCRT_SIGILL] = MSVCRT_SIG_DFL;
handler(MSVCRT_SIGILL);
sighandlers[SIGILL] = SIG_DFL;
handler(SIGILL);
*ep = old_ep;
}
ret = EXCEPTION_CONTINUE_EXECUTION;
@ -189,31 +190,31 @@ void msvcrt_free_signals(void)
* Some signals may never be generated except through an explicit call to
* raise.
*/
MSVCRT___sighandler_t CDECL MSVCRT_signal(int sig, MSVCRT___sighandler_t func)
__sighandler_t CDECL MSVCRT_signal(int sig, __sighandler_t func)
{
MSVCRT___sighandler_t ret = MSVCRT_SIG_ERR;
__sighandler_t ret = SIG_ERR;
TRACE("(%d, %p)\n", sig, func);
if (func == MSVCRT_SIG_ERR) return MSVCRT_SIG_ERR;
if (func == SIG_ERR) return SIG_ERR;
switch (sig)
{
/* Cases handled internally. Note SIGTERM is never generated by Windows,
* so we effectively mask it.
*/
case MSVCRT_SIGABRT:
case MSVCRT_SIGFPE:
case MSVCRT_SIGILL:
case MSVCRT_SIGSEGV:
case MSVCRT_SIGINT:
case MSVCRT_SIGTERM:
case MSVCRT_SIGBREAK:
case SIGABRT:
case SIGFPE:
case SIGILL:
case SIGSEGV:
case SIGINT:
case SIGTERM:
case SIGBREAK:
ret = sighandlers[sig];
sighandlers[sig] = func;
break;
default:
ret = MSVCRT_SIG_ERR;
ret = SIG_ERR;
}
return ret;
}
@ -223,41 +224,41 @@ MSVCRT___sighandler_t CDECL MSVCRT_signal(int sig, MSVCRT___sighandler_t func)
*/
int CDECL MSVCRT_raise(int sig)
{
MSVCRT___sighandler_t handler;
__sighandler_t handler;
TRACE("(%d)\n", sig);
switch (sig)
{
case MSVCRT_SIGFPE:
case MSVCRT_SIGILL:
case MSVCRT_SIGSEGV:
case SIGFPE:
case SIGILL:
case SIGSEGV:
handler = sighandlers[sig];
if (handler == MSVCRT_SIG_DFL) MSVCRT__exit(3);
if (handler != MSVCRT_SIG_IGN)
if (handler == SIG_DFL) MSVCRT__exit(3);
if (handler != SIG_IGN)
{
EXCEPTION_POINTERS **ep = (EXCEPTION_POINTERS**)MSVCRT___pxcptinfoptrs(), *old_ep;
sighandlers[sig] = MSVCRT_SIG_DFL;
sighandlers[sig] = SIG_DFL;
old_ep = *ep;
*ep = NULL;
if (sig == MSVCRT_SIGFPE)
if (sig == SIGFPE)
((float_handler)handler)(sig, _FPE_EXPLICITGEN);
else
handler(sig);
*ep = old_ep;
}
break;
case MSVCRT_SIGABRT:
case MSVCRT_SIGINT:
case MSVCRT_SIGTERM:
case MSVCRT_SIGBREAK:
case SIGABRT:
case SIGINT:
case SIGTERM:
case SIGBREAK:
handler = sighandlers[sig];
if (handler == MSVCRT_SIG_DFL) MSVCRT__exit(3);
if (handler != MSVCRT_SIG_IGN)
if (handler == SIG_DFL) MSVCRT__exit(3);
if (handler != SIG_IGN)
{
sighandlers[sig] = MSVCRT_SIG_DFL;
sighandlers[sig] = SIG_DFL;
handler(sig);
}
break;

View File

@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <process.h>
#include <signal.h>
#include <stdio.h>
#include "msvcrt.h"
#include "mtdll.h"
@ -258,7 +259,7 @@ void CDECL MSVCRT_abort(void)
else
_cputs("\nabnormal program termination\n");
}
MSVCRT_raise(MSVCRT_SIGABRT);
MSVCRT_raise(SIGABRT);
/* in case raise() returns */
MSVCRT__exit(3);
}
@ -297,7 +298,7 @@ void CDECL MSVCRT__wassert(const wchar_t* str, const wchar_t* file, unsigned int
else
MSVCRT_fwprintf(MSVCRT_stderr, L"Assertion failed: %ls, file %ls, line %d\n\n", str, file, line);
MSVCRT_raise(MSVCRT_SIGABRT);
MSVCRT_raise(SIGABRT);
MSVCRT__exit(3);
}

View File

@ -662,22 +662,6 @@ struct MSVCRT__stat64 {
#define MSVCRT_CLOCKS_PER_SEC 1000
/* signals */
#define MSVCRT_SIGINT 2
#define MSVCRT_SIGILL 4
#define MSVCRT_SIGFPE 8
#define MSVCRT_SIGSEGV 11
#define MSVCRT_SIGTERM 15
#define MSVCRT_SIGBREAK 21
#define MSVCRT_SIGABRT 22
#define MSVCRT_NSIG (MSVCRT_SIGABRT + 1)
typedef void (__cdecl *MSVCRT___sighandler_t)(int);
#define MSVCRT_SIG_DFL ((MSVCRT___sighandler_t)0)
#define MSVCRT_SIG_IGN ((MSVCRT___sighandler_t)1)
#define MSVCRT_SIG_ERR ((MSVCRT___sighandler_t)-1)
#define MSVCRT__TRUNCATE ((size_t)-1)
#define _MAX__TIME64_T (((__time64_t)0x00000007 << 32) | 0x93406FFF)