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(...@@ -4908,7 +4908,7 @@ fn netWriteFileUnavailable(
4908 _ = header;4908 _ = header;
4909 _ = file_reader;4909 _ = file_reader;
4910 _ = limit;4910 _ = limit;
4911 return error.NetworkDown;4911 return error.Unimplemented;
4912}4912}
49134913
4914fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {4914fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
lib/std/Io/Threaded.zig+2-1
...@@ -11378,7 +11378,8 @@ fn netWriteFile(...@@ -11378,7 +11378,8 @@ fn netWriteFile(
11378 _ = header;11378 _ = header;
11379 _ = file_reader;11379 _ = file_reader;
11380 _ = limit;11380 _ = limit;
11381 @panic("TODO implement netWriteFile");11381 // TODO implement netWriteFile
11382 return error.Unimplemented;
11382}11383}
1138311384
11384fn fileWriteFilePositional(11385fn fileWriteFilePositional(
lib/std/Io/Uring.zig+1-1
...@@ -5183,7 +5183,7 @@ fn netWriteFileUnavailable(...@@ -5183,7 +5183,7 @@ fn netWriteFileUnavailable(
5183 _ = header;5183 _ = header;
5184 _ = file_reader;5184 _ = file_reader;
5185 _ = limit;5185 _ = limit;
5186 return error.NetworkDown;5186 return error.Unimplemented;
5187}5187}
51885188
5189fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {5189fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
lib/std/Io/net.zig+30-7
...@@ -1350,9 +1350,17 @@ pub const Stream = struct {...@@ -1350,9 +1350,17 @@ pub const Stream = struct {
1350 SocketNotBound,1350 SocketNotBound,
1351 } || Io.UnexpectedError || Io.Cancelable;1351 } || Io.UnexpectedError || Io.Cancelable;
13521352
1353 pub const WriteFileError = error{1353 pub const WriteFileError = Error || error{
1354 NetworkDown,1354 /// The `Io` implementation cannot offer a more efficient
1355 } || Io.Cancelable || Io.UnexpectedError;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
1357 pub fn init(stream: Stream, io: Io, buffer: []u8) Writer {1365 pub fn init(stream: Stream, io: Io, buffer: []u8) Writer {
1358 return .{1366 return .{
...@@ -1381,10 +1389,25 @@ pub const Stream = struct {...@@ -1381,10 +1389,25 @@ pub const Stream = struct {
1381 }1389 }
13821390
1383 fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize {1391 fn sendFile(io_w: *Io.Writer, file_reader: *Io.File.Reader, limit: Io.Limit) Io.Writer.FileError!usize {
1384 _ = io_w;1392 const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w));
1385 _ = file_reader;1393 const io = w.io;
1386 _ = limit;1394 const header = io_w.buffered();
1387 return error.Unimplemented; // TODO1395 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);
1388 }1411 }
1389 };1412 };
13901413