+void
+CatchInterrupts(void (*func)(int))
+{
+ interrupts.handler = func;
+
+ if (!interrupts.set) {
+ struct sigaction new_action, old_action;
+ new_action.sa_handler = InterruptHandler;
+ sigemptyset(&new_action.sa_mask);
+ new_action.sa_flags = 0;
+#define SET_IF_NOT_IGNORED(sig, old_handler) \
+ do { \
+ sigaction(sig, NULL, &old_action); \
+ if (old_action.sa_handler != SIG_IGN) { \
+ old_handler = old_action.sa_handler; \
+ sigaction(sig, &new_action, NULL); \
+ } \
+ } while (0)
+
+ SET_IF_NOT_IGNORED(SIGINT, interrupts.sig_int);
+ SET_IF_NOT_IGNORED(SIGHUP, interrupts.sig_hup);
+ SET_IF_NOT_IGNORED(SIGTERM, interrupts.sig_term);
+ SET_IF_NOT_IGNORED(SIGSEGV, interrupts.sig_segv);
+
+ interrupts.set = true;
+#undef SET_IF_NOT_IGNORED
+ }