diff options
author | Adam Mitz <mitza@objectcomputing.com> | 2019-10-21 10:31:14 -0500 |
---|---|---|
committer | Adam Mitz <mitza@objectcomputing.com> | 2019-10-21 10:31:14 -0500 |
commit | c815b4b4820a4f79cb0d91702b29e4cb741f3f29 (patch) | |
tree | bfdc9b5b7b6fd6aec8df1a46bdb31f3fb402e546 /ACE/ace/SOCK_Dgram.cpp | |
parent | e12d23326b610d6aca94cab94b317575a7f9d5b4 (diff) | |
download | ATCD-c815b4b4820a4f79cb0d91702b29e4cb741f3f29.tar.gz |
sendmsg/recvmsg with msg_control: added Windows platform support
Diffstat (limited to 'ACE/ace/SOCK_Dgram.cpp')
-rw-r--r-- | ACE/ace/SOCK_Dgram.cpp | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/ACE/ace/SOCK_Dgram.cpp b/ACE/ace/SOCK_Dgram.cpp index 95b213b24d3..dc276d4b01e 100644 --- a/ACE/ace/SOCK_Dgram.cpp +++ b/ACE/ace/SOCK_Dgram.cpp @@ -314,16 +314,17 @@ ACE_SOCK_Dgram::recv (iovec iov[], ACE_TRACE ("ACE_SOCK_Dgram::recv"); msghdr recv_msg; -#if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG) +#if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG) || defined ACE_WIN32 +#define ACE_USE_MSG_CONTROL union control_buffer { cmsghdr control_msg_header; #if defined (IP_RECVDSTADDR) - u_char padding[CMSG_SPACE(sizeof (struct in_addr))]; + u_char padding[ACE_CMSG_SPACE (sizeof (in_addr))]; #elif defined (IP_PKTINFO) - u_char padding[CMSG_SPACE(sizeof (struct in_pktinfo))]; + u_char padding[ACE_CMSG_SPACE (sizeof (in_pktinfo))]; #endif #if defined (ACE_HAS_IPV6) - u_char padding6[CMSG_SPACE(sizeof (struct in6_pktinfo))]; + u_char padding6[ACE_CMSG_SPACE (sizeof (in6_pktinfo))]; #endif } cbuf; #else @@ -339,7 +340,7 @@ ACE_SOCK_Dgram::recv (iovec iov[], #endif /* ACE_HAS_SOCKADDR_MSG_NAME */ recv_msg.msg_namelen = addr.get_size (); -#if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG) +#ifdef ACE_USE_MSG_CONTROL recv_msg.msg_control = to_addr ? &cbuf : 0; recv_msg.msg_controllen = to_addr ? sizeof (cbuf) : 0; #elif !defined ACE_LACKS_SENDMSG @@ -353,24 +354,22 @@ ACE_SOCK_Dgram::recv (iovec iov[], addr.set_size (recv_msg.msg_namelen); addr.set_type (((sockaddr_in *) addr.get_addr())->sin_family); -#if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG) +#ifdef ACE_USE_MSG_CONTROL if (to_addr) { this->get_local_addr (*to_addr); if (to_addr->get_type() == AF_INET) { #if defined (IP_RECVDSTADDR) || defined (IP_PKTINFO) - for (cmsghdr *ptr = CMSG_FIRSTHDR (&recv_msg); ptr != 0; ptr = CMSG_NXTHDR (&recv_msg, ptr)) { + for (cmsghdr *ptr = ACE_CMSG_FIRSTHDR (&recv_msg); ptr; ptr = ACE_CMSG_NXTHDR (&recv_msg, ptr)) { #if defined (IP_RECVDSTADDR) - if (ptr->cmsg_level == IPPROTO_IP && - ptr->cmsg_type == IP_RECVDSTADDR) { - to_addr->set_address ((const char *)(CMSG_DATA (ptr)), + if (ptr->cmsg_level == IPPROTO_IP && ptr->cmsg_type == IP_RECVDSTADDR) { + to_addr->set_address ((const char *) (ACE_CMSG_DATA (ptr)), sizeof (struct in_addr), 0); break; } #else - if (ptr->cmsg_level == IPPROTO_IP && - ptr->cmsg_type == IP_PKTINFO) { - to_addr->set_address ((const char *)&(((struct in_pktinfo *)(CMSG_DATA (ptr)))->ipi_addr), + if (ptr->cmsg_level == IPPROTO_IP && ptr->cmsg_type == IP_PKTINFO) { + to_addr->set_address ((const char *) &(((in_pktinfo *) (ACE_CMSG_DATA (ptr)))->ipi_addr), sizeof (struct in_addr), 0); break; @@ -381,9 +380,9 @@ ACE_SOCK_Dgram::recv (iovec iov[], } #if defined (ACE_HAS_IPV6) && defined (IPV6_PKTINFO) else if (to_addr->get_type() == AF_INET6) { - for (cmsghdr *ptr = CMSG_FIRSTHDR (&recv_msg); ptr != 0; ptr = CMSG_NXTHDR (&recv_msg, ptr)) { + for (cmsghdr *ptr = ACE_CMSG_FIRSTHDR (&recv_msg); ptr; ptr = ACE_CMSG_NXTHDR (&recv_msg, ptr)) { if (ptr->cmsg_level == IPPROTO_IPV6 && ptr->cmsg_type == IPV6_PKTINFO) { - to_addr->set_address ((const char *)&(((struct in6_pktinfo *)(CMSG_DATA (ptr)))->ipi6_addr), + to_addr->set_address ((const char *) &(((in6_pktinfo *)(ACE_CMSG_DATA (ptr)))->ipi6_addr), sizeof (struct in6_addr), 0); |