authorgravatar for hemisputnik@proton.mehemisputnik <hemisputnik@proton.me> 2026-07-22 11:28:31+03:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2026-10-01 10:55:12+02:00
logc4d9d65a7bfb0e675ff9b43c50332032bcec6b25
tree8f07c2d7cebf7412548621ed5d08fbaa6e388757
parent875cb2ff2f321ec40b02f8de40230a28e56d6844
signature Commit is signed but in an unrecognized format.

std.Io.net: send control data with .net_write

Add a new parameter to .net_write - control.

3 files changed, 15 insertions(+), 5 deletions(-)

lib/std/Io.zig+1
......@@ -453,6 +453,7 @@ pub const Operation = union(enum) {
453453 header: []const u8 = &.{},
454454 data: []const []const u8,
455455 splat: usize = 1,
456 control: []const u8 = &.{},
456457
457458 pub const Error = error{
458459 /// Another TCP Fast Open is already in progress.
lib/std/Io/Threaded.zig+10-5
......@@ -2590,9 +2590,9 @@ fn operate(userdata: ?*anyopaque, operation: Io.Operation) Io.Cancelable!Io.Oper
25902590 },
25912591 .net_write => |o| return .{
25922592 .net_write = (if (is_windows)
2593 netWriteWindows(o.socket_handle, o.header, o.data, o.splat)
2593 netWriteWindows(o.socket_handle, o.header, o.data, o.splat, o.control)
25942594 else
2595 netWritePosix(o.socket_handle, o.header, o.data, o.splat)) catch |err| switch (err) {
2595 netWritePosix(o.socket_handle, o.header, o.data, o.splat, o.control)) catch |err| switch (err) {
25962596 error.Canceled => |e| return e,
25972597 else => |e| e,
25982598 },
......@@ -3306,7 +3306,7 @@ fn batchDrainSubmittedWindows(t: *Threaded, b: *Io.Batch, concurrency: bool) (Io
33063306 // TODO integrate with overlapped I/O or equivalent to avoid this error
33073307 if (concurrency) return error.ConcurrencyUnavailable;
33083308 batchCompleteBlockingWindows(b, operation_userdata, .{
3309 .net_write = netWriteWindows(o.socket_handle, o.header, o.data, o.splat) catch |err| switch (err) {
3309 .net_write = netWriteWindows(o.socket_handle, o.header, o.data, o.splat, o.control) catch |err| switch (err) {
33103310 error.Canceled => |e| return e,
33113311 else => |e| e,
33123312 },
......@@ -13389,6 +13389,7 @@ fn netWritePosix(
1338913389 header: []const u8,
1339013390 data: []const []const u8,
1339113391 splat: usize,
13392 control: []const u8,
1339213393) net.Stream.Writer.Error!usize {
1339313394 if (!have_networking) return error.NetworkDown;
1339413395
......@@ -13398,8 +13399,8 @@ fn netWritePosix(
1339813399 .namelen = 0,
1339913400 .iov = &iovecs,
1340013401 .iovlen = 0,
13401 .control = null,
13402 .controllen = 0,
13402 .control = if (control.len == 0) null else @constCast(control.ptr),
13403 .controllen = @intCast(control.len),
1340313404 .flags = 0,
1340413405 };
1340513406 addBuf(&iovecs, &msg.iovlen, header);
......@@ -13481,9 +13482,13 @@ fn netWriteWindows(
1348113482 header: []const u8,
1348213483 data: []const []const u8,
1348313484 splat: usize,
13485 control: []const u8,
1348413486) net.Stream.Writer.Error!usize {
1348513487 if (!have_networking) return error.NetworkDown;
1348613488
13489 // Windows doesn't have the concept of control/ancillary data.
13490 _ = control;
13491
1348713492 var iovecs: [max_iovecs_len]windows.AFD.WSABUF(.@"const") = undefined;
1348813493 var len: u32 = 0;
1348913494 addAfdBuf(.@"const", &iovecs, &len, header);
lib/std/Io/net.zig+4
......@@ -1457,6 +1457,8 @@ pub const Stream = struct {
14571457 pub const Writer = struct {
14581458 io: Io,
14591459 interface: Io.Writer,
1460 /// Will be sent on next drain, then set back to an empty slice.
1461 control: []const u8 = &.{},
14601462 stream: Stream,
14611463 err: ?Error = null,
14621464 write_file_err: ?WriteFileError = null,
......@@ -1499,6 +1501,7 @@ pub const Stream = struct {
14991501 .header = buffered,
15001502 .data = data,
15011503 .splat = splat,
1504 .control = w.control,
15021505 } }) catch |err| {
15031506 w.err = err;
15041507 return error.WriteFailed;
......@@ -1507,6 +1510,7 @@ pub const Stream = struct {
15071510 w.err = err;
15081511 return error.WriteFailed;
15091512 };
1513 w.control = &.{};
15101514 return io_w.consume(n);
15111515 }
15121516