From 175f5b0bb19e276816405996bbe574a46a6d3b55 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 3 Aug 2024 15:36:32 +0200 Subject: [PATCH] os2: don't rely on PATH_MAX in posix read_directory implementation --- core/os/os2/dir_posix.odin | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/core/os/os2/dir_posix.odin b/core/os/os2/dir_posix.odin index 6e01928e0..2f537f64c 100644 --- a/core/os/os2/dir_posix.odin +++ b/core/os/os2/dir_posix.odin @@ -7,13 +7,13 @@ import "core:sys/posix" Read_Directory_Iterator_Impl :: struct { dir: posix.DIR, idx: int, - - // NOTE: could there be paths bigger than this, maybe, probably, but why does it exist then? - fullpath: [posix.PATH_MAX]byte, + fullpath: [dynamic]byte, } @(require_results) _read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, index: int, ok: bool) { + fimpl := (^File_Impl)(it.f.impl) + index = it.impl.idx it.impl.idx += 1 @@ -29,6 +29,7 @@ _read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info if cname == "." || cname == ".." { continue } + sname := string(cname) stat: posix.stat_t if posix.fstatat(posix.dirfd(it.impl.dir), cname, &stat, { .SYMLINK_NOFOLLOW }) != .OK { @@ -37,13 +38,11 @@ _read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info return } - fimpl := (^File_Impl)(it.f.impl) + n := len(fimpl.name)+1 + non_zero_resize(&it.impl.fullpath, n+len(sname)) + n += copy(it.impl.fullpath[n:], sname) - n := copy(it.impl.fullpath[:], fimpl.name) - n += copy(it.impl.fullpath[n:], "/") - n += copy(it.impl.fullpath[n:], string(cname)) - - fi = internal_stat(stat, string(it.impl.fullpath[:n])) + fi = internal_stat(stat, string(it.impl.fullpath[:])) ok = true return } @@ -55,10 +54,15 @@ _read_directory_iterator_create :: proc(f: ^File) -> (iter: Read_Directory_Itera err = .Invalid_File return } + + impl := (^File_Impl)(f.impl) + iter.f = f iter.impl.idx = 0 - impl := (^File_Impl)(f.impl) + iter.impl.fullpath.allocator = file_allocator() + append(&iter.impl.fullpath, impl.name) + append(&iter.impl.fullpath, "/") iter.impl.dir = posix.fdopendir(impl.fd) if iter.impl.dir == nil { @@ -75,4 +79,5 @@ _read_directory_iterator_destroy :: proc(it: ^Read_Directory_Iterator) { } posix.closedir(it.impl.dir) + delete(it.impl.fullpath) }