@@ -182,21 +182,26 @@ fn send_message_bytes(socket: &Socket, data: &[u8], fds: &[OwnedFd]) -> std::io:
182182 frame. extend_from_slice ( & encode_length ( data. len ( ) ) ?) ;
183183 frame. extend_from_slice ( data) ;
184184
185- let mut control = vec ! [ 0u8 ; control_space_for_fds( fds. len( ) ) ] ;
186- unsafe {
187- let cmsg = control. as_mut_ptr ( ) . cast :: < libc:: cmsghdr > ( ) ;
188- ( * cmsg) . cmsg_len = libc:: CMSG_LEN ( size_of :: < RawFd > ( ) as c_uint * fds. len ( ) as c_uint ) as _ ;
189- ( * cmsg) . cmsg_level = libc:: SOL_SOCKET ;
190- ( * cmsg) . cmsg_type = libc:: SCM_RIGHTS ;
191- let data_ptr = libc:: CMSG_DATA ( cmsg) . cast :: < RawFd > ( ) ;
192- for ( i, fd) in fds. iter ( ) . enumerate ( ) {
193- data_ptr. add ( i) . write ( fd. as_raw_fd ( ) ) ;
194- }
195- }
196-
185+ let mut control;
197186 let payload = [ IoSlice :: new ( & frame) ] ;
198- let msg = MsgHdr :: new ( ) . with_buffers ( & payload) . with_control ( & control) ;
199- let mut sent = socket. sendmsg ( & msg, 0 ) ?;
187+ let mut sent = if fds. is_empty ( ) {
188+ socket. send ( & frame) ?
189+ } else {
190+ control = vec ! [ 0u8 ; control_space_for_fds( fds. len( ) ) ] ;
191+ unsafe {
192+ let cmsg = control. as_mut_ptr ( ) . cast :: < libc:: cmsghdr > ( ) ;
193+ ( * cmsg) . cmsg_len =
194+ libc:: CMSG_LEN ( size_of :: < RawFd > ( ) as c_uint * fds. len ( ) as c_uint ) as _ ;
195+ ( * cmsg) . cmsg_level = libc:: SOL_SOCKET ;
196+ ( * cmsg) . cmsg_type = libc:: SCM_RIGHTS ;
197+ let data_ptr = libc:: CMSG_DATA ( cmsg) . cast :: < RawFd > ( ) ;
198+ for ( i, fd) in fds. iter ( ) . enumerate ( ) {
199+ data_ptr. add ( i) . write ( fd. as_raw_fd ( ) ) ;
200+ }
201+ }
202+ let msg = MsgHdr :: new ( ) . with_buffers ( & payload) . with_control ( & control) ;
203+ socket. sendmsg ( & msg, 0 ) ?
204+ } ;
200205 while sent < frame. len ( ) {
201206 let bytes = socket. send ( & frame[ sent..] ) ?;
202207 if bytes == 0 {
@@ -236,8 +241,9 @@ fn send_datagram_bytes(socket: &Socket, data: &[u8], fds: &[OwnedFd]) -> std::io
236241 format ! ( "too many fds: {}" , fds. len( ) ) ,
237242 ) ) ;
238243 }
239- let mut control = vec ! [ 0u8 ; control_space_for_fds ( fds . len ( ) ) ] ;
244+ let mut control = Vec :: new ( ) ;
240245 if !fds. is_empty ( ) {
246+ control = vec ! [ 0u8 ; control_space_for_fds( fds. len( ) ) ] ;
241247 unsafe {
242248 let cmsg = control. as_mut_ptr ( ) . cast :: < libc:: cmsghdr > ( ) ;
243249 ( * cmsg) . cmsg_len =
0 commit comments