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)
This commit is contained in:
Ryan Liptak 2023-08-31 14:05:43 -07:00
parent f4c9e19bc3
commit f46008c1d8
2 changed files with 25 additions and 14 deletions

View File

@ -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;

View File

@ -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 {