{-# LANGUAGE CApiFFI #-} {-# LANGUAGE Trustworthy #-} module System.Posix.Process.Internals ( pPrPr_disableITimers, c_execvpe, decipherWaitStatus, ProcessStatus(..) ) where import Foreign import Foreign.C import System.Exit import System.IO.Error import GHC.Conc (Signal) -- | The exit status of a process data ProcessStatus = Exited ExitCode -- ^ the process exited by calling -- @exit()@ or returning from @main@ | Terminated Signal Bool -- ^ the process was terminated by a -- signal, the @Bool@ is @True@ if a core -- dump was produced -- -- @since 2.7.0.0 | Stopped Signal -- ^ the process was stopped by a signal deriving (Eq, Ord, Show) -- this function disables the itimer, which would otherwise cause confusing -- signals to be sent to the new process. foreign import capi unsafe "Rts.h stopTimer" pPrPr_disableITimers :: IO () foreign import ccall unsafe "__hsunix_execvpe" c_execvpe :: CString -> Ptr CString -> Ptr CString -> IO CInt decipherWaitStatus :: CInt -> IO ProcessStatus decipherWaitStatus wstat = if c_WIFEXITED wstat /= 0 then do let exitstatus = c_WEXITSTATUS wstat if exitstatus == 0 then return (Exited ExitSuccess) else return (Exited (ExitFailure (fromIntegral exitstatus))) else do if c_WIFSIGNALED wstat /= 0 then do let termsig = c_WTERMSIG wstat let coredumped = c_WCOREDUMP wstat /= 0 return (Terminated termsig coredumped) else do if c_WIFSTOPPED wstat /= 0 then do let stopsig = c_WSTOPSIG wstat return (Stopped stopsig) else do ioError (mkIOError illegalOperationErrorType "waitStatus" Nothing Nothing) foreign import capi unsafe "HsUnix.h WIFEXITED" c_WIFEXITED :: CInt -> CInt foreign import capi unsafe "HsUnix.h WEXITSTATUS" c_WEXITSTATUS :: CInt -> CInt foreign import capi unsafe "HsUnix.h WIFSIGNALED" c_WIFSIGNALED :: CInt -> CInt foreign import capi unsafe "HsUnix.h WTERMSIG" c_WTERMSIG :: CInt -> CInt foreign import capi unsafe "HsUnix.h WIFSTOPPED" c_WIFSTOPPED :: CInt -> CInt foreign import capi unsafe "HsUnix.h WSTOPSIG" c_WSTOPSIG :: CInt -> CInt foreign import capi unsafe "HsUnix.h WCOREDUMP" c_WCOREDUMP :: CInt -> CInt