| 951 | }; |
| 952 | |
| 953 | static VarAddrT sockAddressAssignHelper(__wasi_address_family_t AddrFamily, |
| 954 | const Span<const uint8_t> &Address, |
| 955 | uint16_t Port) { |
| 956 | VarAddrT Addr; |
| 957 | if (Address.size() == 0) { |
| 958 | Addr.emplace<SockEmptyAddr>(); |
| 959 | } else if (AddrFamily == __WASI_ADDRESS_FAMILY_INET4) { |
| 960 | auto &ServerAddr4 = Addr.emplace<sockaddr_in>(); |
| 961 | |
| 962 | ServerAddr4.sin_family = AF_INET; |
| 963 | ServerAddr4.sin_port = htons(Port); |
| 964 | assuming(Address.size() >= sizeof(in_addr)); |
| 965 | std::memcpy(&ServerAddr4.sin_addr, Address.data(), sizeof(in_addr)); |
| 966 | } else if (AddrFamily == __WASI_ADDRESS_FAMILY_INET6) { |
| 967 | auto &ServerAddr6 = Addr.emplace<sockaddr_in6>(); |
| 968 | |
| 969 | ServerAddr6.sin6_family = AF_INET6; |
| 970 | ServerAddr6.sin6_port = htons(Port); |
| 971 | ServerAddr6.sin6_flowinfo = 0; |
| 972 | assuming(Address.size() >= sizeof(in6_addr)); |
| 973 | std::memcpy(&ServerAddr6.sin6_addr, Address.data(), sizeof(in6_addr)); |
| 974 | } else if (AddrFamily == __WASI_ADDRESS_FAMILY_AF_UNIX) { |
| 975 | auto &ServerAddrUN = Addr.emplace<sockaddr_un>(); |
| 976 | |
| 977 | ServerAddrUN.sun_family = AF_UNIX; |
| 978 | // The length of sockaddr_un::sun_path depends on the current system. |
| 979 | // We should always check its size. |
| 980 | assuming(Address.size() >= sizeof(sockaddr_un::sun_path)); |
| 981 | std::memcpy(&ServerAddrUN.sun_path, Address.data(), |
| 982 | sizeof(sockaddr_un::sun_path)); |
| 983 | } else { |
| 984 | assumingUnreachable(); |
| 985 | } |
| 986 | |
| 987 | return Addr; |
| 988 | } |
| 989 | |
| 990 | WasiExpect<void> INode::sockBind(__wasi_address_family_t AddressFamily, |
| 991 | Span<const uint8_t> Address, |
no test coverage detected