summaryrefslogtreecommitdiff
path: root/src/compiler/GF/System/Process.hs
blob: 415f8a50a83763d45cc22fd6eb75e88e950d6694 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module GF.System.Process where
import System.Process
import System.IO(hGetContents,hClose,hPutStr)
import Control.Concurrent(forkIO)
import GF.System.Catch(try)

-- | Feed some input to a shell process and read the output lazily
readShellProcess :: String     -- ^ shell command
                  -> String    -- ^ input to shell command
                  -> IO String -- ^ output from shell command
readShellProcess cmd input =
  do (Just stdin,Just stdout,Nothing,ph) <-
         createProcess (shell cmd){std_in=CreatePipe,std_out=CreatePipe}
     forkIO $ do try $ hPutStr stdin input
                 try $ hClose stdin
                 waitForProcess ph
                 return ()
     hGetContents stdout