unbreak previous patch for nhc98
[haskell-directory.git] / System / Directory.hs
index e7affb6..d1cf495 100644 (file)
@@ -70,6 +70,7 @@ import Prelude hiding ( catch )
 
 import System.Environment      ( getEnv )
 import System.FilePath
+import System.IO
 import System.IO.Error hiding ( catch, try )
 import Control.Monad           ( when, unless )
 import Control.Exception
@@ -92,7 +93,6 @@ import Foreign.C
 import System.Posix.Types
 import System.Posix.Internals
 import System.Time             ( ClockTime(..) )
-import System.IO
 
 import GHC.IOBase      ( IOException(..), IOErrorType(..), ioException )
 
@@ -101,7 +101,7 @@ A directory contains a series of entries, each of which is a named
 reference to a file system object (file, directory etc.).  Some
 entries may be hidden, inaccessible, or have some administrative
 function (e.g. `.' or `..' under POSIX
-<http://www.opengroup.org/onlinepubs/007904975/toc.htm>), but in 
+<http://www.opengroup.org/onlinepubs/009695399/>), but in 
 this standard all such entries are considered to form part of the
 directory contents. Entries in sub-directories are not, however,
 considered to form part of the directory contents.
@@ -553,7 +553,7 @@ copyFile fromFPath toFPath =
                  bracketOnError openTmp cleanTmp $ \(tmpFPath, hTmp) ->
                  do allocaBytes bufferSize $ copyContents hFrom hTmp
                     hClose hTmp
-                    try (copyPermissions fromFPath toFPath)
+                    try (copyPermissions fromFPath tmpFPath)
                     renameFile tmpFPath toFPath
           openTmp = openBinaryTempFile (takeDirectory toFPath) ".copyFile.tmp"
           cleanTmp (tmpFPath, hTmp) = do try $ hClose hTmp
@@ -584,7 +584,9 @@ canonicalizePath fpath =
 #else
     do c_realpath pInPath pOutPath
 #endif
-       peekCString pOutPath
+       path <- peekCString pOutPath
+       return (normalise path)
+        -- normalise does more stuff, like upper-casing the drive letter
 
 #if defined(mingw32_HOST_OS)
 foreign import stdcall unsafe "GetFullPathNameA"
@@ -1025,7 +1027,14 @@ getTemporaryDirectory = do
      r <- c_GetTempPath (fromIntegral long_path_size) pPath
      peekCString pPath
 #else
-  catch (getEnv "TMPDIR") (\ex -> return "/tmp")
+  getEnv "TMPDIR"
+#if !__NHC__
+    `catch` \ex -> case ex of
+                     IOException e | isDoesNotExistError e -> return "/tmp"
+                     _ -> throw ex
+#else
+    `catch` (\ex -> return "/tmp")
+#endif
 #endif
 
 #if defined(mingw32_HOST_OS)