12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #+build darwin, linux, netbsd, freebsd, openbsd
- package os
- import "core:strings"
- @(require_results)
- read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Error) {
- dupfd := _dup(fd) or_return
- dirp := _fdopendir(dupfd) or_return
- defer _closedir(dirp)
- dirpath := absolute_path_from_handle(dupfd) or_return
- defer delete(dirpath)
- n := n
- size := n
- if n <= 0 {
- n = -1
- size = 100
- }
- dfi := make([dynamic]File_Info, 0, size, allocator) or_return
- defer if err != nil {
- for fi_ in dfi {
- file_info_delete(fi_, allocator)
- }
- delete(dfi)
- }
- for {
- entry: Dirent
- end_of_stream: bool
- entry, err, end_of_stream = _readdir(dirp)
- if err != nil {
- return
- } else if end_of_stream {
- break
- }
- fi_: File_Info
- filename := string(cstring(&entry.name[0]))
- if filename == "." || filename == ".." {
- continue
- }
- fullpath := strings.join({ dirpath, filename }, "/", allocator)
- s: OS_Stat
- s, err = _lstat(fullpath)
- if err != nil {
- delete(fullpath, allocator)
- return
- }
- _fill_file_info_from_stat(&fi_, s)
- fi_.fullpath = fullpath
- fi_.name = path_base(fi_.fullpath)
- append(&dfi, fi_)
- }
- return dfi[:], nil
- }
|