5 #if !defined (ACE_LACKS_UNIX_DOMAIN_SOCKETS)
7 #include "ace/Log_Category.h"
8 #include "ace/OS_NS_sys_socket.h"
9 #if defined (ACE_HAS_ALLOC_HOOKS)
10 # include "ace/Malloc_Base.h"
11 #endif /* ACE_HAS_ALLOC_HOOKS */
13 #if !defined (__ACE_INLINE__)
14 #include "ace/LSOCK.inl"
15 #endif /* __ACE_INLINE__ */
17 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
19 ACE_ALLOC_HOOK_DEFINE(ACE_LSOCK
)
22 ACE_LSOCK::dump (void) const
24 #if defined (ACE_HAS_DUMP)
25 ACE_TRACE ("ACE_LSOCK::dump");
27 ACELIB_DEBUG ((LM_DEBUG
, ACE_BEGIN_DUMP
, this));
28 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("aux_handle_ = %d"), this->aux_handle_
));
29 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
30 #endif /* ACE_HAS_DUMP */
33 #if defined (ACE_HAS_MSG)
34 // This routine sends an open file descriptor to <this->handle_>.
37 ACE_LSOCK::send_handle (const ACE_HANDLE handle
) const
39 ACE_TRACE ("ACE_LSOCK::send_handle");
43 #if !defined (ACE_LACKS_SENDMSG) && defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
44 char cmsgbuf
[ACE_BSD_CONTROL_MSG_LEN
];
45 cmsghdr
*cmsgptr
= (cmsghdr
*) cmsgbuf
;
46 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
50 iov
.iov_base
= (char *) a
;
51 iov
.iov_len
= sizeof a
;
52 send_msg
.msg_iov
= &iov
;
53 send_msg
.msg_iovlen
= 1;
54 send_msg
.msg_name
= 0;
55 send_msg
.msg_namelen
= 0;
57 #if defined (ACE_LACKS_SENDMSG)
58 ACE_UNUSED_ARG(handle
);
60 # if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
61 cmsgptr
->cmsg_level
= SOL_SOCKET
;
62 cmsgptr
->cmsg_type
= SCM_RIGHTS
;
63 cmsgptr
->cmsg_len
= sizeof cmsgbuf
;
64 send_msg
.msg_control
= cmsgbuf
;
65 send_msg
.msg_controllen
= sizeof cmsgbuf
;
66 ACE_HANDLE
*ph
= (ACE_HANDLE
*) CMSG_DATA (cmsgptr
);
68 send_msg
.msg_flags
= 0;
70 send_msg
.msg_accrights
= (char *) &handle
;
71 send_msg
.msg_accrightslen
= sizeof handle
;
72 # endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
73 #endif /* ACE_LACKS_SENDMSG */
75 return ACE_OS::sendmsg (this->get_handle (), &send_msg
, 0);
78 // This file receives an open file descriptor from <this->handle_>.
79 // Note, this routine returns -1 if problems occur, 0 if we recv a
80 // message that does not have file descriptor in it, and 1 otherwise.
83 ACE_LSOCK::recv_handle (ACE_HANDLE
&handle
, char *pbuf
, ssize_t
*len
) const
85 ACE_TRACE ("ACE_LSOCK::recv_handle");
90 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
91 char cmsgbuf
[ACE_BSD_CONTROL_MSG_LEN
];
92 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
94 if (pbuf
!= 0 && len
!= 0)
101 iov
.iov_base
= (char *) a
;
102 iov
.iov_len
= sizeof a
;
105 recv_msg
.msg_iov
= &iov
;
106 recv_msg
.msg_iovlen
= 1;
107 recv_msg
.msg_name
= 0;
108 recv_msg
.msg_namelen
= 0;
110 #ifndef ACE_LACKS_SENDMSG
111 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
112 recv_msg
.msg_control
= cmsgbuf
;
113 recv_msg
.msg_controllen
= sizeof cmsgbuf
;
115 recv_msg
.msg_accrights
= (char *) &handle
;
116 recv_msg
.msg_accrightslen
= sizeof handle
;
117 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
118 #endif /* ACE_LACKS_SENDMSG */
120 #if defined (ACE_HAS_STREAMS)
122 ssize_t nbytes
= ACE_OS::recvmsg (this->get_handle (), &recv_msg
, 0);
124 if (nbytes
!= ACE_INVALID_HANDLE
)
129 if (nbytes
== sizeof a
130 && ((u_char
*) iov
.iov_base
)[0] == 0xab
131 && ((u_char
*) iov
.iov_base
)[1] == 0xcd)
133 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
134 cmsghdr
*cmsgptr
= (cmsghdr
*) cmsgbuf
;
135 handle
= *(ACE_HANDLE
*) CMSG_DATA (cmsgptr
);
136 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
143 ssize_t nbytes
= ACE_OS::recvmsg (this->get_handle (),
147 if (nbytes
!= ACE_INVALID_HANDLE
)
149 if (nbytes
== sizeof a
150 && ((u_char
*) iov
.iov_base
)[0] == 0xab
151 && ((u_char
*) iov
.iov_base
)[1] == 0xcd)
153 #ifndef ACE_LACKS_SENDMSG
154 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
155 // Close down the socket that was returned by the MSG_PEEK.
156 cmsghdr
*cmsgptr
= (cmsghdr
*) cmsgbuf
;
157 ACE_HANDLE
* ph
= (ACE_HANDLE
*) CMSG_DATA (cmsgptr
);
158 ACE_OS::closesocket (*ph
);
159 recv_msg
.msg_control
= cmsgbuf
;
160 recv_msg
.msg_controllen
= sizeof cmsgbuf
;
162 recv_msg
.msg_accrights
= (char *) &handle
;
163 recv_msg
.msg_accrightslen
= sizeof handle
;
164 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
165 #endif /* ACE_LACKS_SENDMSG */
166 if (ACE_OS::recvmsg (this->get_handle (),
167 &recv_msg
, 0) == ACE_INVALID_HANDLE
)
168 return ACE_INVALID_HANDLE
;
171 #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG)
172 cmsghdr
*cmsgptr
= (cmsghdr
*) cmsgbuf
;
173 ACE_HANDLE
* ph
= (ACE_HANDLE
*) CMSG_DATA (cmsgptr
);
175 #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */
186 #endif /* ACE_HAS_STREAMS */
188 return ACE_INVALID_HANDLE
;
190 #endif /* ACE_HAS_MSG */
192 ACE_END_VERSIONED_NAMESPACE_DECL
194 #endif /* ACE_LACKS_UNIX_DOMAIN_SOCKETS */