| ... | @@ -619,57 +619,6 @@ pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]s | ... | @@ -619,57 +619,6 @@ pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]s |
| 619 | } | 619 | } |
| 620 | } | 620 | } |
| 621 | | 621 | |
| 622 | pub const AcceptError = std.Io.net.Server.AcceptError; | | |
| 623 | | | |
| 624 | pub fn accept( | | |
| 625 | sock: socket_t, | | |
| 626 | addr: ?*sockaddr, | | |
| 627 | addr_size: ?*socklen_t, | | |
| 628 | flags: u32, | | |
| 629 | ) AcceptError!socket_t { | | |
| 630 | const have_accept4 = !(builtin.target.os.tag.isDarwin() or native_os == .windows or native_os == .haiku); | | |
| 631 | assert(0 == (flags & ~@as(u32, SOCK.NONBLOCK | SOCK.CLOEXEC))); // Unsupported flag(s) | | |
| 632 | | | |
| 633 | const accepted_sock: socket_t = while (true) { | | |
| 634 | const rc = if (have_accept4) | | |
| 635 | system.accept4(sock, addr, addr_size, flags) | | |
| 636 | else | | |
| 637 | system.accept(sock, addr, addr_size); | | |
| 638 | | | |
| 639 | if (native_os == .windows) { | | |
| 640 | @compileError("use std.Io instead"); | | |
| 641 | } else { | | |
| 642 | switch (errno(rc)) { | | |
| 643 | .SUCCESS => break @intCast(rc), | | |
| 644 | .INTR => continue, | | |
| 645 | .AGAIN => return error.WouldBlock, | | |
| 646 | .BADF => unreachable, // always a race condition | | |
| 647 | .CONNABORTED => return error.ConnectionAborted, | | |
| 648 | .FAULT => unreachable, | | |
| 649 | .INVAL => return error.SocketNotListening, | | |
| 650 | .NOTSOCK => unreachable, | | |
| 651 | .MFILE => return error.ProcessFdQuotaExceeded, | | |
| 652 | .NFILE => return error.SystemFdQuotaExceeded, | | |
| 653 | .NOBUFS => return error.SystemResources, | | |
| 654 | .NOMEM => return error.SystemResources, | | |
| 655 | .OPNOTSUPP => unreachable, | | |
| 656 | .PROTO => return error.ProtocolFailure, | | |
| 657 | .PERM => return error.BlockedByFirewall, | | |
| 658 | else => |err| return unexpectedErrno(err), | | |
| 659 | } | | |
| 660 | } | | |
| 661 | }; | | |
| 662 | | | |
| 663 | errdefer switch (native_os) { | | |
| 664 | .windows => windows.closesocket(accepted_sock) catch unreachable, | | |
| 665 | else => close(accepted_sock), | | |
| 666 | }; | | |
| 667 | if (!have_accept4) { | | |
| 668 | try setSockFlags(accepted_sock, flags); | | |
| 669 | } | | |
| 670 | return accepted_sock; | | |
| 671 | } | | |
| 672 | | | |
| 673 | fn setSockFlags(sock: socket_t, flags: u32) !void { | 622 | fn setSockFlags(sock: socket_t, flags: u32) !void { |
| 674 | if ((flags & SOCK.CLOEXEC) != 0) { | 623 | if ((flags & SOCK.CLOEXEC) != 0) { |
| 675 | if (native_os == .windows) { | 624 | if (native_os == .windows) { |