authorgravatar for lukas@lalinsky.comLukas Lalinsky <lukas@lalinsky.com> 2026-06-25 11:11:04+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-06-28 11:12:34+02:00
loge0e145048d4b7b80bdbf15c78b33dea06edadc0a
tree671bd44b8bd1ea57f0aa49c27a886be15e35db28
parentb23a9579151b38e2b3539b9e4e8bbcd858cad2cb

Make it possible to implement `Io.vtable.netWriteFile`

- Fix error set to include the necessary errors - Wire it into `Io.net.Stream.Writer`

4 files changed, 34 insertions(+), 10 deletions(-)

lib/std/Io/Dispatch.zig+1-1
......@@ -4908,7 +4908,7 @@ fn netWriteFileUnavailable(
49084908 _ = header;
49094909 _ = file_reader;
49104910 _ = limit;
4911 return error.NetworkDown;
4911 return error.Unimplemented;
49124912}
49134913
49144914fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
lib/std/Io/Threaded.zig+2-1
......@@ -11378,7 +11378,8 @@ fn netWriteFile(
1137811378 _ = header;
1137911379 _ = file_reader;
1138011380 _ = limit;
11381 @panic("TODO implement netWriteFile");
11381 // TODO implement netWriteFile
11382 return error.Unimplemented;
1138211383}
1138311384
1138411385fn fileWriteFilePositional(
lib/std/Io/Uring.zig+1-1
......@@ -5183,7 +5183,7 @@ fn netWriteFileUnavailable(
51835183 _ = header;
51845184 _ = file_reader;
51855185 _ = limit;
5186 return error.NetworkDown;
5186 return error.Unimplemented;
51875187}
51885188
51895189fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
lib/std/Io/net.zig+30-7
......@@ -1350,9 +1350,17 @@ pub const Stream = struct {
13501350 SocketNotBound,
13511351 } || Io.UnexpectedError || Io.Cancelable;
13521352
1353 pub const WriteFileError = error{
1354 NetworkDown,
1355 } || Io.Cancelable || Io.UnexpectedError;
1353 pub const WriteFileError = Error || error{
1354 /// The `Io` implementation cannot offer a more efficient
1355 /// file-to-socket path; the caller should fall back to read-based
1356 /// copying. See `Io.Writer.sendFile`.
1357 Unimplemented,
1358 /// Reached the end of the file being read.
1359 EndOfStream,
1360 /// The source `File.Reader` failed; detailed diagnostics are found
1361 /// on that struct.
1362 ReadFailed,
1363 };
13561364
13571365 pub fn init(stream: Stream, io: Io, buffer: []u8) Writer {
13581366 return .{
......@@ -1381,10 +1389,25 @@ pub const Stream = struct {
13811389 }
13821390
13831391 fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize {
1384 _ = io_w;
1385 _ = file_reader;
1386 _ = limit;
1387 return error.Unimplemented; // TODO
1392 const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w));
1393 const io = w.io;
1394 const header = io_w.buffered();
1395 const handle = w.stream.socket.handle;
1396 const n = io.vtable.netWriteFile(io.userdata, handle, header, file_reader, limit) catch |err| switch (err) {
1397 error.Canceled => {
1398 w.err = error.Canceled;
1399 return error.WriteFailed;
1400 },
1401 error.EndOfStream,
1402 error.Unimplemented,
1403 error.ReadFailed,
1404 => |e| return e,
1405 else => |e| {
1406 w.write_file_err = e;
1407 return error.WriteFailed;
1408 },
1409 };
1410 return io_w.consume(n);
13881411 }
13891412 };
13901413