| ... | ... | @@ -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 | 622 | fn setSockFlags(sock: socket_t, flags: u32) !void { |
| 674 | 623 | if ((flags & SOCK.CLOEXEC) != 0) { |
| 675 | 624 | if (native_os == .windows) { |