1 /* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */
\r
3 /* signal -- what TESH needs to know about signals */
\r
5 /* Copyright (c) 2007 Martin Quinson. */
\r
6 /* All rights reserved. */
\r
8 /* This program is free software; you can redistribute it and/or modify it
\r
9 * under the terms of the license (GNU LGPL) which comes with this package. */
\r
11 #include <xsignal.h>
\r
15 is_an_unhandled_exception(DWORD exit_code);
\r
17 typedef struct s_exception_entry
\r
21 }s_exception_entry_t,* exception_entry_t;
\r
23 static const s_exception_entry_t exceptions[] =
\r
25 {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"},
\r
26 {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"},
\r
27 {EXCEPTION_BREAKPOINT, "SIGTRAP"},
\r
28 {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"},
\r
29 {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"},
\r
30 {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"},
\r
31 {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"},
\r
32 {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"},
\r
33 {EXCEPTION_FLT_OVERFLOW, "SIGFPE"},
\r
34 {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"},
\r
35 {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"},
\r
36 {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"},
\r
37 {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"},
\r
38 {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"},
\r
39 {EXCEPTION_INT_OVERFLOW, "SIGFPE"},
\r
40 {EXCEPTION_STACK_OVERFLOW, "SIGILL"},
\r
41 {EXCEPTION_SINGLE_STEP, "SIGTRAP"},
\r
42 {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"},
\r
43 {EXCEPTION_PRIV_INSTRUCTION, "SIGILL"}
\r
45 /* number of the entries in the table of exceptions */
\r
46 #define MAX_EXECPTION ((unsigned int)19)
\r
50 typedef struct s_signal_entry {
\r
53 } s_signal_entry_t,* signal_entry_t;
\r
55 static const s_signal_entry_t signals[] = {
\r
58 {"SIGQUIT" ,SIGQUIT},
\r
60 {"SIGTRAP" ,SIGTRAP},
\r
61 {"SIGABRT" ,SIGABRT},
\r
63 {"SIGKILL" ,SIGKILL},
\r
65 {"SIGSEGV" ,SIGSEGV},
\r
67 {"SIGPIPE" ,SIGPIPE},
\r
68 {"SIGALRM" ,SIGALRM},
\r
69 {"SIGTERM" ,SIGTERM},
\r
71 {"SIGSTOP" ,SIGSTOP},
\r
72 {"SIGTSTP" ,SIGTSTP},
\r
73 {"SIGCONT" ,SIGCONT},
\r
74 {"SIGCHLD" ,SIGCHLD},
\r
75 {"SIGTTIN" ,SIGTTIN},
\r
76 {"SIGTTOU" ,SIGTTOU},
\r
78 {"SIGXCPU" ,SIGXCPU},
\r
79 {"SIGXFSZ" ,SIGXFSZ},
\r
80 {"SIGVTALRM",SIGVTALRM},
\r
81 {"SIGPROF" ,SIGPROF},
\r
82 {"SIGWINCH" ,SIGWINCH},
\r
83 {"SIGUSR1" ,SIGUSR1},
\r
84 {"SIGUSR2" ,SIGUSR2},
\r
89 const char* signal_name(DWORD got, const char* expected)
\r
91 const char* signal_name(unsigned int got, char *expected)
\r
98 for (i=0; i < MAX_EXECPTION; i++)
\r
99 if (exceptions[i].value == got)
\r
100 return (exceptions[i].signal);
\r
102 if((got == SIGBUS) && !strcmp("SIGSEGV",expected))
\r
105 for (i=0; signals[i].number != -1; i++)
\r
106 if (signals[i].number == got)
\r
107 return (signals[i].name);
\r
110 return bprintf("SIG UNKNOWN (%d)", got);
\r
114 sig_exists(const char* sig_name)
\r
118 for (i=0; signals[i].number != -1; i++)
\r
119 if (!strcmp(signals[i].name, sig_name))
\r
129 is_an_unhandled_exception(DWORD exit_code)
\r
133 for(i = 0; i < MAX_EXECPTION; i++)
\r
134 if(exceptions[i].value == exit_code)
\r