X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FCmd.hs;h=ceb0bbe53d33106b46a2e15b4d14242bf49a3b20;hb=b6cbe4e36af5a486678e4622839dcef2aa487cc7;hp=6a47db05541b9addfc9178db190161e274aebf64;hpb=9fa9bc17072a58c0bae2cce4764d38677e96ac29;p=ghc-base.git diff --git a/System/Cmd.hs b/System/Cmd.hs index 6a47db0..ceb0bbe 100644 --- a/System/Cmd.hs +++ b/System/Cmd.hs @@ -2,52 +2,71 @@ -- | -- Module : System.Cmd -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : portable -- --- $Id: Cmd.hs,v 1.3 2002/04/24 16:31:45 simonmar Exp $ --- --- Executing a command. +-- Executing an external command. -- ----------------------------------------------------------------------------- module System.Cmd - ( system -- :: String -> IO ExitCode + ( system, -- :: String -> IO ExitCode +#ifdef __GLASGOW_HASKELL__ + rawSystem, -- :: FilePath -> [String] -> IO ExitCode +#endif ) where import Prelude -import System.Exit -import Foreign.C - #ifdef __GLASGOW_HASKELL__ -import GHC.IOBase +import System.Process +import System.Exit ( ExitCode ) +import GHC.IOBase ( ioException, IOException(..), IOErrorType(..) ) +#endif + +#ifdef __HUGS__ +import Hugs.System +#endif + +#ifdef __NHC__ +import System (system) #endif -- --------------------------------------------------------------------------- -- system --- Computation `system cmd' returns the exit code --- produced when the operating system processes the command `cmd'. +{-| +Computation @system cmd@ returns the exit code +produced when the operating system processes the command @cmd@. + +This computation may fail with + + * @PermissionDenied@: The process has insufficient privileges to + perform the operation. --- This computation may fail with --- PermissionDenied --- The process has insufficient privileges to perform the operation. --- ResourceExhausted --- Insufficient resources are available to perform the operation. --- UnsupportedOperation --- The implementation does not support system calls. + * @ResourceExhausted@: Insufficient resources are available to + perform the operation. + * @UnsupportedOperation@: The implementation does not support + system calls. + +On Windows, 'system' is implemented using Windows's native system +call, which ignores the @SHELL@ environment variable, and always +passes the command to the Windows command interpreter (@CMD.EXE@ or +@COMMAND.COM@), hence Unixy shell tricks will not work. +-} +#ifdef __GLASGOW_HASKELL__ system :: String -> IO ExitCode system "" = ioException (IOError Nothing InvalidArgument "system" "null command" Nothing) -system cmd = - withCString cmd $ \s -> do - status <- throwErrnoIfMinus1 "system" (primSystem s) - case status of - 0 -> return ExitSuccess - n -> return (ExitFailure n) - -foreign import ccall unsafe "systemCmd" primSystem :: CString -> IO Int +system cmd = do + p <- runCommand cmd + waitForProcess p + +rawSystem :: String -> [String] -> IO ExitCode +rawSystem cmd args = do + p <- runProcess cmd args Nothing Nothing Nothing Nothing Nothing + waitForProcess p +#endif /* __GLASGOW_HASKELL__ */