0 | module System.Posix.Dir.Prim
  1 |
  2 | import Data.Buffer
  3 | import public Data.Buffer.Core
  4 | import public Data.ByteString
  5 | import public Data.C.Integer
  6 | import public System.Posix.Dir.Dir
  7 | import public System.Posix.Errno
  8 | import public System.Posix.File.Prim
  9 |
 10 | %default total
 11 |
 12 | --------------------------------------------------------------------------------
 13 | -- FFI
 14 | --------------------------------------------------------------------------------
 15 |
 16 | %foreign "C:li_mkdir, posix-idris"
 17 | prim__mkdir : String -> ModeT -> PrimIO CInt
 18 |
 19 | %foreign "C:li_rmdir, posix-idris"
 20 | prim__rmdir : String -> PrimIO CInt
 21 |
 22 | %foreign "C:calloc_dir, posix-idris"
 23 | prim__calloc_dir : PrimIO AnyPtr
 24 |
 25 | %foreign "C:li_opendir, posix-idris"
 26 | prim__opendir : String -> AnyPtr -> PrimIO CInt
 27 |
 28 | %foreign "C:li_fdopendir, posix-idris"
 29 | prim__fdopendir : Bits32 -> AnyPtr -> PrimIO CInt
 30 |
 31 | %foreign "C:li_closedir, posix-idris"
 32 | prim__closedir : AnyPtr -> PrimIO CInt
 33 |
 34 | %foreign "C:li_rewinddir, posix-idris"
 35 | prim__rewinddir : AnyPtr -> PrimIO ()
 36 |
 37 | %foreign "C:li_readdir, posix-idris"
 38 | prim__readdir : AnyPtr -> Buffer -> PrimIO SsizeT
 39 |
 40 | %foreign "C:li_getcwd, posix-idris"
 41 | prim__getcwd : Buffer -> (max : Bits32) -> PrimIO SsizeT
 42 |
 43 | %foreign "C:li_chdir, posix-idris"
 44 | prim__chdir : String -> PrimIO CInt
 45 |
 46 | %foreign "C:li_chroot, posix-idris"
 47 | prim__chroot : String -> PrimIO CInt
 48 |
 49 | --------------------------------------------------------------------------------
 50 | -- API
 51 | --------------------------------------------------------------------------------
 52 |
 53 | ||| Creates a new directory.
 54 | |||
 55 | ||| This fails if the directory exists already. It also fails, if the
 56 | ||| parent directory does not exist.
 57 | export %inline
 58 | mkdir : (pth : String) -> Mode -> EPrim ()
 59 | mkdir f (M m) = toUnit $ prim__mkdir f m
 60 |
 61 | ||| Opens a directory.
 62 | export
 63 | opendir : String -> EPrim Dir
 64 | opendir s t =
 65 |   let p # t := ffi prim__calloc_dir t
 66 |    in toVal (const $ wrapdir p) (prim__opendir s p) t
 67 |
 68 | ||| Opens a directory from a file descriptor.
 69 | export
 70 | fdopendir : FileDesc a => a -> EPrim Dir
 71 | fdopendir fd t =
 72 |   let p # t := ffi prim__calloc_dir t
 73 |    in toRes (MkIORes $ wrapdir p) (prim__fdopendir (fileDesc fd) p) t
 74 |
 75 | ||| Rewinds a directory.
 76 | export
 77 | rewinddir : Dir -> PrimIO ()
 78 | rewinddir p = prim__rewinddir (dirptr p)
 79 |
 80 | ||| Closes a directory.
 81 | export
 82 | closedir : Dir -> EPrim ()
 83 | closedir p = toUnit $ prim__closedir (dirptr p)
 84 |
 85 | ||| Closes a directory.
 86 | export %inline
 87 | closedir' : Dir -> F1' World
 88 | closedir' p = e1ToF1 (closedir {es = [Errno]} p)
 89 |
 90 | ||| Reads the next entry from a directory.
 91 | export
 92 | readdir : (0 r : Type) -> FromBuf r => Dir -> EPrim (ReadRes r)
 93 | readdir r p = toRes 256 (\b,_ => prim__readdir (dirptr p) b)
 94 |
 95 | ||| Returns the current working directory.
 96 | export %inline
 97 | getcwd : (0 r : Type) -> FromBuf r => EPrim r
 98 | getcwd r = allocRead 4096 prim__getcwd
 99 |
100 | ||| Changes the current working directory
101 | export
102 | chdir : String -> EPrim ()
103 | chdir p = toUnit $ prim__chdir p
104 |
105 | ||| Changes the current working directory
106 | export
107 | chroot : String -> EPrim ()
108 | chroot p = toUnit $ prim__chroot p
109 |