| 1950 | } |
| 1951 | |
| 1952 | WasiExpect<void> INode::sockGetOpt(__wasi_sock_opt_level_t SockOptLevel, |
| 1953 | __wasi_sock_opt_so_t SockOptName, |
| 1954 | Span<uint8_t> &Flag) const noexcept { |
| 1955 | EXPECTED_TRY(detail::ensureWSAStartup()); |
| 1956 | |
| 1957 | auto SysSockOptLevel = toSockOptLevel(SockOptLevel); |
| 1958 | auto SysSockOptName = toSockOptSoName(SockOptName); |
| 1959 | socklen_t Size = static_cast<socklen_t>(Flag.size()); |
| 1960 | if (auto Res = getsockopt(Socket, SysSockOptLevel, SysSockOptName, |
| 1961 | reinterpret_cast<char *>(Flag.data()), &Size); |
| 1962 | unlikely(Res == SOCKET_ERROR_)) { |
| 1963 | return WasiUnexpect(detail::fromWSALastError()); |
| 1964 | } |
| 1965 | |
| 1966 | switch (SockOptName) { |
| 1967 | case __WASI_SOCK_OPT_SO_ERROR: { |
| 1968 | assuming(Size == sizeof(int)); |
| 1969 | Flag = Flag.first(static_cast<size_t>(Size)); |
| 1970 | auto &Error = *reinterpret_cast<int *>(Flag.data()); |
| 1971 | Error = static_cast<int>(fromErrNo(Error)); |
| 1972 | break; |
| 1973 | } |
| 1974 | case __WASI_SOCK_OPT_SO_TYPE: { |
| 1975 | assuming(Size == sizeof(int)); |
| 1976 | Flag = Flag.first(static_cast<size_t>(Size)); |
| 1977 | auto &SockType = *reinterpret_cast<int *>(Flag.data()); |
| 1978 | SockType = static_cast<int>(fromSockType(SockType)); |
| 1979 | break; |
| 1980 | } |
| 1981 | case __WASI_SOCK_OPT_SO_LINGER: { |
| 1982 | assuming(Size == sizeof(LINGER)); |
| 1983 | struct WasiLinger { |
| 1984 | int32_t l_onoff; |
| 1985 | int32_t l_linger; |
| 1986 | }; |
| 1987 | if (Flag.size() < sizeof(WasiLinger)) { |
| 1988 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 1989 | } |
| 1990 | { |
| 1991 | const auto SysLinger = *reinterpret_cast<const LINGER *>(Flag.data()); |
| 1992 | WasiLinger Linger = {SysLinger.l_onoff, SysLinger.l_linger}; |
| 1993 | *reinterpret_cast<WasiLinger *>(Flag.data()) = Linger; |
| 1994 | } |
| 1995 | Size = sizeof(WasiLinger); |
| 1996 | Flag = Flag.first(static_cast<size_t>(Size)); |
| 1997 | break; |
| 1998 | } |
| 1999 | case __WASI_SOCK_OPT_SO_SNDTIMEO: |
| 2000 | case __WASI_SOCK_OPT_SO_RCVTIMEO: { |
| 2001 | assuming(Size == sizeof(DWORD_)); |
| 2002 | struct WasiTimeVal { |
| 2003 | int64_t TVSec; |
| 2004 | int64_t TVUSec; |
| 2005 | }; |
| 2006 | if (Flag.size() < sizeof(WasiTimeVal)) { |
| 2007 | return WasiUnexpect(__WASI_ERRNO_NOMEM); |
| 2008 | } |
| 2009 | const auto SysTimeout = std::chrono::milliseconds( |
no test coverage detected