authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-27 17:49:21-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:51-07:00
log135ec79f50ff36d48563be126c3e49793b04f302
tree9998a41a43ac5be0b14bfb9961463dff79739d59
parent6b8972dd22d13957fd0c844a8359c82cedcfe939

std.Io.File: fix stat for Windows


2 files changed, 17 insertions(+), 21 deletions(-)

lib/std/Io/File.zig-4
...@@ -395,10 +395,6 @@ pub const Reader = struct {...@@ -395,10 +395,6 @@ pub const Reader = struct {
395 pub fn getSize(r: *Reader) SizeError!u64 {395 pub fn getSize(r: *Reader) SizeError!u64 {
396 return r.size orelse {396 return r.size orelse {
397 if (r.size_err) |err| return err;397 if (r.size_err) |err| return err;
398 if (std.posix.Stat == void) {
399 r.size_err = error.Streaming;
400 return error.Streaming;
401 }
402 if (stat(r.file, r.io)) |st| {398 if (stat(r.file, r.io)) |st| {
403 if (st.kind == .file) {399 if (st.kind == .file) {
404 r.size = st.size;400 r.size = st.size;
lib/std/Io/Threaded.zig+17-17
...@@ -2557,19 +2557,21 @@ fn fileReadStreamingPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io...@@ -2557,19 +2557,21 @@ fn fileReadStreamingPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io
25572557
2558fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize {2558fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize {
2559 const t: *Threaded = @ptrCast(@alignCast(userdata));2559 const t: *Threaded = @ptrCast(@alignCast(userdata));
2560 try t.checkCancel();
25612560
2562 const DWORD = windows.DWORD;2561 const DWORD = windows.DWORD;
2563 var index: usize = 0;2562 var index: usize = 0;
2564 while (data[index].len == 0) index += 1;2563 while (data[index].len == 0) index += 1;
2565
2566 const buffer = data[index];2564 const buffer = data[index];
2567 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);2565 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);
2568 var n: DWORD = undefined;2566
2569 if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) == 0) {2567 while (true) {
2568 try t.checkCancel();
2569 var n: DWORD = undefined;
2570 if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) != 0)
2571 return n;
2570 switch (windows.GetLastError()) {2572 switch (windows.GetLastError()) {
2571 .IO_PENDING => |err| return windows.errorBug(err),2573 .IO_PENDING => |err| return windows.errorBug(err),
2572 .OPERATION_ABORTED => return error.Canceled,2574 .OPERATION_ABORTED => continue,
2573 .BROKEN_PIPE => return 0,2575 .BROKEN_PIPE => return 0,
2574 .HANDLE_EOF => return 0,2576 .HANDLE_EOF => return 0,
2575 .NETNAME_DELETED => return error.ConnectionResetByPeer,2577 .NETNAME_DELETED => return error.ConnectionResetByPeer,
...@@ -2579,7 +2581,6 @@ fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8)...@@ -2579,7 +2581,6 @@ fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8)
2579 else => |err| return windows.unexpectedError(err),2581 else => |err| return windows.unexpectedError(err),
2580 }2582 }
2581 }2583 }
2582 return n;
2583}2584}
25842585
2585fn fileReadPositionalPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize {2586fn fileReadPositionalPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize {
...@@ -2661,33 +2662,34 @@ const fileReadPositional = switch (native_os) {...@@ -2661,33 +2662,34 @@ const fileReadPositional = switch (native_os) {
26612662
2662fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize {2663fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize {
2663 const t: *Threaded = @ptrCast(@alignCast(userdata));2664 const t: *Threaded = @ptrCast(@alignCast(userdata));
2664 try t.checkCancel();
26652665
2666 const DWORD = windows.DWORD;2666 const DWORD = windows.DWORD;
2667 const OVERLAPPED = windows.OVERLAPPED;
26682667
2669 var index: usize = 0;2668 var index: usize = 0;
2670 while (data[index].len == 0) index += 1;2669 while (data[index].len == 0) index += 1;
2671
2672 const buffer = data[index];2670 const buffer = data[index];
2673 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);2671 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);
2674 var n: DWORD = undefined;2672
2675 var overlapped: OVERLAPPED = .{2673 var overlapped: windows.OVERLAPPED = .{
2676 .Internal = 0,2674 .Internal = 0,
2677 .InternalHigh = 0,2675 .InternalHigh = 0,
2678 .DUMMYUNIONNAME = .{2676 .DUMMYUNIONNAME = .{
2679 .DUMMYSTRUCTNAME = .{2677 .DUMMYSTRUCTNAME = .{
2680 .Offset = @as(u32, @truncate(offset)),2678 .Offset = @truncate(offset),
2681 .OffsetHigh = @as(u32, @truncate(offset >> 32)),2679 .OffsetHigh = @truncate(offset >> 32),
2682 },2680 },
2683 },2681 },
2684 .hEvent = null,2682 .hEvent = null,
2685 };2683 };
26862684
2687 if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) == 0) {2685 while (true) {
2686 try t.checkCancel();
2687 var n: DWORD = undefined;
2688 if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) != 0)
2689 return n;
2688 switch (windows.GetLastError()) {2690 switch (windows.GetLastError()) {
2689 .IO_PENDING => |err| return windows.errorBug(err),2691 .IO_PENDING => |err| return windows.errorBug(err),
2690 .OPERATION_ABORTED => return error.Canceled,2692 .OPERATION_ABORTED => continue,
2691 .BROKEN_PIPE => return 0,2693 .BROKEN_PIPE => return 0,
2692 .HANDLE_EOF => return 0,2694 .HANDLE_EOF => return 0,
2693 .NETNAME_DELETED => return error.ConnectionResetByPeer,2695 .NETNAME_DELETED => return error.ConnectionResetByPeer,
...@@ -2697,8 +2699,6 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8,...@@ -2697,8 +2699,6 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8,
2697 else => |err| return windows.unexpectedError(err),2699 else => |err| return windows.unexpectedError(err),
2698 }2700 }
2699 }2701 }
2700
2701 return n;
2702}2702}
27032703
2704fn fileSeekBy(userdata: ?*anyopaque, file: Io.File, offset: i64) Io.File.SeekError!void {2704fn fileSeekBy(userdata: ?*anyopaque, file: Io.File, offset: i64) Io.File.SeekError!void {