Go to the documentation of this file.00001
00002
00003 #include "ace/LSOCK.h"
00004
00005 ACE_RCSID(ace, LSOCK, "$Id: LSOCK.cpp 88869 2010-02-06 11:29:56Z mcorino $")
00006
00007 #if !defined (ACE_LACKS_UNIX_DOMAIN_SOCKETS)
00008
00009 #include "ace/Log_Msg.h"
00010 #include "ace/OS_NS_sys_socket.h"
00011
00012 #if !defined (__ACE_INLINE__)
00013 #include "ace/LSOCK.inl"
00014 #endif
00015
00016 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00017
00018 ACE_ALLOC_HOOK_DEFINE(ACE_LSOCK)
00019
00020 void
00021 ACE_LSOCK::dump (void) const
00022 {
00023 #if defined (ACE_HAS_DUMP)
00024 ACE_TRACE ("ACE_LSOCK::dump");
00025
00026 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00027 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("aux_handle_ = %d"), this->aux_handle_));
00028 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00029 #endif
00030 }
00031
00032 #if defined (ACE_HAS_MSG)
00033
00034
00035 ssize_t
00036 ACE_LSOCK::send_handle (const ACE_HANDLE handle) const
00037 {
00038 ACE_TRACE ("ACE_LSOCK::send_handle");
00039 u_char a[2];
00040 iovec iov;
00041 msghdr send_msg;
00042 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00043 char cmsgbuf[ACE_BSD_CONTROL_MSG_LEN];
00044 cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
00045 #endif
00046
00047 a[0] = 0xab;
00048 a[1] = 0xcd;
00049 iov.iov_base = (char *) a;
00050 iov.iov_len = sizeof a;
00051 send_msg.msg_iov = &iov;
00052 send_msg.msg_iovlen = 1;
00053 send_msg.msg_name = 0;
00054 send_msg.msg_namelen = 0;
00055
00056 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00057 cmsgptr->cmsg_level = SOL_SOCKET;
00058 cmsgptr->cmsg_type = SCM_RIGHTS;
00059 cmsgptr->cmsg_len = sizeof cmsgbuf;
00060 send_msg.msg_control = cmsgbuf;
00061 send_msg.msg_controllen = sizeof cmsgbuf;
00062 ACE_HANDLE *ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
00063 *ph = handle;
00064 send_msg.msg_flags = 0;
00065 #else
00066 send_msg.msg_accrights = (char *) &handle;
00067 send_msg.msg_accrightslen = sizeof handle;
00068 #endif
00069
00070 return ACE_OS::sendmsg (this->get_handle (), &send_msg, 0);
00071 }
00072
00073
00074
00075
00076
00077 ssize_t
00078 ACE_LSOCK::recv_handle (ACE_HANDLE &handle, char *pbuf, ssize_t *len) const
00079 {
00080 ACE_TRACE ("ACE_LSOCK::recv_handle");
00081 u_char a[2];
00082 iovec iov;
00083 msghdr recv_msg;
00084
00085 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00086 char cmsgbuf[ACE_BSD_CONTROL_MSG_LEN];
00087 #endif
00088
00089 if (pbuf != 0 && len != 0)
00090 {
00091 iov.iov_base = pbuf;
00092 iov.iov_len = *len;
00093 }
00094 else
00095 {
00096 iov.iov_base = (char *) a;
00097 iov.iov_len = sizeof a;
00098 }
00099
00100 recv_msg.msg_iov = &iov;
00101 recv_msg.msg_iovlen = 1;
00102 recv_msg.msg_name = 0;
00103 recv_msg.msg_namelen = 0;
00104 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00105 recv_msg.msg_control = cmsgbuf;
00106 recv_msg.msg_controllen = sizeof cmsgbuf;
00107 #else
00108 recv_msg.msg_accrights = (char *) &handle;
00109 recv_msg.msg_accrightslen = sizeof handle;
00110 #endif
00111
00112 #if defined (ACE_HAS_STREAMS)
00113
00114 ssize_t nbytes = ACE_OS::recvmsg (this->get_handle (), &recv_msg, 0);
00115
00116 if (nbytes != ACE_INVALID_HANDLE)
00117 {
00118 if (len != 0)
00119 *len = nbytes;
00120
00121 if (nbytes == sizeof a
00122 && ((u_char *) iov.iov_base)[0] == 0xab
00123 && ((u_char *) iov.iov_base)[1] == 0xcd)
00124 {
00125 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00126 cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
00127 handle = *(ACE_HANDLE *) CMSG_DATA (cmsgptr);
00128 #endif
00129 return 1;
00130 }
00131 else
00132 return 0;
00133 }
00134 #else
00135 ssize_t nbytes = ACE_OS::recvmsg (this->get_handle (),
00136 &recv_msg,
00137 MSG_PEEK);
00138
00139 if (nbytes != ACE_INVALID_HANDLE)
00140 {
00141 if (nbytes == sizeof a
00142 && ((u_char *) iov.iov_base)[0] == 0xab
00143 && ((u_char *) iov.iov_base)[1] == 0xcd)
00144 {
00145 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00146
00147 cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
00148 ACE_HANDLE * ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
00149 ACE_OS::closesocket (*ph);
00150 recv_msg.msg_control = cmsgbuf;
00151 recv_msg.msg_controllen = sizeof cmsgbuf;
00152 #else
00153 recv_msg.msg_accrights = (char *) &handle;
00154 recv_msg.msg_accrightslen = sizeof handle;
00155 #endif
00156
00157 if (ACE_OS::recvmsg (this->get_handle (),
00158 &recv_msg, 0) == ACE_INVALID_HANDLE)
00159 return ACE_INVALID_HANDLE;
00160 else
00161 {
00162 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
00163 cmsghdr *cmsgptr = (cmsghdr *) cmsgbuf;
00164 ACE_HANDLE * ph = (ACE_HANDLE *) CMSG_DATA (cmsgptr);
00165 handle = *ph;
00166 #endif
00167 return 1;
00168 }
00169 }
00170 else
00171 {
00172 if (len != 0)
00173 *len = nbytes;
00174 return 0;
00175 }
00176 }
00177 #endif
00178 else
00179 return ACE_INVALID_HANDLE;
00180 }
00181 #endif
00182
00183 ACE_END_VERSIONED_NAMESPACE_DECL
00184
00185 #endif