From 55d429e0ba37c0609f8c713952113078a11bb593 Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Fri, 9 Oct 2026 22:29:11 -0700 Subject: [PATCH] Threaded.fileStatWindows: disambiguate between files and named pipes --- lib/std/Io/Threaded.zig | 6 ++++-- lib/std/fs/test.zig | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index c6bcd0a456d94d6e2e7658424e228d1a6f216398..1e0b94c86e1e074ac4dee4ad86ddb7a095552102 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -4221,8 +4221,10 @@ fn fileStatWindows(userdata: ?*anyopaque, file: File) File.StatError!File.Stat { break :reparse_point .unknown; } else if (info.BasicInformation.FileAttributes.DIRECTORY) .directory - else - .file, + else switch (try windowsGetFileDevice(file)) { + .NAMED_PIPE => .named_pipe, + else => .file, + }, .atime = windows.fromSysTime(info.BasicInformation.LastAccessTime), .mtime = windows.fromSysTime(info.BasicInformation.LastWriteTime), .ctime = windows.fromSysTime(info.BasicInformation.ChangeTime), diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 75a1dfe70305f73fdc0c1e8245ad2d3fb43db5b0..a1bddd0bf6c33ffa1e071719af767a01acfb9b50 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -298,6 +298,43 @@ test "File.stat on a File that is a symlink returns Kind.sym_link" { }.impl); } +test "File.stat on a File that is a named pipe returns Kind.named_pipe" { + // Creating pipes is Io.Threaded-specific + var threaded: std.Io.Threaded = .init(std.testing.allocator, .{ + .argv0 = .empty, + .environ = .empty, + }); + defer threaded.deinit(); + const io = threaded.io(); + + var read_end: Io.File = undefined; + var write_end: Io.File = undefined; + switch (builtin.target.os.tag) { + .wasi => return error.SkipZigTest, + .windows => { + const pipe = try threaded.windowsCreatePipe(.{ + .server = .{ .mode = .{ .IO = .SYNCHRONOUS_NONALERT } }, + .client = .{ .mode = .{ .IO = .SYNCHRONOUS_NONALERT } }, + .inbound = true, + }); + read_end = .{ .handle = pipe[0], .flags = .{ .nonblocking = false } }; + write_end = .{ .handle = pipe[1], .flags = .{ .nonblocking = false } }; + }, + else => { + const pipe = try std.Io.Threaded.pipe2(.{ .CLOEXEC = true }); + read_end = .{ .handle = pipe[0], .flags = .{ .nonblocking = false } }; + write_end = .{ .handle = pipe[1], .flags = .{ .nonblocking = false } }; + }, + } + defer { + read_end.close(io); + write_end.close(io); + } + + try expectEqual(.named_pipe, (try read_end.stat(io)).kind); + try expectEqual(.named_pipe, (try write_end.stat(io)).kind); +} + test "Dir.statFile on a symlink" { const io = testing.io; -- 2.54.0