1db7d27a45
Make Utility.Process wrap the parts of System.Process that I use, and add debug logging to them. Also wrote some higher-level code that allows running an action with handles to a processes stdin or stdout (or both), and checking its exit status, all in a single function call. As a bonus, the debug logging now indicates whether the process is being run to read from it, feed it data, chat with it (writing and reading), or just call it for its side effect.
35 lines
846 B
Haskell
35 lines
846 B
Haskell
{- Interface for running a shell command as a coprocess,
|
|
- sending it queries and getting back results.
|
|
-
|
|
- Copyright 2012 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Utility.CoProcess (
|
|
CoProcessHandle,
|
|
start,
|
|
stop,
|
|
query
|
|
) where
|
|
|
|
import Common
|
|
|
|
type CoProcessHandle = (ProcessHandle, Handle, Handle, CreateProcess)
|
|
|
|
start :: FilePath -> [String] -> IO CoProcessHandle
|
|
start command params = do
|
|
(from, to, _err, pid) <- runInteractiveProcess command params Nothing Nothing
|
|
return (pid, to, from, proc command params)
|
|
|
|
stop :: CoProcessHandle -> IO ()
|
|
stop (pid, from, to, p) = do
|
|
hClose to
|
|
hClose from
|
|
forceSuccessProcess p pid
|
|
|
|
query :: CoProcessHandle -> (Handle -> IO a) -> (Handle -> IO b) -> IO b
|
|
query (_, from, to, _) send receive = do
|
|
_ <- send to
|
|
hFlush to
|
|
receive from
|