{-# LANGUAGE CPP #-} module Test.Sandwich.Signals ( installHandler , sigINT , sigTERM ) where import Foreign.C.Types #ifdef mingw32_HOST_OS import Control.Exception.Base (assert) import Foreign #else import Control.Monad import qualified System.Posix.Signals as Posix #endif type Signal = CInt type Handler = Signal -> IO () sigINT :: Signal sigINT :: Signal sigINT = Signal 2 sigTERM :: Signal sigTERM :: Signal sigTERM = Signal 15 installHandler :: Signal -> Handler -> IO () #ifdef mingw32_HOST_OS foreign import ccall "wrapper" genHandler:: Handler -> IO (FunPtr Handler) foreign import ccall safe "signal.h signal" install:: Signal -> FunPtr Handler -> IO Signal installHandler signal handler = do result <- install signal =<< genHandler handler return $ assert (result == 0) () #else installHandler :: Signal -> Handler -> IO () installHandler Signal signal Handler handler = forall (f :: * -> *) a. Functor f => f a -> f () void forall a b. (a -> b) -> a -> b $ Signal -> Handler -> Maybe SignalSet -> IO Handler Posix.installHandler Signal signal ((SignalInfo -> IO ()) -> Handler Posix.CatchInfo (Handler handler forall b c a. (b -> c) -> (a -> b) -> a -> c . SignalInfo -> Signal Posix.siginfoSignal)) forall a. Maybe a Nothing #endif