summaryrefslogtreecommitdiff
path: root/libraries/base/System/IO.hs
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-01-20 21:18:30 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-01-20 21:18:30 +0000
commita9db92b53103f517a248fce15c7493011ea7f5c3 (patch)
treee9ac0b64030d7f0ed5b65173132f5f7dd3036d53 /libraries/base/System/IO.hs
parent0dd5adec75498de260d2bfefa94284586563ee70 (diff)
downloadhaskell-a9db92b53103f517a248fce15c7493011ea7f5c3.tar.gz
fix #3832: use the locale encoding in openTempFile
Also while I was here fix an XXX: the Handle contained an uninformative string like <fd: 4> for error messages rather than the real file path.
Diffstat (limited to 'libraries/base/System/IO.hs')
-rw-r--r--libraries/base/System/IO.hs20
1 files changed, 15 insertions, 5 deletions
diff --git a/libraries/base/System/IO.hs b/libraries/base/System/IO.hs
index 6a6efa20d4..248af319fc 100644
--- a/libraries/base/System/IO.hs
+++ b/libraries/base/System/IO.hs
@@ -234,9 +234,11 @@ import System.Posix.Types
#ifdef __GLASGOW_HASKELL__
import GHC.Base
+import GHC.Real
import GHC.IO hiding ( onException )
import GHC.IO.IOMode
import GHC.IO.Handle.FD
+import qualified GHC.IO.FD as FD
import GHC.IO.Handle
import GHC.IORef
import GHC.IO.Exception ( userError )
@@ -545,10 +547,10 @@ openTempFile' loc tmp_dir template binary mode = do
oflags = oflags1 .|. binary_flags
#endif
-#ifdef __NHC__
+#if defined(__NHC__)
findTempName x = do h <- openFile filepath ReadWriteMode
return (filepath, h)
-#else
+#elif defined(__GLASGOW_HASKELL__)
findTempName x = do
fd <- withFilePath filepath $ \ f ->
c_open f oflags mode
@@ -559,12 +561,20 @@ openTempFile' loc tmp_dir template binary mode = do
then findTempName (x+1)
else ioError (errnoToIOError loc errno Nothing (Just tmp_dir))
else do
- -- XXX We want to tell fdToHandle what the filepath is,
- -- as any exceptions etc will only be able to report the
- -- fd currently
+
+ (fD,fd_type) <- FD.mkFD (fromIntegral fd) ReadWriteMode Nothing{-no stat-}
+ False{-is_socket-}
+ True{-is_nonblock-}
+
+ h <- mkHandleFromFD fD fd_type filepath ReadWriteMode False{-set non-block-}
+ (Just localeEncoding)
+
+ return (filepath, h)
+#else
h <- fdToHandle fd `onException` c_close fd
return (filepath, h)
#endif
+
where
filename = prefix ++ show x ++ suffix
filepath = tmp_dir `combine` filename