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
14 int
\r is_an_unhandled_exception(DWORD exit_code);
15 \r\rtypedef struct s_exception_entry
\r {
18 \r} s_exception_entry_t, *exception_entry_t;
19 \r\rstatic const s_exception_entry_t exceptions[] =
\r
21 {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"},
\r
22 {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"},
\r
23 {EXCEPTION_BREAKPOINT, "SIGTRAP"},
\r
24 {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"},
\r
25 {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"},
\r
26 {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"},
\r
27 {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"},
\r
28 {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"},
\r
29 {EXCEPTION_FLT_OVERFLOW, "SIGFPE"},
\r
30 {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"},
\r
31 {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"},
\r
32 {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"},
\r
33 {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"},
\r
34 {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"},
\r
35 {EXCEPTION_INT_OVERFLOW, "SIGFPE"},
\r
36 {EXCEPTION_STACK_OVERFLOW, "SIGILL"},
\r
37 {EXCEPTION_SINGLE_STEP, "SIGTRAP"},
\r
38 {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"},
\r{EXCEPTION_PRIV_INSTRUCTION, "SIGILL"}
\r
42 /* number of the entries in the table of exceptions */
\r
43 #define MAX_EXECPTION ((unsigned int)19)
\r
46 \rtypedef struct s_signal_entry {
49 \r} s_signal_entry_t, *signal_entry_t;
50 \r\rstatic const s_signal_entry_t signals[] = {
\r
51 {"SIGHUP", SIGHUP},
\r
52 {"SIGINT", SIGINT},
\r
53 {"SIGQUIT", SIGQUIT},
\r
54 {"SIGILL", SIGILL},
\r
55 {"SIGTRAP", SIGTRAP},
\r
56 {"SIGABRT", SIGABRT},
\r
57 {"SIGFPE", SIGFPE},
\r
58 {"SIGKILL", SIGKILL},
\r
59 {"SIGBUS", SIGBUS},
\r
60 {"SIGSEGV", SIGSEGV},
\r
61 {"SIGSYS", SIGSYS},
\r
62 {"SIGPIPE", SIGPIPE},
\r
63 {"SIGALRM", SIGALRM},
\r
64 {"SIGTERM", SIGTERM},
\r
65 {"SIGURG", SIGURG},
\r
66 {"SIGSTOP", SIGSTOP},
\r
67 {"SIGTSTP", SIGTSTP},
\r
68 {"SIGCONT", SIGCONT},
\r
69 {"SIGCHLD", SIGCHLD},
\r
70 {"SIGTTIN", SIGTTIN},
\r
71 {"SIGTTOU", SIGTTOU},
\r
73 {"SIGXCPU", SIGXCPU},
\r
74 {"SIGXFSZ", SIGXFSZ},
\r
75 {"SIGVTALRM", SIGVTALRM},
\r
76 {"SIGPROF", SIGPROF},
\r
77 {"SIGWINCH", SIGWINCH},
\r
78 {"SIGUSR1", SIGUSR1},
\r{"SIGUSR2", SIGUSR2},
\r{"SIG UNKNOWN", -1}
\r
83 const char *signal_name(DWORD got, const char *expected)
\r
85 const char *signal_name(unsigned int got, char *expected)
\r
91 \rfor (i = 0; i < MAX_EXECPTION; i++)
92 \rif (exceptions[i].value == got)
93 \rreturn (exceptions[i].signal);
96 if ((got == SIGBUS) && !strcmp("SIGSEGV", expected))
98 \r\rfor (i = 0; signals[i].number != -1; i++)
99 \rif (signals[i].number == got)
100 \rreturn (signals[i].name);
103 return bprintf("SIG UNKNOWN (%d)", got);
106 \r\rint
\r sig_exists(const char *sig_name)
\r
109 \r\rfor (i = 0; signals[i].number != -1; i++)
110 \rif (!strcmp(signals[i].name, sig_name))
119 int
\r is_an_unhandled_exception(DWORD exit_code)
\r
122 \r\rfor (i = 0; i < MAX_EXECPTION; i++)
123 \rif (exceptions[i].value == exit_code)