[Haskell-cafe] catting to cat gets stuck at > 135K

Jason Dusek jason.dusek at gmail.com
Mon Nov 10 20:49:21 EST 2008

  This does not work either. It should cover all the bases,
  right? Fork off input, pull things from ouput as they are
  ready, stop when we reach end of file. If you remove the line
  `print partial`, the program loops forever; if you keep it,
  the program stops right there.


import Data.ByteString.Lazy hiding (putStrLn)
import System.Process
import System.Environment
import System.IO (putStrLn, hClose, hWaitForInput)
import System.IO.Error
import Control.Concurrent
import Prelude hiding (writeFile, readFile)

main                         =  do
  exe:file:_                <-  getArgs
  bytes                     <-  readFile file
  foo                       <-  simple exe bytes []
  writeFile (file ++ ".foo") foo

 -- Manufactures a simple stream handler from a command line utility.
 :: String -> ByteString -> [String] -> IO ByteString
simple exe bytes args        =  do
  (i, o, e, p)              <-  runInteractiveProcess exe args Nothing Nothing
  pushAndPull i o bytes

pushAndPull i o bytes        =  do
  putStrLn "Working with:"
  print bytes
  forkIO $ hPut i bytes
  putStrLn "forked"
  readUntilDone empty
  readUntilDone soFar        =  do
    (const $ return soFar) `hctac` do
      putStrLn "hctac"
      hWaitForInput o 0     --  Wait as long as it takes.
      putStrLn "waited"
      partial               <-  hGetContents o
      putStrLn "contents:"
      print partial
      readUntilDone $ append soFar partial
    hctac                    =  flip catch

More information about the Haskell-Cafe mailing list