Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -536,10 +536,12 @@ ]) AC_MSG_RESULT($ac_cv_snprintf_useful_ret) ]) test x"$have_asprintf" != x"yes" -a x"$ac_cv_snprintf_useful_ret" != x"yes" && \ AC_MSG_ERROR(No asprintf and no snprintf returning required space!) + +AC_CHECK_FUNCS(sigaction) AC_CHECK_FUNCS([arc4random random], break) AC_CHECK_LIB(dl, dlopen, LIBS="$LIBS -ldl") AC_CHECK_HEADERS_ONCE(dlfcn.h) Index: src/OFApplication.m ================================================================== --- src/OFApplication.m +++ src/OFApplication.m @@ -417,27 +417,47 @@ return _delegate; } - (void)setDelegate: (id )delegate { - _delegate = delegate; +#ifdef HAVE_SIGACTION + struct sigaction sa = { .sa_flags = SA_RESTART }; + sigemptyset(&sa.sa_mask); -#define REGISTER_SIGNAL(sig) \ +# define REGISTER_SIGNAL(sig) \ + if ([delegate respondsToSelector: \ + @selector(applicationDidReceive##sig)]) { \ + _##sig##Handler = (void(*)(id, SEL))[(id)delegate \ + methodForSelector: \ + @selector(applicationDidReceive##sig)]; \ + \ + sa.sa_handler = handle##sig; \ + } else \ + sa.sa_handler = SIG_DFL; \ + \ + OF_ENSURE(sigaction(sig, &sa, NULL) == 0); +#else +# define REGISTER_SIGNAL(sig) \ if ([delegate respondsToSelector: \ @selector(applicationDidReceive##sig)]) { \ _##sig##Handler = (void(*)(id, SEL))[(id)delegate \ methodForSelector: \ @selector(applicationDidReceive##sig)]; \ signal(sig, handle##sig); \ } else \ signal(sig, SIG_DFL); +#endif + + _delegate = delegate; + REGISTER_SIGNAL(SIGINT) #ifndef OF_WINDOWS REGISTER_SIGNAL(SIGHUP) REGISTER_SIGNAL(SIGUSR1) REGISTER_SIGNAL(SIGUSR2) #endif + #undef REGISTER_SIGNAL } - (void)OF_run {