+ if ((flags & MSG_TRUNC) == MSG_TRUNC) {
+ SOCKET h = fd_to_socket(s);
+
+ WSABUF wBuf{};
+ wBuf.buf = (CHAR*)buf;
+ wBuf.len = (ULONG)len;
+ WSAMSG wMsg{};
+ wMsg.dwBufferCount = 1;
+ wMsg.lpBuffers = &wBuf;
+ wMsg.name = from;
+ if (fromlen != nullptr) {
+ wMsg.namelen = *fromlen;
+ }
+
+ // WSARecvMsg is an extension, so we don't get
+ // the convenience of being able to call it directly, even though
+ // WSASendMsg is part of the normal API -_-...
+ LPFN_WSARECVMSG WSARecvMsg;
+ GUID WSARecgMsg_GUID = WSAID_WSARECVMSG;
+ DWORD recMsgBytes;
+ WSAIoctl(
+ h,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ &WSARecgMsg_GUID,
+ sizeof(WSARecgMsg_GUID),
+ &WSARecvMsg,
+ sizeof(WSARecvMsg),
+ &recMsgBytes,
+ nullptr,
+ nullptr);
+
+ DWORD bytesReceived;
+ int res = WSARecvMsg(h, &wMsg, &bytesReceived, nullptr, nullptr);
+ errno = translate_wsa_error(WSAGetLastError());
+ if (res == 0) {
+ return bytesReceived;
+ }
+ if (fromlen != nullptr) {
+ *fromlen = wMsg.namelen;
+ }
+ if ((wMsg.dwFlags & MSG_TRUNC) == MSG_TRUNC) {
+ return wBuf.len + 1;
+ }
+ return -1;
+ }