Commit f46008c1d8

Ryan Liptak <squeek502@hotmail.com>
2023-08-31 23:05:43
Fix `Dir.statFile` for WASI when linking libc
`statFile` now only uses `os.fstatatWasi` when not linking libc, matching the pattern used throughout other `Dir` functions. This fixes the compilation error: `error: struct 'c.wasi.Stat' has no member named 'fromFilestat'` (which the added test would have failed with)
1 parent f4c9e19
Changed files (2)
lib
lib/std/fs/test.zig
@@ -569,6 +569,21 @@ test "readAllAlloc" {
     try testing.expectError(error.FileTooBig, file.readToEndAlloc(testing.allocator, write_buf.len - 1));
 }
 
+test "Dir.statFile" {
+    try testWithAllSupportedPathTypes(struct {
+        fn impl(ctx: *TestContext) !void {
+            const test_file_name = try ctx.transformPath("test_file");
+
+            try testing.expectError(error.FileNotFound, ctx.dir.statFile(test_file_name));
+
+            try ctx.dir.writeFile(test_file_name, "");
+
+            const stat = try ctx.dir.statFile(test_file_name);
+            try testing.expectEqual(File.Kind.file, stat.kind);
+        }
+    }.impl);
+}
+
 test "directory operations on files" {
     try testWithAllSupportedPathTypes(struct {
         fn impl(ctx: *TestContext) !void {
lib/std/fs.zig
@@ -2653,21 +2653,17 @@ pub const Dir = struct {
     ///
     /// `sub_path` may be absolute, in which case `self` is ignored.
     pub fn statFile(self: Dir, sub_path: []const u8) StatFileError!Stat {
-        switch (builtin.os.tag) {
-            .windows => {
-                var file = try self.openFile(sub_path, .{});
-                defer file.close();
-                return file.stat();
-            },
-            .wasi => {
-                const st = try os.fstatatWasi(self.fd, sub_path, os.wasi.LOOKUP_SYMLINK_FOLLOW);
-                return Stat.fromSystem(st);
-            },
-            else => {
-                const st = try os.fstatat(self.fd, sub_path, 0);
-                return Stat.fromSystem(st);
-            },
+        if (builtin.os.tag == .windows) {
+            var file = try self.openFile(sub_path, .{});
+            defer file.close();
+            return file.stat();
+        }
+        if (builtin.os.tag == .wasi and !builtin.link_libc) {
+            const st = try os.fstatatWasi(self.fd, sub_path, os.wasi.LOOKUP_SYMLINK_FOLLOW);
+            return Stat.fromSystem(st);
         }
+        const st = try os.fstatat(self.fd, sub_path, 0);
+        return Stat.fromSystem(st);
     }
 
     const Permissions = File.Permissions;