@@ -72,7 +72,7 @@ use libc::{in6_addr, in_addr};
72
72
73
73
use crate :: { Domain , Protocol , SockAddr , TcpKeepalive , Type } ;
74
74
#[ cfg( not( target_os = "redox" ) ) ]
75
- use crate :: { MsgHdr , RecvFlags } ;
75
+ use crate :: { MsgHdr , MsgHdrMut , RecvFlags } ;
76
76
77
77
pub ( crate ) use libc:: c_int;
78
78
@@ -982,7 +982,9 @@ pub(crate) fn recv_vectored(
982
982
bufs : & mut [ crate :: MaybeUninitSlice < ' _ > ] ,
983
983
flags : c_int ,
984
984
) -> io:: Result < ( usize , RecvFlags ) > {
985
- recvmsg ( fd, ptr:: null_mut ( ) , bufs, flags) . map ( |( n, _, recv_flags) | ( n, recv_flags) )
985
+ let mut msg = MsgHdrMut :: new ( ) . with_buffers ( bufs) ;
986
+ let n = recvmsg ( fd, & mut msg, flags) ?;
987
+ Ok ( ( n, msg. flags ( ) ) )
986
988
}
987
989
988
990
#[ cfg( not( target_os = "redox" ) ) ]
@@ -991,42 +993,25 @@ pub(crate) fn recv_from_vectored(
991
993
bufs : & mut [ crate :: MaybeUninitSlice < ' _ > ] ,
992
994
flags : c_int ,
993
995
) -> io:: Result < ( usize , RecvFlags , SockAddr ) > {
994
- // Safety: `recvmsg` initialises the address storage and we set the length
996
+ let mut msg = MsgHdrMut :: new ( ) . with_buffers ( bufs) ;
997
+ // SAFETY: `recvmsg` initialises the address storage and we set the length
995
998
// manually.
996
- unsafe {
999
+ let ( n , addr ) = unsafe {
997
1000
SockAddr :: try_init ( |storage, len| {
998
- recvmsg ( fd, storage, bufs, flags) . map ( |( n, addrlen, recv_flags) | {
999
- // Set the correct address length.
1000
- * len = addrlen;
1001
- ( n, recv_flags)
1002
- } )
1003
- } )
1004
- }
1005
- . map ( |( ( n, recv_flags) , addr) | ( n, recv_flags, addr) )
1001
+ msg. inner . msg_name = storage. cast ( ) ;
1002
+ msg. inner . msg_namelen = * len;
1003
+ let n = recvmsg ( fd, & mut msg, flags) ?;
1004
+ // Set the correct address length.
1005
+ * len = msg. inner . msg_namelen ;
1006
+ Ok ( n)
1007
+ } ) ?
1008
+ } ;
1009
+ Ok ( ( n, msg. flags ( ) , addr) )
1006
1010
}
1007
1011
1008
- /// Returns the (bytes received, sending address len, `RecvFlags`).
1009
1012
#[ cfg( not( target_os = "redox" ) ) ]
1010
- #[ allow( clippy:: unnecessary_cast) ] // For `IovLen::MAX as usize` (Already `usize` on Linux).
1011
- fn recvmsg (
1012
- fd : Socket ,
1013
- msg_name : * mut sockaddr_storage ,
1014
- bufs : & mut [ crate :: MaybeUninitSlice < ' _ > ] ,
1015
- flags : c_int ,
1016
- ) -> io:: Result < ( usize , libc:: socklen_t , RecvFlags ) > {
1017
- let msg_namelen = if msg_name. is_null ( ) {
1018
- 0
1019
- } else {
1020
- size_of :: < sockaddr_storage > ( ) as libc:: socklen_t
1021
- } ;
1022
- // libc::msghdr contains unexported padding fields on Fuchsia.
1023
- let mut msg: libc:: msghdr = unsafe { mem:: zeroed ( ) } ;
1024
- msg. msg_name = msg_name. cast ( ) ;
1025
- msg. msg_namelen = msg_namelen;
1026
- msg. msg_iov = bufs. as_mut_ptr ( ) . cast ( ) ;
1027
- msg. msg_iovlen = min ( bufs. len ( ) , IovLen :: MAX as usize ) as IovLen ;
1028
- syscall ! ( recvmsg( fd, & mut msg, flags) )
1029
- . map ( |n| ( n as usize , msg. msg_namelen , RecvFlags ( msg. msg_flags ) ) )
1013
+ fn recvmsg ( fd : Socket , msg : & mut MsgHdrMut < ' _ , ' _ , ' _ > , flags : c_int ) -> io:: Result < usize > {
1014
+ syscall ! ( recvmsg( fd, & mut msg. inner, flags) ) . map ( |n| n as usize )
1030
1015
}
1031
1016
1032
1017
pub ( crate ) fn send ( fd : Socket , buf : & [ u8 ] , flags : c_int ) -> io:: Result < usize > {
0 commit comments