1e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/*
2e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * sigcatcher.c --- print a backtrace on a SIGSEGV, et. al
3e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall *
4e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Copyright (C) 2011 Theodore Ts'o.
5e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall *
6e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %Begin-Header%
7e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * This file may be redistributed under the terms of the GNU Public
8e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * License.
9e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %End-Header%
10e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */
11e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
12e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <stdio.h>
13e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <stdlib.h>
14e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <signal.h>
15e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <string.h>
16e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_EXECINFO_H
17e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <execinfo.h>
18e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
19e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
20e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include "e2fsck.h"
21e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
22e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstruct str_table {
23e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	int	num;
24e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	const char	*name;
25e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
26e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
27e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define DEFINE_ENTRY(SYM)	{ SYM, #SYM },
28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define END_TABLE		{ 0, 0 }
29e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
30e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sig_table[] = {
31e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGHUP
32e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGHUP)
33e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
34e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGINT
35e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGINT)
36e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGQUIT
38e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGQUIT)
39e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
40e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGILL
41e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGILL)
42e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
43e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGTRAP
44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGTRAP)
45e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
46e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGABRT
47e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGABRT)
48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
49e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGIOT
50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGIOT)
51e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
52e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGBUS
53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGBUS)
54e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
55e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGFPE
56e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGFPE)
57e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
58e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGKILL
59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGKILL)
60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
61e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGUSR1
62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGUSR1)
63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGSEGV
65e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGSEGV)
66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGUSR2
68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGUSR2)
69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGPIPE
71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGPIPE)
72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGALRM
74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGALRM)
75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGTERM
77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGTERM)
78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGSTKFLT
80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGSTKFLT)
81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGCHLD
83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGCHLD)
84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
85e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGCONT
86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGCONT)
87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGSTOP
89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGSTOP)
90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGTSTP
92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGTSTP)
93e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
94e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGTTIN
95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGTTIN)
96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
97e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGTTOU
98e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGTTOU)
99e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
100e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGURG
101e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGURG)
102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGXCPU
104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGXCPU)
105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGXFSZ
107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGXFSZ)
108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGVTALRM
110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGVTALRM)
111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGPROF
113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGPROF)
114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGWINCH
116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGWINCH)
117e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGIO
119e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGIO)
120e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
121e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGPOLL
122e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGPOLL)
123e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
124e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGPWR
125e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGPWR)
126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
127e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SIGSYS
128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SIGSYS)
129e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
130e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
131e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
132e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
133e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table generic_code_table[] = {
134e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_ASYNCNL
135e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_ASYNCNL)
136e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
137e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_TKILL
138e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_TKILL)
139e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
140e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_SIGIO
141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_SIGIO)
142e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
143e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_ASYNCIO
144e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_ASYNCIO)
145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
146e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_MESGQ
147e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_MESGQ)
148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
149e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_TIMER
150e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_TIMER)
151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
152e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_QUEUE
153e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_QUEUE)
154e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_USER
156e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_USER)
157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
158e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SI_KERNEL
159e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SI_KERNEL)
160e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
162e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
163e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
164e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigill_code_table[] = {
165e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_ILLOPC
166e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_ILLOPC)
167e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
168e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_ILLOPN
169e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_ILLOPN)
170e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
171e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_ILLADR
172e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_ILLADR)
173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_ILLTRP
175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_ILLTRP)
176e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
177e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_PRVOPC
178e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_PRVOPC)
179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
180e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_PRVREG
181e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_PRVREG)
182e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
183e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_COPROC
184e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_COPROC)
185e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
186e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef ILL_BADSTK
187e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(ILL_BADSTK)
188e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
189e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_ADRALN
190e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_ADRALN)
191e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
192e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_ADRERR
193e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_ADRERR)
194e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
195e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_OBJERR
196e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_OBJERR)
197e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
198e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
199e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
200e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
201e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigfpe_code_table[] = {
202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_INTDIV
203e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_INTDIV)
204e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_INTOVF
206e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_INTOVF)
207e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTDIV
209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTDIV)
210e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
211e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTOVF
212e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTOVF)
213e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
214e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTUND
215e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTUND)
216e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
217e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTRES
218e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTRES)
219e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
220e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTINV
221e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTINV)
222e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
223e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef FPE_FLTSUB
224e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(FPE_FLTSUB)
225e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
226e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
227e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
229e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigsegv_code_table[] = {
230e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SEGV_MAPERR
231e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SEGV_MAPERR)
232e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
233e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef SEGV_ACCERR
234e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(SEGV_ACCERR)
235e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
236e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
237e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
238e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
239e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigbus_code_table[] = {
241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_ADRALN
242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_ADRALN)
243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_ADRERR
245e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_ADRERR)
246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BUS_OBJERR
248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(BUS_OBJERR)
249e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
250e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
251e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
252e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#if 0 /* should this be hooked in somewhere? */
254e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigstrap_code_table[] = {
255e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef TRAP_BRKPT
256e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(TRAP_BRKPT)
257e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
258e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef TRAP_TRACE
259e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(TRAP_TRACE)
260e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
261e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
262e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
263e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigcld_code_table[] = {
266e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_EXITED
267e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_EXITED)
268e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
269e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_KILLED
270e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_KILLED)
271e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
272e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_DUMPED
273e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_DUMPED)
274e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_TRAPPED
276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_TRAPPED)
277e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_STOPPED
279e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_STOPPED)
280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
281e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CLD_CONTINUED
282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(CLD_CONTINUED)
283e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
284e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
285e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
286e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
287e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#if 0 /* should this be hooked in somewhere? */
288e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct str_table sigpoll_code_table[] = {
289e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_IN
290e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_IN)
291e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_OUT
293e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_OUT)
294e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_MSG
296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_MSG)
297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
298e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_ERR
299e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_ERR)
300e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
301e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_PRI
302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_PRI)
303e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef POLL_HUP
305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	DEFINE_ENTRY(POLL_HUP)
306e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
307e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	END_TABLE
308e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
311e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic const char *lookup_table(int num, struct str_table *table)
312e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
313e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct str_table *p;
314e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
315e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	for (p=table; p->name; p++)
316e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		if (num == p->num)
317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			return(p->name);
318e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	return NULL;
319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
321e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic const char *lookup_table_fallback(int num, struct str_table *table)
322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
323e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	static char buf[32];
324e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	const char *ret = lookup_table(num, table);
325e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
326e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (ret)
327e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		return ret;
328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	snprintf(buf, sizeof(buf), "%d", num);
329e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	buf[sizeof(buf)-1] = 0;
330e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	return buf;
331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
332e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
333e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void die_signal_handler(int signum, siginfo_t *siginfo,
334e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			       void *context EXT2FS_ATTR((unused)))
335e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
336e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       void *stack_syms[32];
337e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       int frames;
338e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       const char *cp;
339e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
340e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       fprintf(stderr, "Signal (%d) %s ", signum,
341e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       lookup_table_fallback(signum, sig_table));
342e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       if (siginfo->si_code == SI_USER)
343e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "(sent from pid %u) ", siginfo->si_pid);
344e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       cp = lookup_table(siginfo->si_code, generic_code_table);
345e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       if (cp)
346e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ", cp);
347e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else if (signum == SIGILL)
348e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ",
349e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		       lookup_table_fallback(siginfo->si_code,
350e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					     sigill_code_table));
351e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else if (signum == SIGFPE)
352e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ",
353e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		       lookup_table_fallback(siginfo->si_code,
354e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					     sigfpe_code_table));
355e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else if (signum == SIGSEGV)
356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ",
357e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		       lookup_table_fallback(siginfo->si_code,
358e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					     sigsegv_code_table));
359e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else if (signum == SIGBUS)
360e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ",
361e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		       lookup_table_fallback(siginfo->si_code,
362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					     sigbus_code_table));
363e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else if (signum == SIGCHLD)
364e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si_code=%s ",
365e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		       lookup_table_fallback(siginfo->si_code,
366e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					     sigcld_code_table));
367e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       else
368e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "si code=%d ", siginfo->si_code);
369e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       if ((siginfo->si_code != SI_USER) &&
370e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	   (signum == SIGILL || signum == SIGFPE ||
371e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	    signum == SIGSEGV || signum == SIGBUS))
372e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       fprintf(stderr, "fault addr=%p", siginfo->si_addr);
373e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       fprintf(stderr, "\n");
374e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
375e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#if defined(HAVE_BACKTRACE) && !defined(DISABLE_BACKTRACE)
376e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       frames = backtrace(stack_syms, 32);
377e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       backtrace_symbols_fd(stack_syms, frames, 2);
378e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
379e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall       exit(FSCK_ERROR);
380e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
381e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
382e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid sigcatcher_setup(void)
383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
384e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct sigaction	sa;
385e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
386e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	memset(&sa, 0, sizeof(struct sigaction));
387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sa.sa_sigaction = die_signal_handler;
388e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sa.sa_flags = SA_SIGINFO;
389e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
390e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sigaction(SIGFPE, &sa, 0);
391e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sigaction(SIGILL, &sa, 0);
392e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sigaction(SIGBUS, &sa, 0);
393e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sigaction(SIGSEGV, &sa, 0);
394e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
395e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef DEBUG
398e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <getopt.h>
399e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
400e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid usage(void)
401e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
402e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	fprintf(stderr, "tst_sigcatcher: [-akfn]\n");
403e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	exit(1);
404e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
405e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
406e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallint main(int argc, char** argv)
407e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
408e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct sigaction	sa;
409e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	char			*p = 0;
410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	int 			i, c;
411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	volatile		x=0;
412e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
413e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	memset(&sa, 0, sizeof(struct sigaction));
414e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sa.sa_sigaction = die_signal_handler;
415e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sa.sa_flags = SA_SIGINFO;
416e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	for (i=1; i < 31; i++)
417e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		sigaction(i, &sa, 0);
418e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
419e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	while ((c = getopt (argc, argv, "afkn")) != EOF)
420e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		switch (c) {
421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		case 'a':
422e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			abort();
423e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			break;
424e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		case 'f':
425e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			printf("%d\n", 42/x);
426e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		case 'k':
427e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			kill(getpid(), SIGTERM);
428e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			break;
429e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		case 'n':
430e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			*p = 42;
431e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		default:
432e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			usage ();
433e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		}
434e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
435e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	printf("Sleeping for 10 seconds, send kill signal to pid %u...\n",
436e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	       getpid());
437e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	fflush(stdout);
438e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	sleep(10);
439e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	exit(0);
440e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
441e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
442