/*
 * #define _GNU_SOURCE
 *
 * sighandler_t orig;
 */

// #define _GNU_SOURCE

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

int sig;
void original_handler(int signo);
void new_handler(int signo);
void wait_for_sigint(void);

int
main(int argc, char *argv[])
{
    void (*orig)(int);
    // sighandler_t orig;

    signal(SIGINT, original_handler);
    printf("type Control-C to activate original SIGINT handler: ");
    fflush(stdout);
    wait_for_sigint();


    orig = signal(SIGINT, new_handler);
    printf("type Control-C to activate new SIGINT handler: ");
    fflush(stdout);
    wait_for_sigint();

    signal(SIGINT, orig);
    printf("type Control-C to activate original SIGINT handler: ");
    fflush(stdout);
    wait_for_sigint();

    exit(EXIT_SUCCESS);
}

void
wait_for_sigint(void)
{
    sig = -1;
    while (1) {
        if (sig != SIGINT)
            pause();
        else
            break;
    }
}

void
original_handler(int signo)
{
    printf("original handler\n");
    sig = SIGINT;
}

void
new_handler(int signo)
{
    printf("new handler\n");
    sig = SIGINT;
}


