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