@@ -21,8 +21,13 @@ import IO
2121data File : Type where
2222 FHandle : (p : Ptr) -> File
2323
24+||| A directory handle
25+data Directory : Type where
26+ DHandle : (p : Ptr) -> Directory
27+
2428-- Usage hints for erasure analysis
2529%used FHandle p
30+%used DHandle p
2631
2732||| An error from a file operation
2833-- This is built in idris_mkFileError() in rts/idris_stdfgn.c. Make sure
@@ -280,3 +285,46 @@ writeFile fn contents = do
280285 Right () <- fPutStr h contents | Left err => pure (Left err)
281286 closeFile h
282287 pure (Right ())
288+
289+
290+export
291+dirOpen : (d : String) -> IO (Either FileError Directory)
292+dirOpen d
293+ = do dptr <- foreign FFI_C "idris_dirOpen" (String -> IO Ptr) d
294+ if !(nullPtr dptr)
295+ then do err <- getFileError
296+ pure (Left err)
297+ else pure (Right (DHandle dptr))
298+
299+export
300+dirClose : Directory -> IO ()
301+dirClose (DHandle d) = foreign FFI_C "idris_dirClose" (Ptr -> IO ()) d
302+
303+export
304+dirError : Directory -> IO Bool
305+dirError (DHandle d)
306+ = do err <- foreign FFI_C "idris_dirError" (Ptr -> IO Int) d
307+ pure (not (err == 0))
308+
309+export
310+dirEntry : Directory -> IO (Either FileError String)
311+dirEntry (DHandle d)
312+ = do fn <- foreign FFI_C "idris_nextDirEntry" (Ptr -> IO String) d
313+ if !(dirError (DHandle d))
314+ then pure (Left FileReadError)
315+ else pure (Right fn)
316+
317+export
318+createDir : String -> IO (Either FileError ())
319+createDir d
320+ = do ok <- foreign FFI_C "idris_mkdir" (String -> IO Int) d
321+ if (ok == 0)
322+ then pure (Right ())
323+ else do err <- getFileError
324+ pure (Left err)
325+
326+export
327+changeDir : String -> IO Bool
328+changeDir dir
329+ = do ok <- foreign FFI_C "chdir" (String -> IO Int) dir
330+ pure (ok == 0)