module Directory (getDirectoryContents) where
import NHC.GreenCard
import PatchIOError
newtype Dir = Dir ForeignObj
foreign import ccall hs_closedir :: ForeignObj -> IO Int
closedir :: Dir -> IO Int
closedir (Dir d) =
do hs_closedir d
foreign import ccall hs_opendir :: PackedString -> IO (Int,ForeignObj)
opendir :: FilePath -> IO (Int,Dir)
opendir tmp1 =
do let fp = toCString tmp1
(err,d) <- hs_opendir fp
return (err,(Dir d))
foreign import ccall hs_readdir :: ForeignObj -> IO (Int,PackedString)
readdir :: Dir -> IO (Int,FilePath)
readdir (Dir d) =
do (err,fp) <- hs_readdir d
return (err,(fromCString fp))
getDirectoryContents :: FilePath -> IO [FilePath]
getDirectoryContents fp = do
d <- patchIOErrorFVal "getDirectoryContents" fp opendir
lazyDirContents d
-- Despite the name, I'm not entirely sure that this really is lazy.
lazyDirContents :: Dir -> IO [FilePath]
lazyDirContents d =
catch (do f <- patchIOErrorVal "readDir" (readdir d)
fs <- lazyDirContents d
return (f:fs))
(\e-> do -- patchIOError "closeDir" (closedir d)
return [])
{-------
newtype DirEntry = DirEntry ()
foreign import opendir :: CString -> IO Addr
foreign import closedir :: Addr -> IO Int
foreign import readdir :: Dir -> IO Ptr
-}
|