diff --git a/lib/std/Io.zig b/lib/std/Io.zig index f3a3074ca7..d1fa7afc68 100644 --- a/lib/std/Io.zig +++ b/lib/std/Io.zig @@ -667,7 +667,8 @@ pub const VTable = struct { dirOpenFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.OpenFlags) File.OpenError!File, fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat, fileClose: *const fn (?*anyopaque, File) void, - pwrite: *const fn (?*anyopaque, File, buffer: []const u8, offset: std.posix.off_t) File.PWriteError!usize, + fileWriteStreaming: *const fn (?*anyopaque, File, buffer: [][]const u8) File.WriteStreamingError!usize, + fileWritePositional: *const fn (?*anyopaque, File, buffer: [][]const u8, offset: u64) File.WritePositionalError!usize, /// Returns 0 on end of stream. fileReadStreaming: *const fn (?*anyopaque, File, data: [][]u8) File.ReadStreamingError!usize, /// Returns 0 on end of stream. diff --git a/lib/std/Io/File.zig b/lib/std/Io/File.zig index 7bd3669e2e..715667b0d4 100644 --- a/lib/std/Io/File.zig +++ b/lib/std/Io/File.zig @@ -172,24 +172,19 @@ pub const ReadStreamingError = error{ pub const ReadPositionalError = ReadStreamingError || error{Unseekable}; pub fn readPositional(file: File, io: Io, buffer: []u8, offset: u64) ReadPositionalError!usize { - return io.vtable.pread(io.userdata, file, buffer, offset); + return io.vtable.fileReadPositional(io.userdata, file, buffer, offset); } -pub const WriteError = std.fs.File.WriteError || Io.Cancelable; +pub const WriteStreamingError = error{} || Io.UnexpectedError || Io.Cancelable; -pub fn write(file: File, io: Io, buffer: []const u8) WriteError!usize { +pub fn write(file: File, io: Io, buffer: []const u8) WriteStreamingError!usize { return @errorCast(file.pwrite(io, buffer, -1)); } -pub fn writeAll(file: File, io: Io, bytes: []const u8) WriteError!void { - var index: usize = 0; - while (index < bytes.len) index += try file.write(io, bytes[index..]); -} +pub const WritePositionalError = WriteStreamingError || error{Unseekable}; -pub const PWriteError = std.fs.File.PWriteError || Io.Cancelable; - -pub fn pwrite(file: File, io: Io, buffer: []const u8, offset: std.posix.off_t) PWriteError!usize { - return io.vtable.pwrite(io.userdata, file, buffer, offset); +pub fn writePositional(file: File, io: Io, buffer: []const u8, offset: u64) WritePositionalError!usize { + return io.vtable.fileWritePositional(io.userdata, file, buffer, offset); } pub fn openAbsolute(io: Io, absolute_path: []const u8, flags: OpenFlags) OpenError!File { diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 0df6cdccff..fb70c8af79 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -190,7 +190,8 @@ pub fn io(t: *Threaded) Io { }, .dirOpenFile = dirOpenFile, .fileClose = fileClose, - .pwrite = pwrite, + .fileWriteStreaming = fileWriteStreaming, + .fileWritePositional = fileWritePositional, .fileReadStreaming = fileReadStreaming, .fileReadPositional = fileReadPositional, .fileSeekBy = fileSeekBy, @@ -1611,14 +1612,30 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr } } -fn pwrite(userdata: ?*anyopaque, file: Io.File, buffer: []const u8, offset: posix.off_t) Io.File.PWriteError!usize { +fn fileWritePositional( + userdata: ?*anyopaque, + file: Io.File, + buffer: [][]const u8, + offset: u64, +) Io.File.WritePositionalError!usize { const t: *Threaded = @ptrCast(@alignCast(userdata)); - try t.checkCancel(); - const fs_file: std.fs.File = .{ .handle = file.handle }; - return switch (offset) { - -1 => fs_file.write(buffer), - else => fs_file.pwrite(buffer, @bitCast(offset)), - }; + while (true) { + try t.checkCancel(); + _ = file; + _ = buffer; + _ = offset; + @panic("TODO"); + } +} + +fn fileWriteStreaming(userdata: ?*anyopaque, file: Io.File, buffer: [][]const u8) Io.File.WriteStreamingError!usize { + const t: *Threaded = @ptrCast(@alignCast(userdata)); + while (true) { + try t.checkCancel(); + _ = file; + _ = buffer; + @panic("TODO"); + } } fn nowPosix(userdata: ?*anyopaque, clock: Io.Clock) Io.Clock.Error!Io.Timestamp {