diff --git a/src/compiler/GF/Command/Commands.hs b/src/compiler/GF/Command/Commands.hs index 0d1b9695a..44d514a2f 100644 --- a/src/compiler/GF/Command/Commands.hs +++ b/src/compiler/GF/Command/Commands.hs @@ -46,6 +46,7 @@ import Data.List(intersperse,nub) import Data.Maybe import qualified Data.Map as Map --import System.Cmd(system) -- use GF.Infra.UseIO.restricedSystem instead! +import GF.System.Process import Text.PrettyPrint import Data.List (sort) --import Debug.Trace @@ -866,12 +867,15 @@ allCommands = Map.fromList [ synopsis = "send argument to a system command", syntax = "sp -command=\"SYSTEMCOMMAND\", alt. ? SYSTEMCOMMAND", exec = \_ opts arg -> do + let syst = optComm opts -- ++ " " ++ tmpi + {- let tmpi = "_tmpi" --- let tmpo = "_tmpo" restricted $ writeFile tmpi $ toString arg - let syst = optComm opts -- ++ " " ++ tmpi restrictedSystem $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo fmap fromString $ restricted $ readFile tmpo, + -} + fmap fromString . restricted . readShellProcess syst $ toString arg, flags = [ ("command","the system command applied to the argument") ], diff --git a/src/compiler/GF/System/Process.hs b/src/compiler/GF/System/Process.hs new file mode 100644 index 000000000..415f8a50a --- /dev/null +++ b/src/compiler/GF/System/Process.hs @@ -0,0 +1,18 @@ +module GF.System.Process where +import System.Process +import System.IO(hGetContents,hClose,hPutStr) +import Control.Concurrent(forkIO) +import GF.System.Catch(try) + +-- | Feed some input to a shell process and read the output lazily +readShellProcess :: String -- ^ shell command + -> String -- ^ input to shell command + -> IO String -- ^ output from shell command +readShellProcess cmd input = + do (Just stdin,Just stdout,Nothing,ph) <- + createProcess (shell cmd){std_in=CreatePipe,std_out=CreatePipe} + forkIO $ do try $ hPutStr stdin input + try $ hClose stdin + waitForProcess ph + return () + hGetContents stdout