openBinaryTempFile,
) where
-import Control.Exception hiding (bracket)
+import Control.Exception.Base
#ifndef __NHC__
import Data.Bits
import Data.List
import Data.Maybe
import Foreign.C.Error
-import Foreign.C.String
+import Foreign.C.Types
import System.Posix.Internals
#endif
#ifdef __GLASGOW_HASKELL__
-import GHC.IOBase as ExceptionBase
-#endif
-#ifdef __HUGS__
-import Hugs.Exception as ExceptionBase
-#endif
-
-#ifdef __GLASGOW_HASKELL__
import GHC.Base
-import GHC.IOBase -- Together these four Prelude modules define
-import GHC.Handle -- all the stuff exported by IO for the GHC version
-import GHC.IO
-import GHC.Exception
+import GHC.IO hiding ( onException )
+import GHC.IO.IOMode
+import GHC.IO.Handle.FD
+import GHC.IO.Handle
+import GHC.IORef
+import GHC.IO.Exception ( userError )
+-- import GHC.Exception
import GHC.Num
-import GHC.Read
+import Text.Read
import GHC.Show
#endif
import Hugs.IO
import Hugs.IOExts
import Hugs.IORef
-import Hugs.Prelude ( throw, Exception(NonTermination) )
-import Control.Exception ( bracket )
import System.IO.Unsafe ( unsafeInterleaveIO )
#endif
return (filepath, h)
#else
findTempName x = do
- fd <- withCString filepath $ \ f ->
+ fd <- withFilePath filepath $ \ f ->
c_open f oflags 0o600
if fd < 0
then do
-- XXX We want to tell fdToHandle what the filepath is,
-- as any exceptions etc will only be able to report the
-- fd currently
- h <- fdToHandle fd
- `ExceptionBase.catchAny` \e -> do c_close fd; throw e
+ h <- fdToHandle fd `onException` c_close fd
return (filepath, h)
#endif
where
#ifndef __NHC__
-- XXX Copied from GHC.Handle
+std_flags, output_flags, rw_flags :: CInt
std_flags = o_NONBLOCK .|. o_NOCTTY
output_flags = std_flags .|. o_CREAT
-read_flags = std_flags .|. o_RDONLY
-write_flags = output_flags .|. o_WRONLY
rw_flags = output_flags .|. o_RDWR
-append_flags = write_flags .|. o_APPEND
#endif
#ifdef __NHC__
-- It follows that an attempt to write to a file (using 'writeFile', for
-- example) that was earlier opened by 'readFile' will usually result in
-- failure with 'System.IO.Error.isAlreadyInUseError'.
-
--- -----------------------------------------------------------------------------
--- Utils
-
-#ifdef __GLASGOW_HASKELL__
--- Copied here to avoid recursive dependency with Control.Exception
-bracket
- :: IO a -- ^ computation to run first (\"acquire resource\")
- -> (a -> IO b) -- ^ computation to run last (\"release resource\")
- -> (a -> IO c) -- ^ computation to run in-between
- -> IO c -- returns the value from the in-between computation
-bracket before after thing =
- block (do
- a <- before
- r <- catchAny
- (unblock (thing a))
- (\e -> do { after a; throw e })
- after a
- return r
- )
-#endif