authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-07 14:35:51-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-07 17:33:06-08:00
logd10a730480fef4d35c951881948baed991a803de
tree331e6baf1a05f280f3e56803f84c427f05c28afe
parentceae9600e3ce7003907c08af82142242ca3e294c

goodbye posix.socket

see #6600

2 files changed, 19 insertions(+), 40 deletions(-)

lib/std/os/linux/IoUring/test.zig+19-11
......@@ -529,7 +529,7 @@ test "sendmsg/recvmsg" {
529529 .addr = @bitCast([4]u8{ 127, 0, 0, 1 }),
530530 };
531531
532 const server = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
532 const server = try socket(address_server.family, posix.SOCK.DGRAM, 0);
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)));
......@@ -539,7 +539,7 @@ test "sendmsg/recvmsg" {
539539 var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in);
540540 try posix.getsockname(server, addrAny(&address_server), &slen);
541541
542 const client = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
542 const client = try socket(address_server.family, posix.SOCK.DGRAM, 0);
543543 defer posix.close(client);
544544
545545 const buffer_send = [_]u8{42} ** 128;
......@@ -1033,7 +1033,7 @@ test "shutdown" {
10331033
10341034 // Socket bound, expect shutdown to work
10351035 {
1036 const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1036 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)));
10391039 try posix.bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in));
......@@ -1066,7 +1066,7 @@ test "shutdown" {
10661066
10671067 // Socket not bound, expect to fail with ENOTCONN
10681068 {
1069 const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1069 const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
10701070 defer posix.close(server);
10711071
10721072 const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) {
......@@ -1753,7 +1753,7 @@ test "accept multishot" {
17531753 var nr: usize = 4; // number of clients to connect
17541754 while (nr > 0) : (nr -= 1) {
17551755 // connect client
1756 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1756 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
17571757 errdefer posix.close(client);
17581758 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
17591759
......@@ -1862,7 +1862,7 @@ test "accept_direct" {
18621862 try testing.expectEqual(@as(u32, 1), try ring.submit());
18631863
18641864 // connect
1865 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1865 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
18661866 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
18671867 defer posix.close(client);
18681868
......@@ -1896,7 +1896,7 @@ test "accept_direct" {
18961896 _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0);
18971897 try testing.expectEqual(@as(u32, 1), try ring.submit());
18981898 // connect
1899 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1899 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
19001900 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
19011901 defer posix.close(client);
19021902 // completion with error
......@@ -1946,7 +1946,7 @@ test "accept_multishot_direct" {
19461946
19471947 for (registered_fds) |_| {
19481948 // connect
1949 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1949 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
19501950 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
19511951 defer posix.close(client);
19521952
......@@ -1961,7 +1961,7 @@ test "accept_multishot_direct" {
19611961 // Multishot is terminated (more flag is not set).
19621962 {
19631963 // connect
1964 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
1964 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
19651965 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
19661966 defer posix.close(client);
19671967 // completion with error
......@@ -2617,7 +2617,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
26172617 _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0);
26182618
26192619 // Create a TCP client socket
2620 const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
2620 const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
26212621 errdefer posix.close(client);
26222622 _ = try ring.connect(0xcccccccc, client, addrAny(&address), @sizeOf(linux.sockaddr.in));
26232623
......@@ -2657,7 +2657,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
26572657
26582658fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t {
26592659 const kernel_backlog = 1;
2660 const listener_socket = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
2660 const listener_socket = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
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)));
......@@ -2695,3 +2695,11 @@ inline fn skipKernelLessThan(required: std.SemanticVersion) !void {
26952695fn addrAny(addr: *linux.sockaddr.in) *linux.sockaddr {
26962696 return @ptrCast(addr);
26972697}
2698
2699fn socket(domain: u32, socket_type: u32, protocol: u32) !posix.socket_t {
2700 const rc = posix.system.socket(domain, socket_type, protocol);
2701 switch (posix.errno(rc)) {
2702 .SUCCESS => return @intCast(rc),
2703 else => return error.SocketCreationFailure,
2704 }
2705}
lib/std/posix.zig-29
......@@ -579,35 +579,6 @@ pub const SocketError = error{
579579 SocketTypeNotSupported,
580580} || UnexpectedError;
581581
582pub fn socket(domain: u32, socket_type: u32, protocol: u32) SocketError!socket_t {
583 const have_sock_flags = !builtin.target.os.tag.isDarwin() and native_os != .haiku;
584 const filtered_sock_type = if (!have_sock_flags)
585 socket_type & ~@as(u32, SOCK.NONBLOCK | SOCK.CLOEXEC)
586 else
587 socket_type;
588 const rc = system.socket(domain, filtered_sock_type, protocol);
589 switch (errno(rc)) {
590 .SUCCESS => {
591 const fd: fd_t = @intCast(rc);
592 errdefer close(fd);
593 if (!have_sock_flags) {
594 try setSockFlags(fd, socket_type);
595 }
596 return fd;
597 },
598 .ACCES => return error.AccessDenied,
599 .AFNOSUPPORT => return error.AddressFamilyUnsupported,
600 .INVAL => return error.ProtocolFamilyNotAvailable,
601 .MFILE => return error.ProcessFdQuotaExceeded,
602 .NFILE => return error.SystemFdQuotaExceeded,
603 .NOBUFS => return error.SystemResources,
604 .NOMEM => return error.SystemResources,
605 .PROTONOSUPPORT => return error.ProtocolNotSupported,
606 .PROTOTYPE => return error.SocketTypeNotSupported,
607 else => |err| return unexpectedErrno(err),
608 }
609}
610
611582pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]socket_t {
612583 // Note to the future: we could provide a shim here for e.g. windows which
613584 // creates a listening socket, then creates a second socket and connects it