hxt-7.1: src/System/PipeOpen.hs
-- ------------------------------------------------------------
{- |
Module : System.PipeOpen
Copyright : Copyright (C) 2005 Uwe Schmidt
License : MIT
Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
Stability : experimental
Portability: none portable
Version : $Id: PipeOpen.hs,v 1.2 2005/09/02 17:09:39 hxml Exp $
pipe open implemented with System.Process functions
-}
-- ------------------------------------------------------------
module System.PipeOpen
( popen )
where
import IO
( hGetContents
, hClose
)
import System.Exit
( ExitCode(..)
)
import System.Process
( runInteractiveProcess
, waitForProcess
)
-- | call an external program with a list of command line arguments
-- and return content of stdout, content of stderr and return code
popen :: String -> [String] -> IO (String, String, Int)
popen prg argl
= do
(inpH, outH, errH, pH) <- runInteractiveProcess prg argl Nothing Nothing
hClose inpH
res <- hGetContents outH
errs <- hGetContents errH
-- hack: stdout and stderr must be read completely, otherwise waitForProcess blocks
if (length res == 0) then return () else return ()
if (length errs == 0) then return () else return ()
rc <- waitForProcess pH
return ( res
, errs
, case rc of
ExitSuccess -> 0
ExitFailure i -> i
)
-- eof ------------------------------------------------------------