+{-|
+The computation @'rawSystem' cmd args@ runs the operating system command
+@cmd@ in such a way that it receives as arguments the @args@ strings
+exactly as given, with no funny escaping or shell meta-syntax expansion.
+It will therefore behave more portably between operating systems than 'system'.
+
+The return codes and possible failures are the same as for 'system'.
+-}
+rawSystem :: String -> [String] -> IO ExitCode
+#ifdef __GLASGOW_HASKELL__
+rawSystem cmd args = do
+
+#if mingw32_HOST_OS
+ p <- runProcess cmd args Nothing Nothing Nothing Nothing Nothing
+ waitForProcess p
+#else
+ old_int <- installHandler sigINT Ignore Nothing
+ old_quit <- installHandler sigQUIT Ignore Nothing
+ p <- runProcessPosix "rawSystem" cmd args Nothing Nothing
+ Nothing Nothing Nothing
+ (Just defaultSignal) (Just defaultSignal)
+ r <- waitForProcess p
+ installHandler sigINT old_int Nothing
+ installHandler sigQUIT old_quit Nothing
+ return r
+#endif
+
+#else /* ! __GLASGOW_HASKELL__ */
+-- crude fallback implementation: could do much better than this under Unix
+rawSystem cmd args = system (unwords (map translate (cmd:args)))