in Sources/NIOPosix/Socket.swift [227:276]
func recvmsg(pointer: UnsafeMutableRawBufferPointer,
storage: inout sockaddr_storage,
storageLen: inout socklen_t,
controlBytes: inout UnsafeReceivedControlBytes) throws -> IOResult<Int> {
var vec = iovec(iov_base: pointer.baseAddress, iov_len: numericCast(pointer.count))
return try withUnsafeMutablePointer(to: &vec) { vecPtr in
return try storage.withMutableSockAddr { (sockaddrPtr, _) in
#if os(Windows)
var messageHeader =
WSAMSG(name: sockaddrPtr, namelen: storageLen,
lpBuffers: vecPtr, dwBufferCount: 1,
Control: WSABUF(len: ULONG(controlBytes.controlBytesBuffer.count),
buf: controlBytes.controlBytesBuffer.baseAddress?
.bindMemory(to: CHAR.self,
capacity: controlBytes.controlBytesBuffer.count)),
dwFlags: 0)
defer {
// We need to write back the length of the message.
storageLen = messageHeader.namelen
}
#else
var messageHeader = msghdr(msg_name: sockaddrPtr,
msg_namelen: storageLen,
msg_iov: vecPtr,
msg_iovlen: 1,
msg_control: controlBytes.controlBytesBuffer.baseAddress,
msg_controllen: .init(controlBytes.controlBytesBuffer.count),
msg_flags: 0)
defer {
// We need to write back the length of the message.
storageLen = messageHeader.msg_namelen
}
#endif
let result = try withUnsafeMutablePointer(to: &messageHeader) { messageHeader in
return try withUnsafeHandle { fd in
return try NIOBSDSocket.recvmsg(socket: fd, msgHdr: messageHeader, flags: 0)
}
}
// Only look at the control bytes if all is good.
if case .processed = result {
controlBytes.receivedControlMessages = UnsafeControlMessageCollection(messageHeader: messageHeader)
}
return result
}
}
}