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

void count(int from, int to);
void sig_handler(int signo);

int
main(int argc, char *argv[])
{
    sigset_t set;
    int i;

    if (signal(SIGINT, sig_handler) == SIG_ERR)
        err(EXIT_FAILURE, "signal");

    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigaddset(&set, SIGKILL);
    sigaddset(&set, SIGSTOP);

    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1)
        err(EXIT_FAILURE, "sigprocmask");

    printf("PID=%ld\n", (long) getpid());
    printf("Control-C is disabled until counting to 10\n");
    count(0, 10);

    if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
        err(EXIT_FAILURE, "sigprocmask");

    printf("\nControl-C is enabled again. Test it!\n");
    count(11, 20);

    printf("\n");
    exit(EXIT_SUCCESS);
}

void
count(int from, int to)
{
    for (int i = from; i <= to; i++) {
        printf("%d\n", i);
        fflush(stdout);
        sleep(1);
    }
}

void
sig_handler(int signo)
{
    static int cnt = 0;

    cnt++;
    printf("caught SIGINT %d\n", cnt);
    if (cnt >= 3) {
        printf("3 times tried to exit!\n");
        exit(EXIT_FAILURE);
    }
}
