    {-# LINE 1 "libraries/unix/System/Posix/Process.hsc" #-}
    {-# LANGUAGE Safe #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  System.Posix.Process
    -- Copyright   :  (c) The University of Glasgow 2002
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  provisional
    -- Portability :  non-portable (requires POSIX)
    --
    -- POSIX process support.  See also the System.Cmd and System.Process
    -- modules in the process package.
    --
    -----------------------------------------------------------------------------

    module System.Posix.Process (
        -- * Processes

        -- ** Forking and executing
        forkProcess,
        forkProcessWithUnmask,
        executeFile,

        -- ** Exiting
        exitImmediately,

        -- ** Process environment
        getProcessID,
        getParentProcessID,

        -- ** Process groups
        getProcessGroupID,
        getProcessGroupIDOf,
        createProcessGroupFor,
        joinProcessGroup,
        setProcessGroupIDOf,

        -- ** Sessions
        createSession,

        -- ** Process times
        ProcessTimes(..),
        getProcessTimes,

        -- ** Scheduling priority
        nice,
        getProcessPriority,
        getProcessGroupPriority,
        getUserPriority,
        setProcessPriority,
        setProcessGroupPriority,
        setUserPriority,

        -- ** Process status
        ProcessStatus(..),
        getProcessStatus,
        getAnyProcessStatus,
        getGroupProcessStatus,

        -- ** Deprecated
        createProcessGroup,
        setProcessGroupID,

     ) where

    import Foreign
    import Foreign.C
    import System.Posix.Process.Internals
    import System.Posix.Process.Common
    import System.Posix.Internals ( withFilePath )

    {-# LINE 79 "libraries/unix/System/Posix/Process.hsc" #-}

    -- | @'executeFile' cmd args env@ calls one of the
    --   @execv*@ family, depending on whether or not the current
    --   PATH is to be searched for the command, and whether or not an
    --   environment is provided to supersede the process's current
    --   environment.  The basename (leading directory names suppressed) of
    --   the command is passed to @execv*@ as @arg[0]@;
    --   the argument list passed to 'executeFile' therefore
    --   begins with @arg[1]@.
    executeFile :: FilePath                     -- ^ Command
                -> Bool                         -- ^ Search PATH?
                -> [String]                     -- ^ Arguments
                -> Maybe [(String, String)]     -- ^ Environment
                -> IO a

    {-# LINE 100 "libraries/unix/System/Posix/Process.hsc" #-}

    executeFile :: forall a.
    FilePath
    -> Bool -> [FilePath] -> Maybe [(FilePath, FilePath)] -> IO a
    executeFile FilePath
    path Bool
    search [FilePath]
    args Maybe [(FilePath, FilePath)]
    Nothing = do
      FilePath -> (Ptr CChar -> IO a) -> IO a
    forall a. FilePath -> (Ptr CChar -> IO a) -> IO a
    withFilePath FilePath
    path ((Ptr CChar -> IO a) -> IO a) -> (Ptr CChar -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \Ptr CChar
    s ->
        (FilePath -> (Ptr CChar -> IO a) -> IO a)
    -> [FilePath] -> ([Ptr CChar] -> IO a) -> IO a
    forall a b res.
    (a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
    withMany FilePath -> (Ptr CChar -> IO a) -> IO a
    forall a. FilePath -> (Ptr CChar -> IO a) -> IO a
    withFilePath (FilePath
    pathFilePath -> [FilePath] -> [FilePath]
    forall a. a -> [a] -> [a]
    :[FilePath]
    args) (([Ptr CChar] -> IO a) -> IO a) -> ([Ptr CChar] -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \[Ptr CChar]
    cstrs ->
          Ptr CChar -> [Ptr CChar] -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b
    withArray0 Ptr CChar
    forall a. Ptr a
    nullPtr [Ptr CChar]
    cstrs ((Ptr (Ptr CChar) -> IO a) -> IO a)
    -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \Ptr (Ptr CChar)
    arr -> do
            IO ()
    pPrPr_disableITimers
            if Bool
    search
               then FilePath -> FilePath -> IO CInt -> IO ()
    forall a. (Eq a, Num a) => FilePath -> FilePath -> IO a -> IO ()
    throwErrnoPathIfMinus1_ FilePath
    "executeFile" FilePath
    path (Ptr CChar -> Ptr (Ptr CChar) -> IO CInt
    c_execvp Ptr CChar
    s Ptr (Ptr CChar)
    arr)
               else FilePath -> FilePath -> IO CInt -> IO ()
    forall a. (Eq a, Num a) => FilePath -> FilePath -> IO a -> IO ()
    throwErrnoPathIfMinus1_ FilePath
    "executeFile" FilePath
    path (Ptr CChar -> Ptr (Ptr CChar) -> IO CInt
    c_execv Ptr CChar
    s Ptr (Ptr CChar)
    arr)
            a -> IO a
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return a
    forall a. HasCallStack => a
    undefined -- never reached

    executeFile FilePath
    path Bool
    search [FilePath]
    args (Just [(FilePath, FilePath)]
    env) = do
      FilePath -> (Ptr CChar -> IO a) -> IO a
    forall a. FilePath -> (Ptr CChar -> IO a) -> IO a
    withFilePath FilePath
    path ((Ptr CChar -> IO a) -> IO a) -> (Ptr CChar -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \Ptr CChar
    s ->
        (FilePath -> (Ptr CChar -> IO a) -> IO a)
    -> [FilePath] -> ([Ptr CChar] -> IO a) -> IO a
    forall a b res.
    (a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
    withMany FilePath -> (Ptr CChar -> IO a) -> IO a
    forall a. FilePath -> (Ptr CChar -> IO a) -> IO a
    withFilePath (FilePath
    pathFilePath -> [FilePath] -> [FilePath]
    forall a. a -> [a] -> [a]
    :[FilePath]
    args) (([Ptr CChar] -> IO a) -> IO a) -> ([Ptr CChar] -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \[Ptr CChar]
    cstrs ->
          Ptr CChar -> [Ptr CChar] -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b
    withArray0 Ptr CChar
    forall a. Ptr a
    nullPtr [Ptr CChar]
    cstrs ((Ptr (Ptr CChar) -> IO a) -> IO a)
    -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \Ptr (Ptr CChar)
    arg_arr ->
        let env' :: [FilePath]
    env' = ((FilePath, FilePath) -> FilePath)
    -> [(FilePath, FilePath)] -> [FilePath]
    forall a b. (a -> b) -> [a] -> [b]
    map (\ (FilePath
    name, FilePath
    val) -> FilePath
    name FilePath -> FilePath -> FilePath
    forall a. [a] -> [a] -> [a]
    ++ (Char
    '=' Char -> FilePath -> FilePath
    forall a. a -> [a] -> [a]
    : FilePath
    val)) [(FilePath, FilePath)]
    env in
        (FilePath -> (Ptr CChar -> IO a) -> IO a)
    -> [FilePath] -> ([Ptr CChar] -> IO a) -> IO a
    forall a b res.
    (a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
    withMany FilePath -> (Ptr CChar -> IO a) -> IO a
    forall a. FilePath -> (Ptr CChar -> IO a) -> IO a
    withFilePath [FilePath]
    env' (([Ptr CChar] -> IO a) -> IO a) -> ([Ptr CChar] -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \[Ptr CChar]
    cenv ->
          Ptr CChar -> [Ptr CChar] -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b
    withArray0 Ptr CChar
    forall a. Ptr a
    nullPtr [Ptr CChar]
    cenv ((Ptr (Ptr CChar) -> IO a) -> IO a)
    -> (Ptr (Ptr CChar) -> IO a) -> IO a
    forall a b. (a -> b) -> a -> b
    $ \Ptr (Ptr CChar)
    env_arr -> do
            IO ()
    pPrPr_disableITimers
            if Bool
    search
               then FilePath -> FilePath -> IO CInt -> IO ()
    forall a. (Eq a, Num a) => FilePath -> FilePath -> IO a -> IO ()
    throwErrnoPathIfMinus1_ FilePath
    "executeFile" FilePath
    path
                       (Ptr CChar -> Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> IO CInt
    c_execvpe Ptr CChar
    s Ptr (Ptr CChar)
    arg_arr Ptr (Ptr CChar)
    env_arr)
               else FilePath -> FilePath -> IO CInt -> IO ()
    forall a. (Eq a, Num a) => FilePath -> FilePath -> IO a -> IO ()
    throwErrnoPathIfMinus1_ FilePath
    "executeFile" FilePath
    path
                       (Ptr CChar -> Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> IO CInt
    c_execve Ptr CChar
    s Ptr (Ptr CChar)
    arg_arr Ptr (Ptr CChar)
    env_arr)
            a -> IO a
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return a
    forall a. HasCallStack => a
    undefined -- never reached

    foreign import ccall unsafe "execvp"
      c_execvp :: CString -> Ptr CString -> IO CInt

    foreign import ccall unsafe "execv"
      c_execv :: CString -> Ptr CString -> IO CInt

    foreign import ccall unsafe "execve"
      c_execve :: CString -> Ptr CString -> Ptr CString -> IO CInt

    {-# LINE 136 "libraries/unix/System/Posix/Process.hsc" #-}