module System.Cmd
( system, -- :: String -> IO ExitCode
#ifdef __GLASGOW_HASKELL__
- rawSystem, -- :: String -> IO ExitCode
+ rawSystem, -- :: FilePath -> [String] -> IO ExitCode
#endif
) where
import Foreign.C
import System.Exit
import GHC.IOBase
+#include "config.h"
#endif
#ifdef __HUGS__
foreign import ccall unsafe "systemCmd" primSystem :: CString -> IO Int
-{- |
-The same as 'system', but bypasses the shell (GHC only).
-Will behave more portably between systems,
-because there is no interpretation of shell metasyntax.
--}
-
-rawSystem :: FilePath -> [String] -> IO ExitCode
-
-#ifndef mingw32_TARGET_OS
-
-rawSystem cmd args =
- withCString cmd $ \pcmd ->
- withMany withCString (cmd:args) $ \cstrs ->
- withArray0 nullPtr cstrs $ \arr -> do
- status <- throwErrnoIfMinus1 "rawSystem" (c_rawSystem pcmd arr)
- case status of
- 0 -> return ExitSuccess
- n -> return (ExitFailure n)
-
-foreign import ccall unsafe "rawSystem"
- c_rawSystem :: CString -> Ptr CString -> IO Int
-
-#else
-
--- On Windows, the command line is passed to the operating system as
--- a single string. Command-line parsing is done by the executable
--- itself.
-rawSystem cmd args = do
- let cmdline = translate cmd ++ concat (map ((' ':) . translate) args)
- withCString cmdline $ \pcmdline -> do
- status <- throwErrnoIfMinus1 "rawSystem" (c_rawSystem pcmdline)
- case status of
- 0 -> return ExitSuccess
- n -> return (ExitFailure n)
-
-translate :: String -> String
-translate str = '"' : foldr escape "\"" str
- where escape '"' str = '\\' : '"' : str
- escape '\\' str = '\\' : '\\' : str
- escape c str = c : str
-
-foreign import ccall unsafe "rawSystem"
- c_rawSystem :: CString -> IO Int
+-- ---------------------------------------------------------------------------
+-- rawSystem
-#endif
+-- rawSystem is in a separate file, so we can #include it various places.
+#include "RawSystem.hs-inc"
#endif /* __GLASGOW_HASKELL__ */