packages feed

hat-2.7.0.0: tools/Run.hs

module Run
  ( runAndReadStdout
  , tmpfile
  ) where

import System.Directory (removeFile)
import System.Cmd       (system)
import System.Exit      (ExitCode(..))
import System.IO.Unsafe (unsafePerformIO)

-- #ifdef __HBC__
-- import UnsafePerformIO
-- #ifdef __HASKELL98__
-- import GetPid
-- getProcessID = getPid
-- #else
-- getProcessID = return 3154      -- arbitrary number
-- #endif
-- #endif
-- #ifdef __NHC__
-- import FFIExtensions (unsafePerformIO)
-- foreign import ccall "getpid" getProcessID :: IO Int
-- #endif
-- #ifdef __GLASGOW_HASKELL__
-- import FFIExtensions (unsafePerformIO)
-- foreign import ccall "getpid" getProcessID :: IO Int
-- #endif
foreign import ccall "getpid" getProcessID :: IO Int

-- Generate a temporary filename unique to this process.
tmpfile :: String -> String
tmpfile root = unsafePerformIO $ do p <- getProcessID
                                    return ("/tmp/"++root++"."++show p)

-- Run a shell command and collect its output.
runAndReadStdout :: String -> IO String
runAndReadStdout cmd = do
    let output = tmpfile "hmakeconfig"
    err <- system (cmd++" >"++output)
    case err of
        ExitFailure _ -> ioError (userError ("Command ("++cmd++") failed"))
        _ -> return ()
    s <- readFile output
    removeFile output   -- file will not be removed until readFile closes it
    return (safeinit s) -- strip trailing newline added by shell
  where
    safeinit []     = []
    safeinit ['\n'] = []
    safeinit [x]    = [x]
    safeinit (x:xs) = x : safeinit xs