authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-15 15:00:12-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:49-07:00
logbb1bf5b96f966696f88933a07513b001c99d66f5
treed805f8095c127998e0a22b432a475e49ffe33f95
parent1e81c3a9259873fac197ed5dc6e2133f0a097243

std.Io: stub file writing rather than incorrect impl


3 files changed, 33 insertions(+), 20 deletions(-)

lib/std/Io.zig+2-1
...@@ -667,7 +667,8 @@ pub const VTable = struct {...@@ -667,7 +667,8 @@ pub const VTable = struct {
667 dirOpenFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.OpenFlags) File.OpenError!File,667 dirOpenFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.OpenFlags) File.OpenError!File,
668 fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat,668 fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat,
669 fileClose: *const fn (?*anyopaque, File) void,669 fileClose: *const fn (?*anyopaque, File) void,
670 pwrite: *const fn (?*anyopaque, File, buffer: []const u8, offset: std.posix.off_t) File.PWriteError!usize,670 fileWriteStreaming: *const fn (?*anyopaque, File, buffer: [][]const u8) File.WriteStreamingError!usize,
671 fileWritePositional: *const fn (?*anyopaque, File, buffer: [][]const u8, offset: u64) File.WritePositionalError!usize,
671 /// Returns 0 on end of stream.672 /// Returns 0 on end of stream.
672 fileReadStreaming: *const fn (?*anyopaque, File, data: [][]u8) File.ReadStreamingError!usize,673 fileReadStreaming: *const fn (?*anyopaque, File, data: [][]u8) File.ReadStreamingError!usize,
673 /// Returns 0 on end of stream.674 /// Returns 0 on end of stream.
lib/std/Io/File.zig+6-11
...@@ -172,24 +172,19 @@ pub const ReadStreamingError = error{...@@ -172,24 +172,19 @@ pub const ReadStreamingError = error{
172pub const ReadPositionalError = ReadStreamingError || error{Unseekable};172pub const ReadPositionalError = ReadStreamingError || error{Unseekable};
173173
174pub fn readPositional(file: File, io: Io, buffer: []u8, offset: u64) ReadPositionalError!usize {174pub fn readPositional(file: File, io: Io, buffer: []u8, offset: u64) ReadPositionalError!usize {
175 return io.vtable.pread(io.userdata, file, buffer, offset);175 return io.vtable.fileReadPositional(io.userdata, file, buffer, offset);
176}176}
177177
178pub const WriteError = std.fs.File.WriteError || Io.Cancelable;178pub const WriteStreamingError = error{} || Io.UnexpectedError || Io.Cancelable;
179179
180pub fn write(file: File, io: Io, buffer: []const u8) WriteError!usize {180pub fn write(file: File, io: Io, buffer: []const u8) WriteStreamingError!usize {
181 return @errorCast(file.pwrite(io, buffer, -1));181 return @errorCast(file.pwrite(io, buffer, -1));
182}182}
183183
184pub fn writeAll(file: File, io: Io, bytes: []const u8) WriteError!void {184pub const WritePositionalError = WriteStreamingError || error{Unseekable};
185 var index: usize = 0;
186 while (index < bytes.len) index += try file.write(io, bytes[index..]);
187}
188
189pub const PWriteError = std.fs.File.PWriteError || Io.Cancelable;
190185
191pub fn pwrite(file: File, io: Io, buffer: []const u8, offset: std.posix.off_t) PWriteError!usize {186pub fn writePositional(file: File, io: Io, buffer: []const u8, offset: u64) WritePositionalError!usize {
192 return io.vtable.pwrite(io.userdata, file, buffer, offset);187 return io.vtable.fileWritePositional(io.userdata, file, buffer, offset);
193}188}
194189
195pub fn openAbsolute(io: Io, absolute_path: []const u8, flags: OpenFlags) OpenError!File {190pub fn openAbsolute(io: Io, absolute_path: []const u8, flags: OpenFlags) OpenError!File {
lib/std/Io/Threaded.zig+25-8
...@@ -190,7 +190,8 @@ pub fn io(t: *Threaded) Io {...@@ -190,7 +190,8 @@ pub fn io(t: *Threaded) Io {
190 },190 },
191 .dirOpenFile = dirOpenFile,191 .dirOpenFile = dirOpenFile,
192 .fileClose = fileClose,192 .fileClose = fileClose,
193 .pwrite = pwrite,193 .fileWriteStreaming = fileWriteStreaming,
194 .fileWritePositional = fileWritePositional,
194 .fileReadStreaming = fileReadStreaming,195 .fileReadStreaming = fileReadStreaming,
195 .fileReadPositional = fileReadPositional,196 .fileReadPositional = fileReadPositional,
196 .fileSeekBy = fileSeekBy,197 .fileSeekBy = fileSeekBy,
...@@ -1611,14 +1612,30 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr...@@ -1611,14 +1612,30 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr
1611 }1612 }
1612}1613}
16131614
1614fn pwrite(userdata: ?*anyopaque, file: Io.File, buffer: []const u8, offset: posix.off_t) Io.File.PWriteError!usize {1615fn fileWritePositional(
1616 userdata: ?*anyopaque,
1617 file: Io.File,
1618 buffer: [][]const u8,
1619 offset: u64,
1620) Io.File.WritePositionalError!usize {
1615 const t: *Threaded = @ptrCast(@alignCast(userdata));1621 const t: *Threaded = @ptrCast(@alignCast(userdata));
1616 try t.checkCancel();1622 while (true) {
1617 const fs_file: std.fs.File = .{ .handle = file.handle };1623 try t.checkCancel();
1618 return switch (offset) {1624 _ = file;
1619 -1 => fs_file.write(buffer),1625 _ = buffer;
1620 else => fs_file.pwrite(buffer, @bitCast(offset)),1626 _ = offset;
1621 };1627 @panic("TODO");
1628 }
1629}
1630
1631fn fileWriteStreaming(userdata: ?*anyopaque, file: Io.File, buffer: [][]const u8) Io.File.WriteStreamingError!usize {
1632 const t: *Threaded = @ptrCast(@alignCast(userdata));
1633 while (true) {
1634 try t.checkCancel();
1635 _ = file;
1636 _ = buffer;
1637 @panic("TODO");
1638 }
1622}1639}
16231640
1624fn nowPosix(userdata: ?*anyopaque, clock: Io.Clock) Io.Clock.Error!Io.Timestamp {1641fn nowPosix(userdata: ?*anyopaque, clock: Io.Clock) Io.Clock.Error!Io.Timestamp {