#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <unistd.h>


static void *terminate_addr = NULL;

//static void terminate_intr(int signo EXT2FS_ATTR((unused)))
static void terminate_intr(int signo){
	if(terminate_addr)
		longjmp(terminate_addr, 1);
	exit(1);
}

static void capture_terminate(jmp_buf term_addr){
	terminate_addr = term_addr;
	signal (SIGHUP, terminate_intr);
	signal (SIGINT, terminate_intr);
	signal (SIGPIPE, terminate_intr);
	signal (SIGTERM, terminate_intr);
	signal (SIGUSR1, terminate_intr);
	signal (SIGUSR2, terminate_intr);
}

static void uncapture_terminate(void){
	terminate_addr = NULL;
	signal (SIGHUP, SIG_DFL);
	signal (SIGINT, SIG_DFL);
	signal (SIGPIPE, SIG_DFL);
	signal (SIGTERM, SIG_DFL);
	signal (SIGUSR1, SIG_DFL);
	signal (SIGUSR2, SIG_DFL);
}









//void <signal handler func name> (int sig)
//void (*signal(int signo, void (*func )(int)))(int);

/*
void sig_handler(int signo){
	if(signo == SIGHUP)
		printf("received SIGHUP\n");
	else if(signo == SIGINT)
		printf("received SIGINT\n");
	else if(signo == SIGPIPE)
		printf("received SIGPIPE\n");
	else if(signo == SIGTERM)
		printf("received SIGTERM\n");
	else if(signo == SIGUSR1)
		printf("received SIGUSR1\n");
	else if(signo == SIGUSR2)
		printf("received SIGUSR2\n");
	else
		printf("received signal %d\n", signo);
	exit(signo);
}
*/



int main(int argc, char **argv){
	jmp_buf terminate_env;

	//if(signal(SIGINT, sig_handler) == SIG_ERR)
	//	printf("\ncan't catch SIGINT\n");


	if(setjmp(terminate_env)){
		signal(SIGALRM, SIG_IGN);
		fputs("\nInterrupt caught, cleaning up\n", stderr);
		//fflush (out);
		exit(1);
	}
	/* set up abend handler */
	capture_terminate(terminate_env);
	while(1){
		sleep(1);
	}
	uncapture_terminate();

	return 0;
}
