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" {...@@ -529,7 +529,7 @@ test "sendmsg/recvmsg" {
529 .addr = @bitCast([4]u8{ 127, 0, 0, 1 }),529 .addr = @bitCast([4]u8{ 127, 0, 0, 1 }),
530 };530 };
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);
533 defer posix.close(server);533 defer posix.close(server);
534 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1)));534 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1)));
535 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));535 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
...@@ -539,7 +539,7 @@ test "sendmsg/recvmsg" {...@@ -539,7 +539,7 @@ test "sendmsg/recvmsg" {
539 var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in);539 var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in);
540 try posix.getsockname(server, addrAny(&address_server), &slen);540 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);
543 defer posix.close(client);543 defer posix.close(client);
544544
545 const buffer_send = [_]u8{42} ** 128;545 const buffer_send = [_]u8{42} ** 128;
...@@ -1033,7 +1033,7 @@ test "shutdown" {...@@ -1033,7 +1033,7 @@ test "shutdown" {
10331033
1034 // Socket bound, expect shutdown to work1034 // Socket bound, expect shutdown to work
1035 {1035 {
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);
1037 defer posix.close(server);1037 defer posix.close(server);
1038 try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));1038 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 posix.bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in));
...@@ -1066,7 +1066,7 @@ test "shutdown" {...@@ -1066,7 +1066,7 @@ test "shutdown" {
10661066
1067 // Socket not bound, expect to fail with ENOTCONN1067 // Socket not bound, expect to fail with ENOTCONN
1068 {1068 {
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);
1070 defer posix.close(server);1070 defer posix.close(server);
10711071
1072 const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) {1072 const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) {
...@@ -1753,7 +1753,7 @@ test "accept multishot" {...@@ -1753,7 +1753,7 @@ test "accept multishot" {
1753 var nr: usize = 4; // number of clients to connect1753 var nr: usize = 4; // number of clients to connect
1754 while (nr > 0) : (nr -= 1) {1754 while (nr > 0) : (nr -= 1) {
1755 // connect client1755 // 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);
1757 errdefer posix.close(client);1757 errdefer posix.close(client);
1758 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));1758 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
17591759
...@@ -1862,7 +1862,7 @@ test "accept_direct" {...@@ -1862,7 +1862,7 @@ test "accept_direct" {
1862 try testing.expectEqual(@as(u32, 1), try ring.submit());1862 try testing.expectEqual(@as(u32, 1), try ring.submit());
18631863
1864 // connect1864 // 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);
1866 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));1866 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
1867 defer posix.close(client);1867 defer posix.close(client);
18681868
...@@ -1896,7 +1896,7 @@ test "accept_direct" {...@@ -1896,7 +1896,7 @@ test "accept_direct" {
1896 _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0);1896 _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0);
1897 try testing.expectEqual(@as(u32, 1), try ring.submit());1897 try testing.expectEqual(@as(u32, 1), try ring.submit());
1898 // connect1898 // 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);
1900 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));1900 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
1901 defer posix.close(client);1901 defer posix.close(client);
1902 // completion with error1902 // completion with error
...@@ -1946,7 +1946,7 @@ test "accept_multishot_direct" {...@@ -1946,7 +1946,7 @@ test "accept_multishot_direct" {
19461946
1947 for (registered_fds) |_| {1947 for (registered_fds) |_| {
1948 // connect1948 // 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);
1950 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));1950 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
1951 defer posix.close(client);1951 defer posix.close(client);
19521952
...@@ -1961,7 +1961,7 @@ test "accept_multishot_direct" {...@@ -1961,7 +1961,7 @@ test "accept_multishot_direct" {
1961 // Multishot is terminated (more flag is not set).1961 // Multishot is terminated (more flag is not set).
1962 {1962 {
1963 // connect1963 // 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);
1965 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));1965 try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
1966 defer posix.close(client);1966 defer posix.close(client);
1967 // completion with error1967 // completion with error
...@@ -2617,7 +2617,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {...@@ -2617,7 +2617,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
2617 _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0);2617 _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0);
26182618
2619 // Create a TCP client socket2619 // 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);
2621 errdefer posix.close(client);2621 errdefer posix.close(client);
2622 _ = try ring.connect(0xcccccccc, client, addrAny(&address), @sizeOf(linux.sockaddr.in));2622 _ = try ring.connect(0xcccccccc, client, addrAny(&address), @sizeOf(linux.sockaddr.in));
26232623
...@@ -2657,7 +2657,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {...@@ -2657,7 +2657,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
26572657
2658fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t {2658fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t {
2659 const kernel_backlog = 1;2659 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);
2661 errdefer posix.close(listener_socket);2661 errdefer posix.close(listener_socket);
26622662
2663 try posix.setsockopt(listener_socket, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));2663 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 {...@@ -2695,3 +2695,11 @@ inline fn skipKernelLessThan(required: std.SemanticVersion) !void {
2695fn addrAny(addr: *linux.sockaddr.in) *linux.sockaddr {2695fn addrAny(addr: *linux.sockaddr.in) *linux.sockaddr {
2696 return @ptrCast(addr);2696 return @ptrCast(addr);
2697}2697}
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{...@@ -579,35 +579,6 @@ pub const SocketError = error{
579 SocketTypeNotSupported,579 SocketTypeNotSupported,
580} || UnexpectedError;580} || 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
611pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]socket_t {582pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]socket_t {
612 // Note to the future: we could provide a shim here for e.g. windows which583 // Note to the future: we could provide a shim here for e.g. windows which
613 // creates a listening socket, then creates a second socket and connects it584 // creates a listening socket, then creates a second socket and connects it