authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-07 14:40:18-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-07 17:33:06-08:00
log4a49546f59db2f90f6f4caaae1e9abccba5f6600
treeacefa97930b375d8033de1257e10a60617c356a2
parented4dfdcff0d3affb950f5277c2303407d002135a

goodbye posix.bind

see #6600

2 files changed, 10 insertions(+), 39 deletions(-)

lib/std/os/linux/IoUring/test.zig+10-3
......@@ -533,7 +533,7 @@ test "sendmsg/recvmsg" {
533533 defer posix.close(server);
534534 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1)));
535535 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
536 try posix.bind(server, addrAny(&address_server), @sizeOf(linux.sockaddr.in));
536 try bind(server, addrAny(&address_server), @sizeOf(linux.sockaddr.in));
537537
538538 // set address_server to the OS-chosen IP/port.
539539 var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in);
......@@ -1036,7 +1036,7 @@ test "shutdown" {
10361036 const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
10371037 defer posix.close(server);
10381038 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
1039 try posix.bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in));
1039 try bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in));
10401040 try posix.listen(server, 1);
10411041
10421042 // set address to the OS-chosen IP/port.
......@@ -2661,7 +2661,7 @@ fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t {
26612661 errdefer posix.close(listener_socket);
26622662
26632663 try posix.setsockopt(listener_socket, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
2664 try posix.bind(listener_socket, addrAny(address), @sizeOf(linux.sockaddr.in));
2664 try bind(listener_socket, addrAny(address), @sizeOf(linux.sockaddr.in));
26652665 try posix.listen(listener_socket, kernel_backlog);
26662666
26672667 // set address to the OS-chosen IP/port.
......@@ -2703,3 +2703,10 @@ fn socket(domain: u32, socket_type: u32, protocol: u32) !posix.socket_t {
27032703 else => return error.SocketCreationFailure,
27042704 }
27052705}
2706
2707fn bind(sock: posix.socket_t, addr: *const posix.sockaddr, len: posix.socklen_t) !void {
2708 switch (posix.errno(posix.system.bind(sock, addr, len))) {
2709 .SUCCESS => return,
2710 else => return error.BindFailure,
2711 }
2712}
lib/std/posix.zig-36
......@@ -619,42 +619,6 @@ pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]s
619619 }
620620}
621621
622pub const BindError = error{
623 SymLinkLoop,
624 NameTooLong,
625 FileNotFound,
626 NotDir,
627 ReadOnlyFileSystem,
628 AccessDenied,
629} || std.Io.net.IpAddress.BindError;
630
631pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void {
632 if (native_os == .windows) {
633 @compileError("use std.Io instead");
634 } else {
635 const rc = system.bind(sock, addr, len);
636 switch (errno(rc)) {
637 .SUCCESS => return,
638 .ACCES, .PERM => return error.AccessDenied,
639 .ADDRINUSE => return error.AddressInUse,
640 .BADF => unreachable, // always a race condition if this error is returned
641 .INVAL => unreachable, // invalid parameters
642 .NOTSOCK => unreachable, // invalid `sockfd`
643 .AFNOSUPPORT => return error.AddressFamilyUnsupported,
644 .ADDRNOTAVAIL => return error.AddressUnavailable,
645 .FAULT => unreachable, // invalid `addr` pointer
646 .LOOP => return error.SymLinkLoop,
647 .NAMETOOLONG => return error.NameTooLong,
648 .NOENT => return error.FileNotFound,
649 .NOMEM => return error.SystemResources,
650 .NOTDIR => return error.NotDir,
651 .ROFS => return error.ReadOnlyFileSystem,
652 else => |err| return unexpectedErrno(err),
653 }
654 }
655 unreachable;
656}
657
658622pub const ListenError = error{
659623 FileDescriptorNotASocket,
660624 OperationUnsupported,