| ... | @@ -993,7 +993,7 @@ pub const Reader = struct { | ... | @@ -993,7 +993,7 @@ pub const Reader = struct { |
| 993 | }; | 993 | }; |
| 994 | var remaining = std.math.cast(u64, offset) orelse return seek_err; | 994 | var remaining = std.math.cast(u64, offset) orelse return seek_err; |
| 995 | while (remaining > 0) { | 995 | while (remaining > 0) { |
| 996 | const n = discard(r, .limited(remaining)) catch |err| { | 996 | const n = discard(&r.interface, .limited(remaining)) catch |err| { |
| 997 | r.seek_err = err; | 997 | r.seek_err = err; |
| 998 | return err; | 998 | return err; |
| 999 | }; | 999 | }; |
| ... | @@ -1252,25 +1252,29 @@ pub const Writer = struct { | ... | @@ -1252,25 +1252,29 @@ pub const Writer = struct { |
| 1252 | /// vectors through the underlying write calls as possible. | 1252 | /// vectors through the underlying write calls as possible. |
| 1253 | const max_buffers_len = 16; | 1253 | const max_buffers_len = 16; |
| 1254 | | 1254 | |
| 1255 | pub fn init(file: File, buffer: []u8) std.io.Writer { | 1255 | pub fn init(file: File, buffer: []u8) Writer { |
| 1256 | return initMode(file, buffer, .positional); | 1256 | return initMode(file, buffer, .positional); |
| 1257 | } | 1257 | } |
| 1258 | | 1258 | |
| 1259 | pub fn initMode(file: File, buffer: []u8, init_mode: Writer.Mode) std.io.Writer { | 1259 | pub fn initMode(file: File, buffer: []u8, init_mode: Writer.Mode) Writer { |
| 1260 | return .{ | 1260 | return .{ |
| 1261 | .file = file, | 1261 | .file = file, |
| 1262 | .interface = .{ | 1262 | .interface = initInterface(buffer), |
| 1263 | .context = undefined, | | |
| 1264 | .vtable = &.{ | | |
| 1265 | .drain = drain, | | |
| 1266 | .sendFile = sendFile, | | |
| 1267 | }, | | |
| 1268 | .buffer = buffer, | | |
| 1269 | }, | | |
| 1270 | .mode = init_mode, | 1263 | .mode = init_mode, |
| 1271 | }; | 1264 | }; |
| 1272 | } | 1265 | } |
| 1273 | | 1266 | |
| | 1267 | pub fn initInterface(buffer: []u8) std.io.Writer { |
| | 1268 | return .{ |
| | 1269 | .context = undefined, |
| | 1270 | .vtable = &.{ |
| | 1271 | .drain = drain, |
| | 1272 | .sendFile = sendFile, |
| | 1273 | }, |
| | 1274 | .buffer = buffer, |
| | 1275 | }; |
| | 1276 | } |
| | 1277 | |
| 1274 | pub fn moveToReader(w: *Writer) Reader { | 1278 | pub fn moveToReader(w: *Writer) Reader { |
| 1275 | defer w.* = undefined; | 1279 | defer w.* = undefined; |
| 1276 | return .{ | 1280 | return .{ |
| ... | @@ -1335,7 +1339,11 @@ pub const Writer = struct { | ... | @@ -1335,7 +1339,11 @@ pub const Writer = struct { |
| 1335 | }; | 1339 | }; |
| 1336 | } | 1340 | } |
| 1337 | | 1341 | |
| 1338 | pub fn sendFile(io_writer: *Writer, file_reader: *Reader, limit: std.io.Limit) std.io.Writer.FileError!usize { | 1342 | pub fn sendFile( |
| | 1343 | io_writer: *std.io.Writer, |
| | 1344 | file_reader: *Reader, |
| | 1345 | limit: std.io.Limit, |
| | 1346 | ) std.io.Writer.FileError!usize { |
| 1339 | const w: *Writer = @fieldParentPtr("interface", io_writer); | 1347 | const w: *Writer = @fieldParentPtr("interface", io_writer); |
| 1340 | const out_fd = w.file.handle; | 1348 | const out_fd = w.file.handle; |
| 1341 | const in_fd = file_reader.file.handle; | 1349 | const in_fd = file_reader.file.handle; |