0 | module System.Posix.File.Prim
4 | import public Data.Buffer
5 | import public Data.Buffer.Core
6 | import public Data.ByteString
7 | import public Data.ByteVect
9 | import public Data.C.Ptr
11 | import public System.Posix.Errno
12 | import public System.Posix.File.FileDesc
13 | import public System.Posix.File.Flags
14 | import public System.Posix.File.ReadRes
15 | import public System.Posix.File.Whence
23 | %foreign "C:li_open, posix-idris"
24 | prim__open : String -> Bits32 -> ModeT -> PrimIO CInt
26 | %foreign "C:li_close, posix-idris"
27 | prim__close : Bits32 -> PrimIO CInt
29 | %foreign "C__collect_safe:li_read, posix-idris"
30 | prim__readptr : (file : Bits32) -> AnyPtr -> (max : Bits32) -> PrimIO SsizeT
32 | %foreign "C:li_read, posix-idris"
33 | prim__read : (file : Bits32) -> Buffer -> (max : Bits32) -> PrimIO SsizeT
35 | %foreign "C:li_pread, posix-idris"
36 | prim__pread : (file : Bits32) -> Buffer -> (max : Bits32) -> OffT -> PrimIO SsizeT
38 | %foreign "C:li_write, posix-idris"
39 | prim__write : (file : Bits32) -> Buffer -> (off,max : Bits32) -> PrimIO SsizeT
41 | %foreign "C__collect_safe:li_write, posix-idris"
42 | prim__writeptr : (file : Bits32) -> AnyPtr -> (off,max : Bits32) -> PrimIO SsizeT
44 | %foreign "C:li_pwrite, posix-idris"
45 | prim__pwrite : (file : Bits32) -> Buffer -> (off,max : Bits32) -> OffT -> PrimIO SsizeT
47 | %foreign "C__collect_safe:li_pwrite, posix-idris"
48 | prim__pwriteptr : (file : Bits32) -> AnyPtr -> (off,max : Bits32) -> OffT -> PrimIO SsizeT
50 | %foreign "C:lseek, posix-idris"
51 | prim__lseek : (file : Bits32) -> (off : OffT) -> (whence : CInt) -> PrimIO OffT
53 | %foreign "C:li_set_flags, posix-idris"
54 | prim__setFlags : (file : Bits32) -> (flags : Bits32) -> PrimIO CInt
56 | %foreign "C:li_get_flags, posix-idris"
57 | prim__getFlags : (file : Bits32) -> PrimIO CInt
59 | %foreign "C:li_dup, posix-idris"
60 | prim__dup : (file : Bits32) -> PrimIO CInt
62 | %foreign "C:li_dup2, posix-idris"
63 | prim__dup2 : (file, dst : Bits32) -> PrimIO CInt
65 | %foreign "C:li_dupfd, posix-idris"
66 | prim__dupfd : (file, startfd : Bits32) -> PrimIO CInt
68 | %foreign "C:li_ftruncate, posix-idris"
69 | prim__ftruncate : (file : Bits32) -> (len : OffT) -> PrimIO CInt
71 | %foreign "C:li_truncate, posix-idris"
72 | prim__truncate : (file : String) -> (len : OffT) -> PrimIO CInt
74 | %foreign "C:li_mkstemp, posix-idris"
75 | prim__mkstemp : Buffer -> PrimIO CInt
77 | %foreign "C:li_link, posix-idris"
78 | prim__link : String -> String -> PrimIO CInt
80 | %foreign "C:li_symlink, posix-idris"
81 | prim__symlink : String -> String -> PrimIO CInt
83 | %foreign "C:li_rename, posix-idris"
84 | prim__rename : String -> String -> PrimIO CInt
86 | %foreign "C:li_unlink, posix-idris"
87 | prim__unlink : String -> PrimIO CInt
89 | %foreign "C:li_remove, posix-idris"
90 | prim__remove : String -> PrimIO CInt
92 | %foreign "C:li_readlink, posix-idris"
93 | prim__readlink : (file : String) -> Buffer -> (max : Bits32) -> PrimIO SsizeT
101 | allocRead : FromBuf a => Bits32 -> (Buffer -> Bits32 -> PrimIO SsizeT) -> EPrim a
102 | allocRead n act t =
103 | let buf # t := toF1 (prim__newBuf $
cast n) t
104 | rd # t := toF1 (act buf n) t
106 | then E (inject $
fromNeg rd) t
107 | else let r # t := fromBuf (B (cast rd) buf) t in R r t
112 | {auto fb : FromBuf a}
114 | -> (Buffer -> Bits32 -> PrimIO SsizeT)
115 | -> EPrim (ReadRes a)
117 | let buf # t := toF1 (prim__newBuf $
cast n) t
118 | rd # t := toF1 (act buf n) t
119 | in if rd < 0 then fromErr (fromNeg rd) t
120 | else if rd == 0 then R EOI t
121 | else let r # t := fromBuf (B (cast rd) buf) t in R (Res r) t
126 | ptrRead : FromPtr a => AnyPtr -> PrimIO SsizeT -> EPrim a
127 | ptrRead ptr act t =
128 | let rd # t := toF1 act t
130 | then E (inject $
fromNeg rd) t
131 | else let res # t := fromPtr (CP (cast rd) ptr) t in R res t
135 | ptrToRes : FromPtr a => AnyPtr -> PrimIO SsizeT -> EPrim (ReadRes a)
136 | ptrToRes ptr act t =
137 | let rd # t := toF1 act t
138 | in if rd < 0 then fromErr (fromNeg rd) t
139 | else if rd == 0 then R EOI t
140 | else let res # t := fromPtr (CP (cast rd) ptr) t in R (Res res) t
143 | toFD : PrimIO CInt -> EPrim Fd
144 | toFD = toVal (MkFd . cast)
152 | openFile : String -> Flags -> Mode -> EPrim Fd
153 | openFile p (F f) (M m) = toFD (prim__open p f m)
155 | parameters {auto fid : FileDesc a}
161 | close = toUnit (prim__close $
fileDesc fd)
167 | let MkIORes _ w := prim__close (fileDesc fd) w
172 | readPtr : (0 r : Type) -> FromPtr r => CPtr -> EPrim r
173 | readPtr r (CP sz p) = ptrRead p $
prim__readptr (fileDesc fd) p sz
180 | readPtrRes : (0 r : Type) -> FromPtr r => CPtr -> EPrim (ReadRes r)
181 | readPtrRes r (CP sz p) = ptrToRes p $
prim__readptr (fileDesc fd) p sz
185 | read : (0 r : Type) -> FromBuf r => (n : Bits32) -> EPrim r
186 | read r n = allocRead n $
prim__read (fileDesc fd)
190 | readRaw : Buf -> EPrim EMBuffer
191 | readRaw (B sz buf) t =
192 | let rd # t := toF1 (prim__read (fileDesc fd) buf sz) t
194 | then E (inject $
fromNeg rd) t
195 | else R (
cast rd ** unsafeMBuffer buf)
t
203 | readres : (0 r : Type) -> FromBuf r => (n : Bits32) -> EPrim (ReadRes r)
204 | readres r n = toRes n $
prim__read (fileDesc fd)
213 | pread : (0 r : Type) -> FromBuf r => (n : Bits32) -> OffT -> EPrim r
214 | pread r n off = allocRead n $
\b,x => prim__pread (fileDesc fd) b x off
222 | write : ToBuf r => r -> EPrim Bits32
224 | case unsafeToBuf v of
225 | Left (CP sz ptr) =>
226 | toSize $
prim__writeptr (fileDesc fd) ptr 0 sz
227 | Right (BS n $
BV b o _) =>
228 | toSize $
prim__write (fileDesc fd) (unsafeGetBuffer b) (cast o) (cast n)
235 | fwrite : ToBuf r => r -> EPrim ()
237 | case (unsafeToBuf v) of
238 | Left (CP sz p) => goPtr p sz
242 | goPtr : AnyPtr -> Bits32 -> EPrim ()
243 | goPtr p 0 t = R () t
245 | let R m t := write (CP sz p) t | E x t => E x t
246 | in goPtr (prim__inc_ptr p m 1) (assert_smaller sz $
sz - m) t
248 | go : ByteString -> EPrim ()
249 | go (BS 0 _) t = R () t
251 | let R m t := write bs t | E x t => E x t
252 | in go (assert_smaller bs $
drop (cast m) bs) t
261 | pwrite : ToBuf r => r -> OffT -> EPrim Bits32
263 | case unsafeToBuf v of
264 | Left (CP sz ptr) =>
265 | toSize $
prim__pwriteptr (fileDesc fd) ptr 0 sz off
266 | Right (BS n $
BV b o _) =>
267 | toSize $
prim__pwrite (fileDesc fd) (unsafeGetBuffer b) (cast o) (cast n) off
276 | lseek : OffT -> Whence -> PrimIO OffT
277 | lseek offset whence =
278 | prim__lseek (fileDesc fd) offset (cast $
whenceCode whence)
290 | dup = toFD $
prim__dup (fileDesc fd)
297 | dup2 : FileDesc b => (fd2 : b) -> EPrim Fd
298 | dup2 fd2 = toFD $
prim__dup2 (fileDesc fd) (fileDesc fd2)
305 | dupfd : (start : Bits32) -> EPrim Fd
306 | dupfd fd2 = toFD $
prim__dupfd (fileDesc fd) fd2
314 | getFlags : EPrim Flags
316 | let r # t := toF1 (prim__getFlags (fileDesc fd)) t
317 | in if r < 0 then E (inject $
fromNeg r) t else R (F $
cast r) t
323 | setFlags : Flags -> EPrim ()
324 | setFlags (F fs) = toUnit $
prim__setFlags (fileDesc fd) fs
329 | addFlags : Flags -> EPrim ()
331 | let R x w := getFlags w | E x w => E x w
332 | in setFlags (x <+> fs) w
336 | ftruncate : OffT -> EPrim ()
337 | ftruncate len = toUnit $
prim__ftruncate (fileDesc fd) len
341 | truncate : String -> OffT -> EPrim ()
342 | truncate f len = toUnit $
prim__truncate f len
346 | mkstemp : String -> EPrim (Fd, String)
348 | let pat := "\{f}XXXXXX"
349 | len := cast {to = Bits32} $
stringByteLength pat
350 | buf # t := toF1 (prim__newBuf $
cast len) t
351 | _ # t := ioToF1 (setString buf 0 pat) t
352 | R fd t := toFD (prim__mkstemp buf) t | E x t => E x t
353 | nm # t := fromBuf (B len buf) t
362 | link : (file, link : String) -> EPrim ()
363 | link f l = toUnit $
prim__link f l
367 | symlink : (file, link : String) -> EPrim ()
368 | symlink f l = toUnit $
prim__symlink f l
378 | unlink : (file : String) -> EPrim ()
379 | unlink f = toUnit $
prim__unlink f
384 | remove : (file : String) -> EPrim ()
385 | remove f = toUnit $
prim__remove f
392 | rename : (file, link : String) -> EPrim ()
393 | rename f l = toUnit $
prim__rename f l
400 | readlink : FromBuf a => (file : String) -> EPrim a
401 | readlink f = allocRead 4096 $
prim__readlink f
408 | stdout : String -> PrimIO ()
409 | stdout s = Errno.ignore $
fwrite {es = [Errno]} Stdout s
412 | stdoutLn : String -> PrimIO ()
413 | stdoutLn = stdout . (++ "\n")
416 | prnt : Show a => a -> PrimIO ()
417 | prnt = stdout . show
420 | prntLn : Show a => a -> PrimIO ()
421 | prntLn = stdoutLn . show
424 | stderr : String -> PrimIO ()
425 | stderr s = ignore $
fwrite {es = [Errno]} Stderr s
428 | stderrLn : String -> PrimIO ()
429 | stderrLn = stderr . (++ "\n")