PageRenderTime 48ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/dep/acelite/ace/LSOCK.cpp

https://bitbucket.org/oregon/oregoncore/
C++ | 183 lines | 151 code | 27 blank | 5 comment | 26 complexity | 5008128c419b056683ac3c1ef26b0f8f MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, CC-BY-SA-3.0, BSD-2-Clause
  1. #include "ace/LSOCK.h"
  2. #if !defined (ACE_LACKS_UNIX_DOMAIN_SOCKETS)
  3. #include "ace/Log_Category.h"
  4. #include "ace/OS_NS_sys_socket.h"
  5. #if !defined (__ACE_INLINE__)
  6. #include "ace/LSOCK.inl"
  7. #endif /* __ACE_INLINE__ */
  8. ACE_BEGIN_VERSIONED_NAMESPACE_DECL
  9. ACE_ALLOC_HOOK_DEFINE(ACE_LSOCK)
  10. void
  11. ACE_LSOCK::dump (void) const
  12. {
  13. #if defined (ACE_HAS_DUMP)
  14. ACE_TRACE ("ACE_LSOCK::dump");
  15. ACELIB_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
  16. ACELIB_DEBUG ((LM_DEBUG, ACE_TEXT ("aux_handle_ = %d"), this->aux_handle_));
  17. ACELIB_DEBUG ((LM_DEBUG, ACE_END_DUMP));
  18. #endif /* ACE_HAS_DUMP */
  19. }
  20. #if defined (ACE_HAS_MSG)
  21. // This routine sends an open file descriptor to <this->handle_>.
  22. ssize_t
  23. ACE_LSOCK::send_handle (const ACE_HANDLE handle) const
  24. {
  25. ACE_TRACE ("ACE_LSOCK::send_handle");
  26. u_char a[2];
  27. iovec iov;
  28. msghdr send_msg;
  29. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  30. char cmsgbuf[ACE_BSD_CONTROL_MSG_LEN];
  31. cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
  32. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  33. a[0] = 0xab;
  34. a[1] = 0xcd;
  35. iov.iov_base = (char *) a;
  36. iov.iov_len = sizeof a;
  37. send_msg.msg_iov = &iov;
  38. send_msg.msg_iovlen = 1;
  39. send_msg.msg_name = 0;
  40. send_msg.msg_namelen = 0;
  41. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  42. cmsgptr->cmsg_level = SOL_SOCKET;
  43. cmsgptr->cmsg_type = SCM_RIGHTS;
  44. cmsgptr->cmsg_len = sizeof cmsgbuf;
  45. send_msg.msg_control = cmsgbuf;
  46. send_msg.msg_controllen = sizeof cmsgbuf;
  47. ACE_HANDLE *ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
  48. *ph = handle;
  49. send_msg.msg_flags = 0;
  50. #else
  51. send_msg.msg_accrights = (char *) &handle;
  52. send_msg.msg_accrightslen = sizeof handle;
  53. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  54. return ACE_OS::sendmsg (this->get_handle (), &send_msg, 0);
  55. }
  56. // This file receives an open file descriptor from <this->handle_>.
  57. // Note, this routine returns -1 if problems occur, 0 if we recv a
  58. // message that does not have file descriptor in it, and 1 otherwise.
  59. ssize_t
  60. ACE_LSOCK::recv_handle (ACE_HANDLE &handle, char *pbuf, ssize_t *len) const
  61. {
  62. ACE_TRACE ("ACE_LSOCK::recv_handle");
  63. u_char a[2];
  64. iovec iov;
  65. msghdr recv_msg;
  66. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  67. char cmsgbuf[ACE_BSD_CONTROL_MSG_LEN];
  68. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  69. if (pbuf != 0 && len != 0)
  70. {
  71. iov.iov_base = pbuf;
  72. iov.iov_len = *len;
  73. }
  74. else
  75. {
  76. iov.iov_base = (char *) a;
  77. iov.iov_len = sizeof a;
  78. }
  79. recv_msg.msg_iov = &iov;
  80. recv_msg.msg_iovlen = 1;
  81. recv_msg.msg_name = 0;
  82. recv_msg.msg_namelen = 0;
  83. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  84. recv_msg.msg_control = cmsgbuf;
  85. recv_msg.msg_controllen = sizeof cmsgbuf;
  86. #else
  87. recv_msg.msg_accrights = (char *) &handle;
  88. recv_msg.msg_accrightslen = sizeof handle;
  89. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  90. #if defined (ACE_HAS_STREAMS)
  91. ssize_t nbytes = ACE_OS::recvmsg (this->get_handle (), &recv_msg, 0);
  92. if (nbytes != ACE_INVALID_HANDLE)
  93. {
  94. if (len != 0)
  95. *len = nbytes;
  96. if (nbytes == sizeof a
  97. && ((u_char *) iov.iov_base)[0] == 0xab
  98. && ((u_char *) iov.iov_base)[1] == 0xcd)
  99. {
  100. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  101. cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
  102. handle = *(ACE_HANDLE *) CMSG_DATA (cmsgptr);
  103. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  104. return 1;
  105. }
  106. else
  107. return 0;
  108. }
  109. #else
  110. ssize_t nbytes = ACE_OS::recvmsg (this->get_handle (),
  111. &recv_msg,
  112. MSG_PEEK);
  113. if (nbytes != ACE_INVALID_HANDLE)
  114. {
  115. if (nbytes == sizeof a
  116. && ((u_char *) iov.iov_base)[0] == 0xab
  117. && ((u_char *) iov.iov_base)[1] == 0xcd)
  118. {
  119. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  120. // Close down the socket that was returned by the MSG_PEEK.
  121. cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
  122. ACE_HANDLE * ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
  123. ACE_OS::closesocket (*ph);
  124. recv_msg.msg_control = cmsgbuf;
  125. recv_msg.msg_controllen = sizeof cmsgbuf;
  126. #else
  127. recv_msg.msg_accrights = (char *) &handle;
  128. recv_msg.msg_accrightslen = sizeof handle;
  129. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  130. if (ACE_OS::recvmsg (this->get_handle (),
  131. &recv_msg, 0) == ACE_INVALID_HANDLE)
  132. return ACE_INVALID_HANDLE;
  133. else
  134. {
  135. #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
  136. cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
  137. ACE_HANDLE * ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
  138. handle = *ph;
  139. #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
  140. return 1;
  141. }
  142. }
  143. else
  144. {
  145. if (len != 0)
  146. *len = nbytes;
  147. return 0;
  148. }
  149. }
  150. #endif /* ACE_HAS_STREAMS */
  151. else
  152. return ACE_INVALID_HANDLE;
  153. }
  154. #endif /* ACE_HAS_MSG */
  155. ACE_END_VERSIONED_NAMESPACE_DECL
  156. #endif /* ACE_LACKS_UNIX_DOMAIN_SOCKETS */