ref: a16c4e637079bb3d7f1cb93ae9b2348d710c003f
dir: /libstd/dir+linux.myr/
use sys use "alloc.use" use "die.use" use "option.use" use "result.use" use "slcp.use" use "sldup.use" use "types.use" pkg std = type dir = struct fd : sys.fd buf : byte[16384] len : int64 off : int64 ;; const diropen : (p : byte[:] -> std.result(dir#, byte[:])) const dirread : (d : dir# -> std.option(byte[:])) const dirclose : (d : dir# -> void) ;; const Direntoverhead = 20 const diropen = {p var fd var dir fd = sys.open(p, sys.Ordonly | sys.Odir) if fd < 0 -> `Fail "couldn't open directory" ;; dir = zalloc() dir.fd = fd -> `Ok dir } const dirread = {d var len var dent var namelen if d.off >= d.len len = sys.getdents64(d.fd, d.buf[:]) if len <= 0 -> `None ;; d.len = len d.off = 0 ;; dent = &d.buf[d.off] castto(sys.dirent64#) namelen = 0 d.off += dent.reclen castto(int64) while dent.name[namelen] != 0 namelen++ ;; -> `Some sldup(dent.name[:namelen]) } const dirclose = {d sys.close(d.fd) free(d) }