[project @ 2002-07-15 16:15:14 by simonmar]
[haskell-directory.git] / System / Directory.hs
index b860958..9dffd0f 100644 (file)
@@ -2,14 +2,12 @@
 -- |
 -- Module      :  System.Directory
 -- 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: Directory.hs,v 1.3 2002/04/24 16:31:45 simonmar Exp $
---
 -- System-independent interface to directory manipulation.
 --
 -----------------------------------------------------------------------------
@@ -37,7 +35,7 @@ module System.Directory
        writable,               -- :: Permissions -> Bool
        executable,             -- :: Permissions -> Bool
        searchable              -- :: Permissions -> Bool
-     ),
+     )
 
     , createDirectory          -- :: FilePath -> IO ()
     , removeDirectory          -- :: FilePath -> IO ()
@@ -335,19 +333,23 @@ The path refers to an existing non-directory object.
 
 getDirectoryContents :: FilePath -> IO [FilePath]
 getDirectoryContents path = do
-   alloca $ \ ptr_dEnt -> do
-    p <- withCString path $ \s ->
-         throwErrnoIfNullRetry "getDirectoryContents" (c_opendir s)
-    loop ptr_dEnt p
+   alloca $ \ ptr_dEnt ->
+     bracket
+       (withCString path $ \s -> 
+          throwErrnoIfNullRetry desc (c_opendir s))
+       (\p -> throwErrnoIfMinus1_ desc (c_closedir p))
+       (\p -> loop ptr_dEnt p)
   where
+    desc = "getDirectoryContents"
+
     loop :: Ptr (Ptr CDirent) -> Ptr CDir -> IO [String]
     loop ptr_dEnt dir = do
       resetErrno
       r <- readdir dir ptr_dEnt
-      if (r == 0) 
+      if (r == 0)
         then do
                 dEnt    <- peek ptr_dEnt
-                if (dEnt == nullPtr) 
+                if (dEnt == nullPtr)
                   then return []
                   else do
                    entry   <- (d_name dEnt >>= peekCString)
@@ -356,11 +358,10 @@ getDirectoryContents path = do
                    return (entry:entries)
         else do errno <- getErrno
                 if (errno == eINTR) then loop ptr_dEnt dir else do
-                throwErrnoIfMinus1_ "getDirectoryContents" $ c_closedir dir
                 let (Errno eo) = errno
                 if (eo == end_of_dir)
                    then return []
-                   else throwErrno "getDirectoryContents"
+                   else throwErrno desc