zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d10a730480fef4d35c951881948baed991a803de (tree)
parent ceae9600e3ce7003907c08af82142242ca3e294c
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed,  7 Jan 2026 14:35:51 -0800

goodbye posix.socket

see #6600

Diffstat:
Mlib/std/os/linux/IoUring/test.zig | 30+++++++++++++++++++-----------
Mlib/std/posix.zig | 29-----------------------------
2 files changed, 19 insertions(+), 40 deletions(-)

diff --git a/lib/std/os/linux/IoUring/test.zig b/lib/std/os/linux/IoUring/test.zig @@ -529,7 +529,7 @@ test "sendmsg/recvmsg" { .addr = @bitCast([4]u8{ 127, 0, 0, 1 }), }; - const server = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0); + const server = try socket(address_server.family, posix.SOCK.DGRAM, 0); 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))); @@ -539,7 +539,7 @@ test "sendmsg/recvmsg" { var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in); try posix.getsockname(server, addrAny(&address_server), &slen); - const client = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0); + const client = try socket(address_server.family, posix.SOCK.DGRAM, 0); defer posix.close(client); const buffer_send = [_]u8{42} ** 128; @@ -1033,7 +1033,7 @@ test "shutdown" { // Socket bound, expect shutdown to work { - const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + 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)); @@ -1066,7 +1066,7 @@ test "shutdown" { // Socket not bound, expect to fail with ENOTCONN { - const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); defer posix.close(server); const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) { @@ -1753,7 +1753,7 @@ test "accept multishot" { var nr: usize = 4; // number of clients to connect while (nr > 0) : (nr -= 1) { // connect client - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); errdefer posix.close(client); try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in)); @@ -1862,7 +1862,7 @@ test "accept_direct" { try testing.expectEqual(@as(u32, 1), try ring.submit()); // connect - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in)); defer posix.close(client); @@ -1896,7 +1896,7 @@ test "accept_direct" { _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0); try testing.expectEqual(@as(u32, 1), try ring.submit()); // connect - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in)); defer posix.close(client); // completion with error @@ -1946,7 +1946,7 @@ test "accept_multishot_direct" { for (registered_fds) |_| { // connect - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in)); defer posix.close(client); @@ -1961,7 +1961,7 @@ test "accept_multishot_direct" { // Multishot is terminated (more flag is not set). { // connect - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in)); defer posix.close(client); // completion with error @@ -2617,7 +2617,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness { _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0); // Create a TCP client socket - const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); errdefer posix.close(client); _ = try ring.connect(0xcccccccc, client, addrAny(&address), @sizeOf(linux.sockaddr.in)); @@ -2657,7 +2657,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness { fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t { const kernel_backlog = 1; - const listener_socket = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); + const listener_socket = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); errdefer posix.close(listener_socket); try posix.setsockopt(listener_socket, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); @@ -2695,3 +2695,11 @@ inline fn skipKernelLessThan(required: std.SemanticVersion) !void { fn addrAny(addr: *linux.sockaddr.in) *linux.sockaddr { return @ptrCast(addr); } + +fn socket(domain: u32, socket_type: u32, protocol: u32) !posix.socket_t { + const rc = posix.system.socket(domain, socket_type, protocol); + switch (posix.errno(rc)) { + .SUCCESS => return @intCast(rc), + else => return error.SocketCreationFailure, + } +} diff --git a/lib/std/posix.zig b/lib/std/posix.zig @@ -579,35 +579,6 @@ pub const SocketError = error{ SocketTypeNotSupported, } || UnexpectedError; -pub fn socket(domain: u32, socket_type: u32, protocol: u32) SocketError!socket_t { - const have_sock_flags = !builtin.target.os.tag.isDarwin() and native_os != .haiku; - const filtered_sock_type = if (!have_sock_flags) - socket_type & ~@as(u32, SOCK.NONBLOCK | SOCK.CLOEXEC) - else - socket_type; - const rc = system.socket(domain, filtered_sock_type, protocol); - switch (errno(rc)) { - .SUCCESS => { - const fd: fd_t = @intCast(rc); - errdefer close(fd); - if (!have_sock_flags) { - try setSockFlags(fd, socket_type); - } - return fd; - }, - .ACCES => return error.AccessDenied, - .AFNOSUPPORT => return error.AddressFamilyUnsupported, - .INVAL => return error.ProtocolFamilyNotAvailable, - .MFILE => return error.ProcessFdQuotaExceeded, - .NFILE => return error.SystemFdQuotaExceeded, - .NOBUFS => return error.SystemResources, - .NOMEM => return error.SystemResources, - .PROTONOSUPPORT => return error.ProtocolNotSupported, - .PROTOTYPE => return error.SocketTypeNotSupported, - else => |err| return unexpectedErrno(err), - } -} - pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]socket_t { // Note to the future: we could provide a shim here for e.g. windows which // creates a listening socket, then creates a second socket and connects it