authorgravatar for me@gasinfinity.devGasInfinity <me@gasinfinity.dev> 2026-03-24 09:27:06+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-27 09:43:57+01:00
log1f79a9e4e300affd111b51ec172bbeff42ca755a
tree7e38b88313dc690c728f7d19a9799025d5164334
parent0d25302d43557d89b868b8925b2e98395d1ebe60

feat(Io.net): add `allow_broadcast` to `BindOptions`

* and implement it in `Threaded`, `Uring` and `Kqueue`

4 files changed, 8 insertions(+), 0 deletions(-)

lib/std/Io/Kqueue.zig+1
......@@ -1029,6 +1029,7 @@ fn netBindIp(
10291029 var storage: Io.Threaded.PosixAddress = undefined;
10301030 var addr_len = Io.Threaded.addressToPosix(address, &storage);
10311031 try posixBind(k, socket_fd, &storage.any, addr_len);
1032 if (options.allow_broadcast) try setSocketOption(k, socket_fd, posix.SOL.SOCKET, posix.SO.BROADCAST, 1);
10321033 try posixGetSockName(k, socket_fd, &storage.any, &addr_len);
10331034 return .{ .handle = socket_fd, .address = Io.Threaded.addressFromPosix(&storage) };
10341035}
lib/std/Io/Threaded.zig+2
......@@ -12196,6 +12196,7 @@ fn netBindIpPosix(
1219612196 var storage: PosixAddress = undefined;
1219712197 var addr_len = addressToPosix(address, &storage);
1219812198 try posixBind(socket_fd, &storage.any, addr_len);
12199 if (options.allow_broadcast) try setSocketOptionPosix(socket_fd, std.posix.SOL.SOCKET, std.posix.SO.BROADCAST, 1);
1219912200 try posixGetSockName(socket_fd, &storage.any, &addr_len);
1220012201 return .{ .handle = socket_fd, .address = addressFromPosix(&storage) };
1220112202}
......@@ -12212,6 +12213,7 @@ fn netBindIpWindows(
1221212213 const socket_handle = try openSocketAfd(family, options);
1221312214 errdefer windows.CloseHandle(socket_handle);
1221412215 const bound_address = try bindSocketIpAfd(socket_handle, address, .Active);
12216 if (options.allow_broadcast) try setSocketOptionAfd(socket_handle, ws2_32.SOL.SOCKET, ws2_32.SO.BROADCAST, true);
1221512217 return .{ .handle = socket_handle, .address = bound_address };
1221612218}
1221712219
lib/std/Io/Uring.zig+1
......@@ -4991,6 +4991,7 @@ fn netBindIp(
49914991 var storage: PosixAddress = undefined;
49924992 var addr_len = addressToPosix(address, &storage);
49934993 try ev.bind(&maybe_sync.cancel_region, socket_fd, &storage.any, addr_len);
4994 if (options.allow_broadcast) try ev.setsockopt(&maybe_sync.cancel_region, socket_fd, linux.SOL.SOCKET, linux.SO.BROADCAST, 1);
49944995 try ev.getsockname(try maybe_sync.enterSync(ev), socket_fd, &storage.any, &addr_len);
49954996 return .{ .handle = socket_fd, .address = addressFromPosix(&storage) };
49964997}
lib/std/Io/net.zig+4
......@@ -282,6 +282,10 @@ pub const IpAddress = union(enum) {
282282 /// In this case, an IPv4 and an IPv6 application can bind to a single port
283283 /// at the same time.
284284 ip6_only: bool = false,
285 /// Allow the socket to send datagrams to broadcast addresses.
286 /// When not enabled any attempt to send datagrams to a broadcast address
287 /// will fail with `error.AccessDenied`
288 allow_broadcast: bool = false,
285289 mode: Socket.Mode,
286290 protocol: ?Protocol = null,
287291 };