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

static char *str2;
static int handled = 0;

static void
handler(int sig)
{
    crypt(str2, "xx");
    handled++;
}

static void
usage(const char *progName)
{
    fprintf(stderr, "usage: %s str1 str2\n", progName);
    exit(EXIT_FAILURE);
}

int
main(int argc, char *argv[])
{
    char *cr1;
    int i, mismatch;
    struct sigaction sa;

    if (argc != 3)
        usage(argv[0]);

    str2 = argv[2];
    cr1 = strdup(crypt(argv[1], "xx"));

    if (cr1 == NULL)
        err(EXIT_FAILURE, "strdup");

    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = handler;

    if (sigaction(SIGINT, &sa, NULL) == -1)
        err(EXIT_FAILURE, "sigaction");

    for (i = 1, mismatch = 0; ; i++) {
        if (strcmp(crypt(argv[1], "xx"), cr1) != 0) {
            mismatch++;
            printf("Mismatch on call %d (mismatch=%d handled=%d)\n",
                    i, mismatch, handled);
        }
    }
}
