15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <assert.h>
25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <stdlib.h>
35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <unistd.h>
45dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <signal.h>
55dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstatic void handle_signal(int no)
75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{
85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	_exit(128 + no);
95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes}
105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesint
125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesmain(void)
135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{
145a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	struct sigaction sa, sa0;
155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_handler = SIG_IGN;
175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigemptyset(&sa.sa_mask);
185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigaddset(&sa.sa_mask, SIGHUP);
195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigaddset(&sa.sa_mask, SIGINT);
205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_flags = SA_RESTART;
215a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	assert(!sigaction(SIGUSR2, &sa, &sa0));
225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_handler = handle_signal;
245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigemptyset(&sa.sa_mask);
255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigaddset(&sa.sa_mask, SIGQUIT);
265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigaddset(&sa.sa_mask, SIGTERM);
275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_flags = SA_SIGINFO;
285a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	assert(!sigaction(SIGUSR2, &sa, &sa0));
295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_handler = SIG_DFL;
315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sigemptyset(&sa.sa_mask);
325dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	sa.sa_flags = 0;
335a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	assert(!sigaction(SIGUSR2, &sa, &sa0));
345a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes
355a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	sigfillset(&sa.sa_mask);
365a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	sigdelset(&sa.sa_mask, SIGHUP);
375a1392221308acd0cd74a43f2c985bd316adaa77Elliott Hughes	assert(!sigaction(SIGUSR2, &sa, &sa0));
385dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
395dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	return 0;
405dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes}
41