summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ProcessUtils.hs39
1 files changed, 38 insertions, 1 deletions
diff --git a/lib/ProcessUtils.hs b/lib/ProcessUtils.hs
index 4e3ac38..49483b5 100644
--- a/lib/ProcessUtils.hs
+++ b/lib/ProcessUtils.hs
@@ -42,4 +42,41 @@ systemEnv vars cmd = do
42 _ <- installHandler sigQUIT old_quit Nothing 42 _ <- installHandler sigQUIT old_quit Nothing
43 return r 43 return r
44 44
45 45-- | readPipe
46--
47-- This is like System.Process.readProcess but instead of a single
48-- command with arguments, you pass it a list which it then executes
49-- piping the the output from the prior command into the input for
50-- the next command. Like readProcess the next parameter is a string
51-- which is sent as input into the initial standard in.
52--
53-- > readPipe [("grep",["HostConfig"]),("wc",["-l"]) =<< readFile "input"
54--
55-- is equivalent to shell code:
56--
57-- > grep HostConfig input | wc -l
58--
59readPipe :: [(FilePath,[String])] -> String -> IO String
60readPipe [(cmd,args)] input = readProcess cmd args input
61readPipe ((cmd,args):xs) stdin0 = do
62 let p = (shell cmd) { std_in = CreatePipe
63 , std_out = CreatePipe
64 , std_err = CreatePipe
65 , cmdspec = RawCommand cmd args
66 }
67 (Just sinh,Just sout,Just serr, ph) <- createProcess p
68 hPutStr sinh stdin0
69 hClose sinh
70 readPipe0 xs sout
71 where
72 readPipe0 :: [(FilePath,[String])] -> Handle -> IO String
73 readPipe0 ((cmd,args):xs) stdin0 = do
74 let p = (shell cmd)
75 { std_in = UseHandle stdin0
76 , std_out = CreatePipe
77 , std_err = CreatePipe
78 , cmdspec = RawCommand cmd args
79 }
80 (Nothing,Just sout,Just serr, ph) <- createProcess p
81 readPipe0 xs sout
82 readPipe0 [] h = hGetContents h