authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-12-27 11:01:16-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-12-27 11:01:16-08:00
log10e72a8cad48e3e9e68f51d9e6769e30566029b1
treecddd92118fb1eb73afb5709c9b7b2a0c48b88170
parentdd98188ce06c09c666414e45ab54a4fd260b0d59

std.Io.Threaded: implement fileSetTimestamps on WASI


1 files changed, 26 insertions(+), 9 deletions(-)

lib/std/Io/Threaded.zig+26-9
......@@ -6083,13 +6083,30 @@ fn fileSetTimestamps(
60836083 }
60846084
60856085 if (native_os == .wasi and !builtin.link_libc) {
6086 const atim = timestampToPosix(options.access_timestamp.nanoseconds).toTimestamp();
6087 const mtim = timestampToPosix(options.modify_timestamp.nanoseconds).toTimestamp();
6086 var atime: std.os.wasi.timestamp_t = 0;
6087 var mtime: std.os.wasi.timestamp_t = 0;
6088 var flags: std.os.wasi.fstflags_t = .{};
6089
6090 switch (options.access_timestamp) {
6091 .unchanged => {},
6092 .now => flags.ATIM_NOW = true,
6093 .new => |ts| {
6094 atime = timestampToPosix(ts.nanoseconds).toTimestamp();
6095 flags.ATIM = true;
6096 },
6097 }
6098
6099 switch (options.modify_timestamp) {
6100 .unchanged => {},
6101 .now => flags.MTIM_NOW = true,
6102 .new => |ts| {
6103 mtime = timestampToPosix(ts.nanoseconds).toTimestamp();
6104 flags.MTIM = true;
6105 },
6106 }
6107
60886108 try current_thread.beginSyscall();
6089 while (true) switch (std.os.wasi.fd_filestat_set_times(file.handle, atim, mtim, .{
6090 .ATIM = true,
6091 .MTIM = true,
6092 })) {
6109 while (true) switch (std.os.wasi.fd_filestat_set_times(file.handle, atime, mtime, flags)) {
60936110 .SUCCESS => return current_thread.endSyscall(),
60946111 .INTR => {
60956112 try current_thread.checkCancel();
......@@ -6098,9 +6115,9 @@ fn fileSetTimestamps(
60986115 .BADF => |err| return current_thread.endSyscallErrnoBug(err), // File descriptor use-after-free.
60996116 .FAULT => |err| return current_thread.endSyscallErrnoBug(err),
61006117 .INVAL => |err| return current_thread.endSyscallErrnoBug(err),
6101 .ACCES => return current_thread.endSyscallErrnoBug(error.AccessDenied),
6102 .PERM => return current_thread.endSyscallErrnoBug(error.PermissionDenied),
6103 .ROFS => return current_thread.endSyscallErrnoBug(error.ReadOnlyFileSystem),
6118 .ACCES => return current_thread.endSyscallError(error.AccessDenied),
6119 .PERM => return current_thread.endSyscallError(error.PermissionDenied),
6120 .ROFS => return current_thread.endSyscallError(error.ReadOnlyFileSystem),
61046121 else => |err| return current_thread.endSyscallUnexpectedErrno(err),
61056122 };
61066123 }