From 6abc93ad8488cd2b584667075798a1795151733f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2020 23:22:01 +0000 Subject: [PATCH] Fix os.read for windows --- core/os/os_windows.odin | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index d445a2e0c..217de4561 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -145,21 +145,23 @@ write :: proc(fd: Handle, data: []byte) -> (int, Errno) { read :: proc(fd: Handle, data: []byte) -> (int, Errno) { if len(data) == 0 do return 0, ERROR_NONE; - read := 0; - for { - to_read := u32(min(1<<29-1, len(data)-read)); - if to_read <= 0 do break; + single_read_length: u32; + total_read: i64; + length := i64(len(data)); - n: u32; - ok := win32.read_file(win32.Handle(fd), &data[to_read], to_read, &n, nil); - if !ok { - return int(read), Errno(win32.get_last_error()); + for total_read < length { + remaining := length - total_read; + MAX :: 1<<31-1; + to_read: u32 = min(u32(remaining), MAX); + + e := win32.read_file(win32.Handle(fd), &data[total_read], to_read, &single_read_length, nil); + if !e { + err := Errno(win32.get_last_error()); + return int(total_read), err; } - - read += int(n); + total_read += i64(single_read_length); } - - return int(read), ERROR_NONE; + return int(total_read), ERROR_NONE; } seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Errno) {