summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK_Dgram.cpp
diff options
context:
space:
mode:
authorAdam Mitz <mitza@objectcomputing.com>2019-10-21 10:31:14 -0500
committerAdam Mitz <mitza@objectcomputing.com>2019-10-21 10:31:14 -0500
commitc815b4b4820a4f79cb0d91702b29e4cb741f3f29 (patch)
treebfdc9b5b7b6fd6aec8df1a46bdb31f3fb402e546 /ACE/ace/SOCK_Dgram.cpp
parente12d23326b610d6aca94cab94b317575a7f9d5b4 (diff)
downloadATCD-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.cpp29
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);