+++ /dev/null
-/* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */\r
-\r
-/* signal -- what TESH needs to know about signals */\r
-\r
-/* Copyright (c) 2007 Martin Quinson. */\r
-/* All rights reserved. */\r
-\r
-/* This program is free software; you can redistribute it and/or modify it\r
- * under the terms of the license (GNU LGPL) which comes with this package. */\r
-\r
-#include <xsignal.h>\r
-\r
-#ifdef WIN32\r
-int\r
-is_an_unhandled_exception(DWORD exit_code);\r
-\r
-typedef struct s_exception_entry\r
-{\r
- DWORD value;\r
- const char* signal;\r
-}s_exception_entry_t,* exception_entry_t;\r
- \r
-static const s_exception_entry_t exceptions[] =\r
-{\r
- {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"},\r
- {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"},\r
- {EXCEPTION_BREAKPOINT, "SIGTRAP"},\r
- {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"},\r
- {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"},\r
- {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"},\r
- {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"},\r
- {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"},\r
- {EXCEPTION_FLT_OVERFLOW, "SIGFPE"},\r
- {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"},\r
- {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"},\r
- {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"},\r
- {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"},\r
- {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"},\r
- {EXCEPTION_INT_OVERFLOW, "SIGFPE"},\r
- {EXCEPTION_STACK_OVERFLOW, "SIGILL"},\r
- {EXCEPTION_SINGLE_STEP, "SIGTRAP"},\r
- {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"},\r
- {EXCEPTION_PRIV_INSTRUCTION, "SIGILL"}\r
-};\r
-/* number of the entries in the table of exceptions */\r
-#define MAX_EXECPTION ((unsigned int)19)\r
-\r
-#endif\r
-\r
-typedef struct s_signal_entry {\r
- const char* name;\r
- int number;\r
-} s_signal_entry_t,* signal_entry_t;\r
-\r
-static const s_signal_entry_t signals[] = {\r
- {"SIGHUP" ,SIGHUP},\r
- {"SIGINT" ,SIGINT},\r
- {"SIGQUIT" ,SIGQUIT},\r
- {"SIGILL" ,SIGILL},\r
- {"SIGTRAP" ,SIGTRAP},\r
- {"SIGABRT" ,SIGABRT},\r
- {"SIGFPE" ,SIGFPE},\r
- {"SIGKILL" ,SIGKILL},\r
- {"SIGBUS" ,SIGBUS},\r
- {"SIGSEGV" ,SIGSEGV},\r
- {"SIGSYS" ,SIGSYS},\r
- {"SIGPIPE" ,SIGPIPE},\r
- {"SIGALRM" ,SIGALRM},\r
- {"SIGTERM" ,SIGTERM},\r
- {"SIGURG" ,SIGURG},\r
- {"SIGSTOP" ,SIGSTOP},\r
- {"SIGTSTP" ,SIGTSTP},\r
- {"SIGCONT" ,SIGCONT},\r
- {"SIGCHLD" ,SIGCHLD},\r
- {"SIGTTIN" ,SIGTTIN},\r
- {"SIGTTOU" ,SIGTTOU},\r
- {"SIGIO" ,SIGIO},\r
- {"SIGXCPU" ,SIGXCPU},\r
- {"SIGXFSZ" ,SIGXFSZ},\r
- {"SIGVTALRM",SIGVTALRM},\r
- {"SIGPROF" ,SIGPROF},\r
- {"SIGWINCH" ,SIGWINCH},\r
- {"SIGUSR1" ,SIGUSR1},\r
- {"SIGUSR2" ,SIGUSR2},\r
- {"SIG UNKNOWN" ,-1}\r
-};\r
-\r
-#ifdef WIN32\r
-const char* signal_name(DWORD got, const char* expected) \r
-#else\r
-const char* signal_name(unsigned int got, char *expected) \r
-#endif\r
-{\r
- int i;\r
- \r
- #ifdef WIN32\r
-\r
- for (i=0; i < MAX_EXECPTION; i++)\r
- if (exceptions[i].value == got)\r
- return (exceptions[i].signal);\r
- #else\r
- if((got == SIGBUS) && !strcmp("SIGSEGV",expected))\r
- got = SIGSEGV;\r
-\r
- for (i=0; signals[i].number != -1; i++)\r
- if (signals[i].number == got)\r
- return (signals[i].name);\r
- \r
- #endif\r
- return bprintf("SIG UNKNOWN (%d)", got);\r
-}\r
-\r
-int\r
-sig_exists(const char* sig_name)\r
-{\r
- int i;\r
-\r
- for (i=0; signals[i].number != -1; i++)\r
- if (!strcmp(signals[i].name, sig_name))\r
- return 1; \r
-\r
- /* not found */\r
- return 0;\r
-}\r
-\r
-\r
-#ifdef WIN32\r
-int\r
-is_an_unhandled_exception(DWORD exit_code)\r
-{\r
- unsigned int i;\r
-\r
- for(i = 0; i < MAX_EXECPTION; i++)\r
- if(exceptions[i].value == exit_code)\r
- return 1;\r
- \r
- return 0; \r
-}\r
-#endif\r