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


void
sigprint(const char *msg, const sigset_t *ss) {
	printf("%s:", msg);
	for (size_t i = 1; i < NSIG; i++)
		if (sigismember(ss, i)) 
			printf(" %s", strsignal(i));
	printf("\n");
}

int
main(void) {
	sigset_t ss, si;
	sigemptyset(&ss);

	sigprocmask(SIG_SETMASK, NULL, &ss);
	sigprint("blocked", &ss);

	sigemptyset(&ss);
	sigemptyset(&si);
	printf("NSIG=%d\n", NSIG);
	for (size_t i = 1; i < NSIG; i++) {
		struct sigaction sa;
		if (sigaction(i, NULL, &sa) == -1) {
			warn("sigaction %zu", i);
			continue;
		}
		switch ((intptr_t)sa.sa_handler) {
		case (intptr_t)SIG_DFL:
			break;
		case (intptr_t)SIG_IGN:
			sigaddset(&si, i);
			break;
		case (intptr_t)SIG_ERR:
			errx(EXIT_FAILURE, "sigaction SIG_ERR %zu", i);
		case (intptr_t)SIG_HOLD:
			errx(EXIT_FAILURE, "sigaction SIG_HOLD %zu", i);
		default:
			sigaddset(&ss, i);
		}
	}
	sigprint("ignored", &si);
	sigprint("caught", &ss);
	for (;;)
		continue;
	return 0;
}