module System.Signal where
import Foreign.C.Types
#ifdef mingw32_HOST_OS
import Control.Exception.Base (assert)
import Foreign
#else
import Control.Monad (void)
import qualified System.Posix.Signals as Posix
#endif
type Signal = CInt
sigABRT :: Signal
sigABRT = 6
sigFPE :: Signal
sigFPE = 8
sigILL :: Signal
sigILL = 4
sigINT :: Signal
sigINT = 2
sigSEGV :: Signal
sigSEGV = 11
sigTERM :: Signal
sigTERM = 15
type Handler = Signal -> IO ()
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 = void $ Posix.installHandler signal (Posix.CatchInfo (handler . Posix.siginfoSignal)) Nothing
#endif