MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / sockGetOpt

Method sockGetOpt

lib/host/wasi/inode-win.cpp:1952–2025  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1950}
1951
1952WasiExpect<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(

Callers 1

bodyMethod · 0.45

Calls 13

ensureWSAStartupFunction · 0.85
unlikelyFunction · 0.85
WasiUnexpectFunction · 0.85
fromWSALastErrorFunction · 0.85
firstMethod · 0.80
countMethod · 0.80
toSockOptLevelFunction · 0.70
toSockOptSoNameFunction · 0.70
fromErrNoFunction · 0.70
fromSockTypeFunction · 0.70
EXPECTED_TRYFunction · 0.50
sizeMethod · 0.45

Tested by

no test coverage detected