| 2091 | } |
| 2092 | |
| 2093 | WasiExpect<void> |
| 2094 | INode::sockGetPeerAddr(__wasi_address_family_t *AddressFamilyPtr, |
| 2095 | Span<uint8_t> Address, |
| 2096 | uint16_t *PortPtr) const noexcept { |
| 2097 | EXPECTED_TRY(detail::ensureWSAStartup()); |
| 2098 | |
| 2099 | Variant<sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage> SocketAddr; |
| 2100 | socklen_t Slen = sizeof(SocketAddr); |
| 2101 | |
| 2102 | if (auto Res = getpeername(Socket, &SocketAddr.get<sockaddr>(), &Slen); |
| 2103 | unlikely(Res == SOCKET_ERROR_)) { |
| 2104 | return WasiUnexpect(detail::fromWSALastError()); |
| 2105 | } |
| 2106 | |
| 2107 | switch (SocketAddr.get<sockaddr_storage>().ss_family) { |
| 2108 | case AF_INET: { |
| 2109 | if (Address.size() < sizeof(in_addr)) { |
| 2110 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 2111 | } |
| 2112 | const auto &SocketAddr4 = SocketAddr.get<sockaddr_in>(); |
| 2113 | if (AddressFamilyPtr) { |
| 2114 | *AddressFamilyPtr = __WASI_ADDRESS_FAMILY_INET4; |
| 2115 | } |
| 2116 | if (PortPtr) { |
| 2117 | *PortPtr = ntohs(SocketAddr4.sin_port); |
| 2118 | } |
| 2119 | std::memcpy(Address.data(), &SocketAddr4.sin_addr, sizeof(in_addr)); |
| 2120 | return {}; |
| 2121 | } |
| 2122 | case AF_INET6: { |
| 2123 | if (Address.size() < sizeof(in6_addr)) { |
| 2124 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 2125 | } |
| 2126 | const auto &SocketAddr6 = SocketAddr.get<sockaddr_in6>(); |
| 2127 | if (AddressFamilyPtr) { |
| 2128 | *AddressFamilyPtr = __WASI_ADDRESS_FAMILY_INET6; |
| 2129 | } |
| 2130 | if (PortPtr) { |
| 2131 | *PortPtr = ntohs(SocketAddr6.sin6_port); |
| 2132 | } |
| 2133 | std::memcpy(Address.data(), &SocketAddr6.sin6_addr, sizeof(in6_addr)); |
| 2134 | return {}; |
| 2135 | } |
| 2136 | default: |
| 2137 | return WasiUnexpect(__WASI_ERRNO_NOSYS); |
| 2138 | } |
| 2139 | } |
| 2140 | |
| 2141 | WasiExpect<__wasi_filetype_t> INode::filetype() const noexcept { |
| 2142 | switch (fastGetFileType(Type, Handle)) { |
no test coverage detected