#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
//#include <fcntl.h>
#include <unistd.h>
#include <setjmp.h>
#include <sys/types.h>




/*
#include <errno.h>
#include <fcntl.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#else
extern char *optarg;
extern int optind;
#endif
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <setjmp.h>
#include <time.h>
#include <limits.h>

#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
*/




void *terminate_addr = NULL;

void terminate_intr(int signo){
//int signo EXT2FS_ATTR((unused)))

        //fflush(out);
        //fprintf(stderr, "\n\nInterrupted at block %llu\n",
          //      (unsigned long long) currently_testing);
        //fflush(stderr);
		//fprintf("\n\nInterrupted !!!\n", stderr);
		printf("Interrupted !\n");
        //if (terminate_addr)
                longjmp(terminate_addr,1);
        //exit(1);
}


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);
}

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);
}


int main(int argc, char **argv){
	jmp_buf terminate_env;
	capture_terminate(terminate_env);
	while(1){
        if (setjmp(terminate_env)) {
                /*
                 * Abnormal termination by a signal is handled here.
                 */
                signal (SIGALRM, SIG_IGN);
                //fputs("\nInterrupt caught, cleaning up\n", stderr);
				printf("Interrupt caught!\n");
				//exit(1);
				break;
		}
		printf("sleeping...\n");
		sleep(1);
        /* set up abend handler */
        //capture_terminate(terminate_env);
	}
	uncapture_terminate();

	return 0;
}