import qualified Data.ByteString.Lazy.Char8 as L import System.IO import System.Environment import System.Process import System.Exit me :: String me = "loopback" loopBack :: CreateProcess -> IO ProcessHandle loopBack prc = do (Just inp,Just out,_,pid) <- createProcess prc{std_in=CreatePipe,std_out=CreatePipe} hSetBuffering inp LineBuffering mapM_ (hPutLnF inp) . L.split '\n' =<< L.hGetContents out return pid where hPutLnF h x = L.hPut h x >> hPutChar h '\n' usage :: String -> IO a usage msg = hPutStr stderr (unlines ls) >> exitFailure where ls = [msg ,"Usage: "++me++" " ," "++me++" *"] main :: IO () main = do args <- getArgs prc <- case args of [arg] -> return $ shell arg exe:args' -> return $ proc exe args' [] -> usage "Not enough arguments" exitWith =<< waitForProcess =<< loopBack prc