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(...@@ -6083,13 +6083,30 @@ fn fileSetTimestamps(
6083 }6083 }
60846084
6085 if (native_os == .wasi and !builtin.link_libc) {6085 if (native_os == .wasi and !builtin.link_libc) {
6086 const atim = timestampToPosix(options.access_timestamp.nanoseconds).toTimestamp();6086 var atime: std.os.wasi.timestamp_t = 0;
6087 const mtim = timestampToPosix(options.modify_timestamp.nanoseconds).toTimestamp();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
6088 try current_thread.beginSyscall();6108 try current_thread.beginSyscall();
6089 while (true) switch (std.os.wasi.fd_filestat_set_times(file.handle, atim, mtim, .{6109 while (true) switch (std.os.wasi.fd_filestat_set_times(file.handle, atime, mtime, flags)) {
6090 .ATIM = true,
6091 .MTIM = true,
6092 })) {
6093 .SUCCESS => return current_thread.endSyscall(),6110 .SUCCESS => return current_thread.endSyscall(),
6094 .INTR => {6111 .INTR => {
6095 try current_thread.checkCancel();6112 try current_thread.checkCancel();
...@@ -6098,9 +6115,9 @@ fn fileSetTimestamps(...@@ -6098,9 +6115,9 @@ fn fileSetTimestamps(
6098 .BADF => |err| return current_thread.endSyscallErrnoBug(err), // File descriptor use-after-free.6115 .BADF => |err| return current_thread.endSyscallErrnoBug(err), // File descriptor use-after-free.
6099 .FAULT => |err| return current_thread.endSyscallErrnoBug(err),6116 .FAULT => |err| return current_thread.endSyscallErrnoBug(err),
6100 .INVAL => |err| return current_thread.endSyscallErrnoBug(err),6117 .INVAL => |err| return current_thread.endSyscallErrnoBug(err),
6101 .ACCES => return current_thread.endSyscallErrnoBug(error.AccessDenied),6118 .ACCES => return current_thread.endSyscallError(error.AccessDenied),
6102 .PERM => return current_thread.endSyscallErrnoBug(error.PermissionDenied),6119 .PERM => return current_thread.endSyscallError(error.PermissionDenied),
6103 .ROFS => return current_thread.endSyscallErrnoBug(error.ReadOnlyFileSystem),6120 .ROFS => return current_thread.endSyscallError(error.ReadOnlyFileSystem),
6104 else => |err| return current_thread.endSyscallUnexpectedErrno(err),6121 else => |err| return current_thread.endSyscallUnexpectedErrno(err),
6105 };6122 };
6106 }6123 }