dir_freebsd.odin 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package os
  2. import "core:mem"
  3. read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Errno) {
  4. dirp: Dir
  5. dirp, err = _fdopendir(fd)
  6. if err != ERROR_NONE {
  7. return
  8. }
  9. defer _closedir(dirp)
  10. dirpath: string
  11. dirpath, err = absolute_path_from_handle(fd)
  12. if err != ERROR_NONE {
  13. return
  14. }
  15. defer delete(dirpath)
  16. n := n
  17. size := n
  18. if n <= 0 {
  19. n = -1
  20. size = 100
  21. }
  22. dfi := make([dynamic]File_Info, 0, size, allocator)
  23. for {
  24. entry: Dirent
  25. end_of_stream: bool
  26. entry, err, end_of_stream = _readdir(dirp)
  27. if err != ERROR_NONE {
  28. for fi_ in dfi {
  29. file_info_delete(fi_, allocator)
  30. }
  31. delete(dfi)
  32. return
  33. } else if end_of_stream {
  34. break
  35. }
  36. fi_: File_Info
  37. filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] })
  38. if filename == "." || filename == ".." {
  39. continue
  40. }
  41. fullpath := make([]byte, len(dirpath)+1+len(filename), context.temp_allocator)
  42. copy(fullpath, dirpath)
  43. copy(fullpath[len(dirpath):], "/")
  44. copy(fullpath[len(dirpath)+1:], filename)
  45. defer delete(fullpath, context.temp_allocator)
  46. fi_, err = stat(string(fullpath), allocator)
  47. if err != ERROR_NONE {
  48. for fi__ in dfi {
  49. file_info_delete(fi__, allocator)
  50. }
  51. delete(dfi)
  52. return
  53. }
  54. append(&dfi, fi_)
  55. }
  56. return dfi[:], ERROR_NONE
  57. }