-----------------------------------------------------------------------------
module System.Cmd
- ( system -- :: String -> IO ExitCode
+ ( system, -- :: String -> IO ExitCode
+#ifndef __HUGS__
+ rawSystem, -- :: String -> IO ExitCode
+#endif
) where
import Prelude
import System.Exit
+#ifndef __HUGS__
import Foreign.C
+#endif
#ifdef __GLASGOW_HASKELL__
import GHC.IOBase
#endif
+#ifdef __HUGS__
+import Hugs.System
+#endif
+
-- ---------------------------------------------------------------------------
-- system
passes the command to the Windows command interpreter (@CMD.EXE@ or
@COMMAND.COM@), hence Unixy shell tricks will not work.
-}
+#ifndef __HUGS__
system :: String -> IO ExitCode
system "" = ioException (IOError Nothing InvalidArgument "system" "null command" Nothing)
system cmd =
n -> return (ExitFailure n)
foreign import ccall unsafe "systemCmd" primSystem :: CString -> IO Int
+
+{- |
+The same as 'system', but bypasses the shell. Will behave more portably between
+systems, because there is no interpretation of shell metasyntax.
+-}
+
+rawSystem :: String -> IO ExitCode
+rawSystem "" = ioException (IOError Nothing InvalidArgument "rawSystem" "null command" Nothing)
+rawSystem cmd =
+ withCString cmd $ \s -> do
+ status <- throwErrnoIfMinus1 "rawSystem" (primRawSystem s)
+ case status of
+ 0 -> return ExitSuccess
+ n -> return (ExitFailure n)
+
+foreign import ccall unsafe "rawSystemCmd" primRawSystem :: CString -> IO Int
+
+#endif /* __HUGS__ */