Files
Odin/core/os/dir_linux.odin

71 lines
1.3 KiB
Odin

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);
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;
}