From 4a49546f59db2f90f6f4caaae1e9abccba5f6600 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 7 Jan 2026 14:40:18 -0800 Subject: [PATCH] goodbye posix.bind see #6600 --- lib/std/os/linux/IoUring/test.zig | 13 ++++++++--- lib/std/posix.zig | 36 ------------------------------- 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/lib/std/os/linux/IoUring/test.zig b/lib/std/os/linux/IoUring/test.zig index 766786547137d25d42e4b5692d6e426d6e438aed..03477fb88201361995cb8e0eaed4fb09cff2445a 100644 --- a/lib/std/os/linux/IoUring/test.zig +++ b/lib/std/os/linux/IoUring/test.zig @@ -533,7 +533,7 @@ test "sendmsg/recvmsg" { defer posix.close(server); try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1))); try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try posix.bind(server, addrAny(&address_server), @sizeOf(linux.sockaddr.in)); + try bind(server, addrAny(&address_server), @sizeOf(linux.sockaddr.in)); // set address_server to the OS-chosen IP/port. var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in); @@ -1036,7 +1036,7 @@ test "shutdown" { const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); defer posix.close(server); try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try posix.bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in)); + try bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in)); try posix.listen(server, 1); // set address to the OS-chosen IP/port. @@ -2661,7 +2661,7 @@ fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t { errdefer posix.close(listener_socket); try posix.setsockopt(listener_socket, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try posix.bind(listener_socket, addrAny(address), @sizeOf(linux.sockaddr.in)); + try bind(listener_socket, addrAny(address), @sizeOf(linux.sockaddr.in)); try posix.listen(listener_socket, kernel_backlog); // set address to the OS-chosen IP/port. @@ -2703,3 +2703,10 @@ fn socket(domain: u32, socket_type: u32, protocol: u32) !posix.socket_t { else => return error.SocketCreationFailure, } } + +fn bind(sock: posix.socket_t, addr: *const posix.sockaddr, len: posix.socklen_t) !void { + switch (posix.errno(posix.system.bind(sock, addr, len))) { + .SUCCESS => return, + else => return error.BindFailure, + } +} diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 984ba3811e1867f4540aab1e0408802773efb453..69a26ee2022fd3ad2d97eb68298cab6ddcb62bd5 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -619,42 +619,6 @@ pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]s } } -pub const BindError = error{ - SymLinkLoop, - NameTooLong, - FileNotFound, - NotDir, - ReadOnlyFileSystem, - AccessDenied, -} || std.Io.net.IpAddress.BindError; - -pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void { - if (native_os == .windows) { - @compileError("use std.Io instead"); - } else { - const rc = system.bind(sock, addr, len); - switch (errno(rc)) { - .SUCCESS => return, - .ACCES, .PERM => return error.AccessDenied, - .ADDRINUSE => return error.AddressInUse, - .BADF => unreachable, // always a race condition if this error is returned - .INVAL => unreachable, // invalid parameters - .NOTSOCK => unreachable, // invalid `sockfd` - .AFNOSUPPORT => return error.AddressFamilyUnsupported, - .ADDRNOTAVAIL => return error.AddressUnavailable, - .FAULT => unreachable, // invalid `addr` pointer - .LOOP => return error.SymLinkLoop, - .NAMETOOLONG => return error.NameTooLong, - .NOENT => return error.FileNotFound, - .NOMEM => return error.SystemResources, - .NOTDIR => return error.NotDir, - .ROFS => return error.ReadOnlyFileSystem, - else => |err| return unexpectedErrno(err), - } - } - unreachable; -} - pub const ListenError = error{ FileDescriptorNotASocket, OperationUnsupported, -- 2.54.0