From f0e474ceb9ee3d9f2e5355f88ad1c73187c68e88 Mon Sep 17 00:00:00 2001 From: Robin Windels Date: Sat, 12 Jan 2013 21:14:21 -0800 Subject: a unixFilter for non Posix (well windows) Conflicts: src/Hakyll/Core/UnixFilter.hs --- src/Hakyll.hs | 4 ---- src/Hakyll/Core/UnixFilter.hs | 31 ++++++++----------------------- 2 files changed, 8 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/Hakyll.hs b/src/Hakyll.hs index 90b56f9..3d7fb91 100644 --- a/src/Hakyll.hs +++ b/src/Hakyll.hs @@ -11,9 +11,7 @@ module Hakyll , module Hakyll.Core.Metadata , module Hakyll.Core.Routes , module Hakyll.Core.Rules -#ifdef UNIX_FILTER , module Hakyll.Core.UnixFilter -#endif , module Hakyll.Core.Util.File , module Hakyll.Core.Util.String , module Hakyll.Core.Writable @@ -43,9 +41,7 @@ import Hakyll.Core.Item import Hakyll.Core.Metadata import Hakyll.Core.Routes import Hakyll.Core.Rules -#ifdef UNIX_FILTER import Hakyll.Core.UnixFilter -#endif import Hakyll.Core.Util.File import Hakyll.Core.Util.String import Hakyll.Core.Writable diff --git a/src/Hakyll/Core/UnixFilter.hs b/src/Hakyll/Core/UnixFilter.hs index dbc5e95..2a2f394 100644 --- a/src/Hakyll/Core/UnixFilter.hs +++ b/src/Hakyll/Core/UnixFilter.hs @@ -12,9 +12,7 @@ import Data.ByteString.Lazy (ByteString) import qualified Data.ByteString.Lazy as LB import System.IO (Handle, hClose, hGetContents, hPutStr, hSetEncoding, localeEncoding) -import System.Posix.IO (closeFd, createPipe, dupTo, fdToHandle, - stdInput, stdOutput) -import System.Posix.Process (executeFile, forkProcess) +import System.Process -------------------------------------------------------------------------------- @@ -89,32 +87,19 @@ unixFilterIO :: (Handle -> i -> IO ()) -> i -> IO o unixFilterIO writer reader programName args input = do - -- Create pipes - (stdinRead, stdinWrite) <- createPipe - (stdoutRead, stdoutWrite) <- createPipe + let process = (proc programName args) + { std_in = CreatePipe + , std_out = CreatePipe + , close_fds = True + } - -- Fork the child - _ <- forkProcess $ do - -- Copy our pipes over the regular stdin/stdout - _ <- dupTo stdinRead stdInput - _ <- dupTo stdoutWrite stdOutput - - -- Close the now unneeded file descriptors in the child - mapM_ closeFd [stdinWrite, stdoutRead, stdinRead, stdoutWrite] - - -- Execute the program - _ <- executeFile programName True args Nothing - return () - - -- On the parent side, close the client-side FDs. - mapM_ closeFd [stdinRead, stdoutWrite] + (Just stdinWriteHandle, Just stdoutReadHandle, _, _) <- + createProcess process -- Write the input to the child pipe _ <- forkIO $ do - stdinWriteHandle <- fdToHandle stdinWrite writer stdinWriteHandle input hClose stdinWriteHandle -- Receive the output from the child - stdoutReadHandle <- fdToHandle stdoutRead reader stdoutReadHandle -- cgit v1.2.3