dir_openbsd.odin 1.2 KB

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