From 1a94513f07e65d2e7356433c2e70527eb1774737 Mon Sep 17 00:00:00 2001 From: Jonathan Marler Date: Fri, 15 Aug 2025 21:04:01 -0600 Subject: [PATCH] Handle getSize in File for windows pipes Fixes #24867 --- lib/std/fs/File.zig | 35 +++++++++++++++++---- test/standalone/test_obj_link_run/build.zig | 5 +-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig index d9879e1e74d9..831cb31f8738 100644 --- a/lib/std/fs/File.zig +++ b/lib/std/fs/File.zig @@ -1206,12 +1206,35 @@ pub const Reader = struct { return r.size orelse { if (r.size_err) |err| return err; if (is_windows) { - if (windows.GetFileSizeEx(r.file.handle)) |size| { - r.size = size; - return size; - } else |err| { - r.size_err = err; - return err; + const device_type = blk: { + var io_status: windows.IO_STATUS_BLOCK = undefined; + var device_info: windows.FILE_FS_DEVICE_INFORMATION = undefined; + const rc = windows.ntdll.NtQueryVolumeInformationFile( + r.file.handle, + &io_status, + &device_info, + @sizeOf(windows.FILE_FS_DEVICE_INFORMATION), + .FileFsDeviceInformation, + ); + break :blk switch (rc) { + .SUCCESS => device_info.DeviceType, + else => return windows.unexpectedStatus(rc), + }; + }; + switch (device_type) { + windows.FILE_DEVICE_NAMED_PIPE, + windows.FILE_DEVICE_CONSOLE, + => { + r.size_err = error.Streaming; + return error.Streaming; + }, + else => if (windows.GetFileSizeEx(r.file.handle)) |size| { + r.size = size; + return size; + } else |err| { + r.size_err = err; + return err; + }, } } if (posix.Stat == void) { diff --git a/test/standalone/test_obj_link_run/build.zig b/test/standalone/test_obj_link_run/build.zig index 404b4b709979..45d35865c6a8 100644 --- a/test/standalone/test_obj_link_run/build.zig +++ b/test/standalone/test_obj_link_run/build.zig @@ -27,10 +27,7 @@ pub fn build(b: *std.Build) void { b.default_step = test_step; const test_run = b.addRunArtifact(test_exe); - if (!is_windows) { - // https://github.com/ziglang/zig/issues/24867 - test_run.addCheck(.{ .expect_stderr_match = "All 3 tests passed." }); - } + test_run.addCheck(.{ .expect_stderr_match = "All 3 tests passed." }); test_step.dependOn(&test_run.step); }