| 2043 | } |
| 2044 | |
| 2045 | WasiExpect<void> |
| 2046 | INode::sockGetLocalAddr(__wasi_address_family_t *AddressFamilyPtr, |
| 2047 | Span<uint8_t> Address, |
| 2048 | uint16_t *PortPtr) const noexcept { |
| 2049 | EXPECTED_TRY(detail::ensureWSAStartup()); |
| 2050 | |
| 2051 | Variant<sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage> SocketAddr; |
| 2052 | socklen_t Slen = sizeof(SocketAddr); |
| 2053 | |
| 2054 | if (auto Res = getsockname(Socket, &SocketAddr.get<sockaddr>(), &Slen); |
| 2055 | unlikely(Res == SOCKET_ERROR_)) { |
| 2056 | return WasiUnexpect(detail::fromWSALastError()); |
| 2057 | } |
| 2058 | |
| 2059 | switch (SocketAddr.get<sockaddr_storage>().ss_family) { |
| 2060 | case AF_INET: { |
| 2061 | if (Address.size() < sizeof(in_addr)) { |
| 2062 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 2063 | } |
| 2064 | const auto &SocketAddr4 = SocketAddr.get<sockaddr_in>(); |
| 2065 | if (AddressFamilyPtr) { |
| 2066 | *AddressFamilyPtr = __WASI_ADDRESS_FAMILY_INET4; |
| 2067 | } |
| 2068 | if (PortPtr) { |
| 2069 | *PortPtr = ntohs(SocketAddr4.sin_port); |
| 2070 | } |
| 2071 | std::memcpy(Address.data(), &SocketAddr4.sin_addr, sizeof(in_addr)); |
| 2072 | return {}; |
| 2073 | } |
| 2074 | case AF_INET6: { |
| 2075 | if (Address.size() < sizeof(in6_addr)) { |
| 2076 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 2077 | } |
| 2078 | const auto &SocketAddr6 = SocketAddr.get<sockaddr_in6>(); |
| 2079 | if (AddressFamilyPtr) { |
| 2080 | *AddressFamilyPtr = __WASI_ADDRESS_FAMILY_INET6; |
| 2081 | } |
| 2082 | if (PortPtr) { |
| 2083 | *PortPtr = ntohs(SocketAddr6.sin6_port); |
| 2084 | } |
| 2085 | std::memcpy(Address.data(), &SocketAddr6.sin6_addr, sizeof(in6_addr)); |
| 2086 | return {}; |
| 2087 | } |
| 2088 | default: |
| 2089 | return WasiUnexpect(__WASI_ERRNO_NOSYS); |
| 2090 | } |
| 2091 | } |
| 2092 | |
| 2093 | WasiExpect<void> |
| 2094 | INode::sockGetPeerAddr(__wasi_address_family_t *AddressFamilyPtr, |
no test coverage detected