1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package os
- import "core:strings"
- import "core:mem"
- read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Errno) {
- dirp: Dir
- dirp, err = _fdopendir(fd)
- if err != ERROR_NONE {
- return
- }
- defer _closedir(dirp)
- // XXX OpenBSD
- dirpath: string
- dirpath, err = absolute_path_from_handle(fd)
- if err != ERROR_NONE {
- return
- }
- defer delete(dirpath)
- n := n
- size := n
- if n <= 0 {
- n = -1
- size = 100
- }
- dfi := make([dynamic]File_Info, 0, size, allocator)
- for {
- entry: Dirent
- end_of_stream: bool
- entry, err, end_of_stream = _readdir(dirp)
- if err != ERROR_NONE {
- for fi_ in dfi {
- file_info_delete(fi_, allocator)
- }
- delete(dfi)
- return
- } else if end_of_stream {
- break
- }
- fi_: File_Info
- filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] })
- if filename == "." || filename == ".." {
- continue
- }
- fullpath := strings.join( []string{ dirpath, filename }, "/", context.temp_allocator)
- defer delete(fullpath, context.temp_allocator)
- fi_, err = stat(fullpath, allocator)
- if err != ERROR_NONE {
- for fi__ in dfi {
- file_info_delete(fi__, allocator)
- }
- delete(dfi)
- return
- }
- append(&dfi, fi_)
- }
- return dfi[:], ERROR_NONE
- }
|