| ... | ... | @@ -773,71 +773,6 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne |
| 773 | 773 | } |
| 774 | 774 | } |
| 775 | 775 | |
| 776 | | pub const GetSockOptError = error{ |
| 777 | | /// The calling process does not have the appropriate privileges. |
| 778 | | AccessDenied, |
| 779 | | |
| 780 | | /// The option is not supported by the protocol. |
| 781 | | InvalidProtocolOption, |
| 782 | | |
| 783 | | /// Insufficient resources are available in the system to complete the call. |
| 784 | | SystemResources, |
| 785 | | } || UnexpectedError; |
| 786 | | |
| 787 | | pub fn getsockopt(fd: socket_t, level: i32, optname: u32, opt: []u8) GetSockOptError!void { |
| 788 | | var len: socklen_t = @intCast(opt.len); |
| 789 | | switch (errno(system.getsockopt(fd, level, optname, opt.ptr, &len))) { |
| 790 | | .SUCCESS => { |
| 791 | | std.debug.assert(len == opt.len); |
| 792 | | }, |
| 793 | | .BADF => unreachable, |
| 794 | | .NOTSOCK => unreachable, |
| 795 | | .INVAL => unreachable, |
| 796 | | .FAULT => unreachable, |
| 797 | | .NOPROTOOPT => return error.InvalidProtocolOption, |
| 798 | | .NOMEM => return error.SystemResources, |
| 799 | | .NOBUFS => return error.SystemResources, |
| 800 | | .ACCES => return error.AccessDenied, |
| 801 | | else => |err| return unexpectedErrno(err), |
| 802 | | } |
| 803 | | } |
| 804 | | |
| 805 | | pub fn getsockoptError(sockfd: fd_t) ConnectError!void { |
| 806 | | var err_code: i32 = undefined; |
| 807 | | var size: u32 = @sizeOf(u32); |
| 808 | | const rc = system.getsockopt(sockfd, SOL.SOCKET, SO.ERROR, @ptrCast(&err_code), &size); |
| 809 | | assert(size == 4); |
| 810 | | switch (errno(rc)) { |
| 811 | | .SUCCESS => switch (@as(E, @enumFromInt(err_code))) { |
| 812 | | .SUCCESS => return, |
| 813 | | .ACCES => return error.AccessDenied, |
| 814 | | .PERM => return error.PermissionDenied, |
| 815 | | .ADDRINUSE => return error.AddressInUse, |
| 816 | | .ADDRNOTAVAIL => return error.AddressUnavailable, |
| 817 | | .AFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 818 | | .AGAIN => return error.SystemResources, |
| 819 | | .ALREADY => return error.ConnectionPending, |
| 820 | | .BADF => unreachable, // sockfd is not a valid open file descriptor. |
| 821 | | .CONNREFUSED => return error.ConnectionRefused, |
| 822 | | .FAULT => unreachable, // The socket structure address is outside the user's address space. |
| 823 | | .ISCONN => return error.AlreadyConnected, // The socket is already connected. |
| 824 | | .HOSTUNREACH => return error.NetworkUnreachable, |
| 825 | | .NETUNREACH => return error.NetworkUnreachable, |
| 826 | | .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket. |
| 827 | | .PROTOTYPE => unreachable, // The socket type does not support the requested communications protocol. |
| 828 | | .TIMEDOUT => return error.Timeout, |
| 829 | | .CONNRESET => return error.ConnectionResetByPeer, |
| 830 | | else => |err| return unexpectedErrno(err), |
| 831 | | }, |
| 832 | | .BADF => unreachable, // The argument sockfd is not a valid file descriptor. |
| 833 | | .FAULT => unreachable, // The address pointed to by optval or optlen is not in a valid part of the process address space. |
| 834 | | .INVAL => unreachable, |
| 835 | | .NOPROTOOPT => unreachable, // The option is unknown at the level indicated. |
| 836 | | .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket. |
| 837 | | else => |err| return unexpectedErrno(err), |
| 838 | | } |
| 839 | | } |
| 840 | | |
| 841 | 776 | pub const FStatError = std.Io.File.StatError; |
| 842 | 777 | |
| 843 | 778 | /// Return information about a file descriptor. |