%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% header #include "dk3conf.h" #include "dk3types.h" #ifdef __cplusplus extern "C" { #endif /** Set new handler for the specified signal. @param signo Signal number. @param fct Handler function address. @return The previous handler function address. */ dk3_signal_disp_t dk3signal_set(int signo, dk3_signal_disp_t fct); /** Refresh signal handler, if only signal() mechanism available. Should be a signal handlers first action. @param signo Signal number. @param fct Handler function address. */ void dk3signal_refresh(int signo, dk3_signal_disp_t fct); /** Find best available signal handling mechanism. @return DK3_SIGNAL_HANDLING_TYPE_xxx. */ int dk3signal_available(void); #ifdef __cplusplus } #endif %% module #include "dk3all.h" $!trace-include #if DK3_HAVE_SIGACTION /** Set new signal disposition. @param signo Signal number of signal to modify. @param fct New signal disposition. @return Previous signal disposition. */ static dk3_signal_disp_t dk3signal_sigaction(int signo, dk3_signal_disp_t fct) { dk3_signal_disp_t back = (dk3_signal_disp_t)SIG_ERR; struct sigaction act, oact; act.sa_handler = fct; sigemptyset(&act.sa_mask); if(signo == SIGALRM) { #ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; #else #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif #endif } if(sigaction(signo, &act, &oact) < 0) { back = (dk3_signal_disp_t)SIG_ERR; } else { back = (dk3_signal_disp_t)oact.sa_handler; } return back; } #endif dk3_signal_disp_t dk3signal_set(int signo, dk3_signal_disp_t fct) { dk3_signal_disp_t back = NULL; #if DK3_HAVE_SIGACTION /* + sigaction */ back = dk3signal_sigaction(signo, fct); /* - sigaction */ #else #if DK3_HAVE_SIGSET /* + sigset */ back = (dk3_signal_disp_t)sigset(signo,fct); /* - sigset */ #else #if DK3_HAVE_SIGNAL /* + signal */ back = (dk3_signal_disp_t)signal(signo,fct); /* - signal */ #else #error "No signal handling functions available" #endif #endif #endif return back; } void dk3signal_refresh(int signo, dk3_signal_disp_t fct) { #if DK3_HAVE_SIGACTION #else #if DK3_HAVE_SIGSET #else #if DK3_HAVE_SIGNAL (void)signal(signo, fct); #else #endif #endif #endif } int dk3signal_available(void) { int back = DK3_SIGNAL_HANDLING_TYPE_NONE; #if DK3_HAVE_SIGACTION back = DK3_SIGNAL_HANDLING_TYPE_SIGACTION; #else #if DK3_HAVE_SIGSET back = DK3_SIGNAL_HANDLING_TYPE_SIGSET; #else #if DK3_HAVE_SIGNAL back = DK3_SIGNAL_HANDLING_TYPE_SIGNAL; #endif #endif #endif return back; } /* vim: set ai sw=2 : */