@@ -50,7 +50,6 @@ pub use libc::{
50
50
// Needed by the cmsg_space macro
51
51
#[ doc( hidden) ]
52
52
pub use libc:: { c_uint, CMSG_SPACE } ;
53
- use std:: mem:: MaybeUninit ;
54
53
55
54
/// These constants are used to specify the communication semantics
56
55
/// when creating a socket with [`socket()`](fn.socket.html)
@@ -783,7 +782,7 @@ pub fn sendmsg(fd: RawFd, iov: &[IoVec<&[u8]>], cmsgs: &[ControlMessage],
783
782
// because subsequent code will not clear the padding bytes.
784
783
let mut cmsg_buffer = vec ! [ 0u8 ; capacity] ;
785
784
786
- pack_mhdr ( mhdr. as_mut_ptr ( ) , & mut cmsg_buffer[ ..] , & iov, & cmsgs, addr) ;
785
+ pack_mhdr_to_send ( mhdr. as_mut_ptr ( ) , & mut cmsg_buffer[ ..] , & iov, & cmsgs, addr) ;
787
786
788
787
let mhdr = unsafe { mhdr. assume_init ( ) } ;
789
788
@@ -837,7 +836,8 @@ pub struct SendMmsgData<'a, I, C>
837
836
) ) ]
838
837
pub fn sendmmsg < ' a , I , C > (
839
838
fd : RawFd ,
840
- data : impl std:: iter:: IntoIterator < Item =& ' a SendMmsgData < ' a , I , C > > ,
839
+ data : impl std:: iter:: IntoIterator < Item =& ' a SendMmsgData < ' a , I , C > ,
840
+ IntoIter =impl ExactSizeIterator + Iterator < Item =& ' a SendMmsgData < ' a , I , C > > > ,
841
841
flags : MsgFlags
842
842
) -> Result < Vec < usize > >
843
843
where
@@ -846,34 +846,30 @@ pub fn sendmmsg<'a, I, C>(
846
846
{
847
847
let iter = data. into_iter ( ) ;
848
848
849
- let ( min_size, max_size) = iter. size_hint ( ) ;
850
- let reserve_items = max_size. unwrap_or ( min_size) ;
849
+ let num_messages = iter. len ( ) ;
851
850
852
- let mut output: Vec < MaybeUninit < libc:: mmsghdr > > = vec ! [ MaybeUninit :: zeroed( ) ; reserve_items] ;
851
+ let mut output = Vec :: < libc:: mmsghdr > :: with_capacity ( num_messages) ;
852
+ unsafe {
853
+ output. set_len ( num_messages) ;
854
+ }
853
855
854
856
let mut cmsgs_buffer = vec ! [ 0u8 ; 0 ] ;
855
857
856
858
iter. enumerate ( ) . for_each ( |( i, d) | {
857
- if output. len ( ) < i {
858
- output. resize ( i, MaybeUninit :: zeroed ( ) ) ;
859
- }
860
-
861
859
let element = & mut output[ i] ;
862
860
863
861
let cmsgs_start = cmsgs_buffer. len ( ) ;
864
862
let cmsgs_required_capacity: usize = d. cmsgs . as_ref ( ) . iter ( ) . map ( |c| c. space ( ) ) . sum ( ) ;
865
863
let cmsgs_buffer_need_capacity = cmsgs_start + cmsgs_required_capacity;
866
864
cmsgs_buffer. resize ( cmsgs_buffer_need_capacity, 0 ) ;
867
865
868
- unsafe {
869
- pack_mhdr (
870
- & mut ( * element. as_mut_ptr ( ) ) . msg_hdr ,
871
- & mut cmsgs_buffer[ cmsgs_start..] ,
872
- & d. iov ,
873
- & d. cmsgs ,
874
- d. addr . as_ref ( )
875
- )
876
- } ;
866
+ pack_mhdr_to_send (
867
+ & mut element. msg_hdr ,
868
+ & mut cmsgs_buffer[ cmsgs_start..] ,
869
+ & d. iov ,
870
+ & d. cmsgs ,
871
+ d. addr . as_ref ( )
872
+ ) ;
877
873
} ) ;
878
874
879
875
let mut initialized_data = unsafe { mem:: transmute :: < _ , Vec < libc:: mmsghdr > > ( output) } ;
@@ -941,7 +937,8 @@ pub struct RecvMmsgData<'a, I>
941
937
) ) ]
942
938
pub fn recvmmsg < ' a , I > (
943
939
fd : RawFd ,
944
- data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a , I > > ,
940
+ data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a , I > ,
941
+ IntoIter =impl ExactSizeIterator + Iterator < Item =& ' a mut RecvMmsgData < ' a , I > > > ,
945
942
flags : MsgFlags ,
946
943
timeout : Option < crate :: sys:: time:: TimeSpec >
947
944
) -> Result < Vec < RecvMsg < ' a > > >
@@ -950,23 +947,22 @@ pub fn recvmmsg<'a, I>(
950
947
{
951
948
let iter = data. into_iter ( ) ;
952
949
953
- let ( min_size, max_size) = iter. size_hint ( ) ;
954
- let reserve_items = max_size. unwrap_or ( min_size) ;
950
+ let num_messages = iter. len ( ) ;
955
951
956
- let mut output: Vec < MaybeUninit < libc:: mmsghdr > > = vec ! [ MaybeUninit :: zeroed ( ) ; reserve_items ] ;
957
- let mut address: Vec < MaybeUninit < sockaddr_storage > > = vec ! [ MaybeUninit :: uninit ( ) ; reserve_items ] ;
952
+ let mut output: Vec < libc:: mmsghdr > = Vec :: with_capacity ( num_messages ) ;
953
+ let mut address: Vec < sockaddr_storage > = Vec :: with_capacity ( num_messages ) ;
958
954
959
- let results: Vec < _ > = iter. enumerate ( ) . map ( |( i, d) | {
960
- if output. len ( ) < i {
961
- output. resize ( i, MaybeUninit :: zeroed ( ) ) ;
962
- address. resize ( i, MaybeUninit :: uninit ( ) ) ;
963
- }
955
+ unsafe {
956
+ output. set_len ( num_messages) ;
957
+ address. set_len ( num_messages) ;
958
+ }
964
959
960
+ let results: Vec < _ > = iter. enumerate ( ) . map ( |( i, d) | {
965
961
let element = & mut output[ i] ;
966
962
967
963
let msg_controllen = unsafe {
968
- recv_pack_mhdr (
969
- & mut ( * element. as_mut_ptr ( ) ) . msg_hdr ,
964
+ pack_mhdr_to_receive (
965
+ & mut element. msg_hdr ,
970
966
d. iov . as_ref ( ) ,
971
967
& mut d. cmsg_buffer ,
972
968
& mut address[ i]
@@ -976,29 +972,27 @@ pub fn recvmmsg<'a, I>(
976
972
( msg_controllen as usize , & mut d. cmsg_buffer )
977
973
} ) . collect ( ) ;
978
974
979
- let mut initialized_data = unsafe { mem:: transmute :: < _ , Vec < libc:: mmsghdr > > ( output) } ;
980
-
981
975
let timeout = if let Some ( mut t) = timeout {
982
976
t. as_mut ( ) as * mut libc:: timespec
983
977
} else {
984
978
ptr:: null_mut ( )
985
979
} ;
986
980
987
- let ret = unsafe { libc:: recvmmsg ( fd, initialized_data . as_mut_ptr ( ) , initialized_data . len ( ) as _ , flags. bits ( ) as _ , timeout) } ;
981
+ let ret = unsafe { libc:: recvmmsg ( fd, output . as_mut_ptr ( ) , output . len ( ) as _ , flags. bits ( ) as _ , timeout) } ;
988
982
989
983
let r = Errno :: result ( ret) ?;
990
984
991
- Ok ( initialized_data
985
+ Ok ( output
992
986
. into_iter ( )
993
987
. zip ( address. into_iter ( ) )
994
988
. zip ( results. into_iter ( ) )
995
- . map ( |( ( mmsghdr, address) , ( msg_controllen, cmsg_buffer) ) | {
989
+ . map ( |( ( mmsghdr, mut address) , ( msg_controllen, cmsg_buffer) ) | {
996
990
unsafe {
997
991
read_mhdr (
998
992
mmsghdr. msg_hdr ,
999
993
r as isize ,
1000
994
msg_controllen,
1001
- address,
995
+ & mut address,
1002
996
cmsg_buffer
1003
997
)
1004
998
}
@@ -1010,7 +1004,7 @@ unsafe fn read_mhdr<'a, 'b>(
1010
1004
mhdr : msghdr ,
1011
1005
r : isize ,
1012
1006
msg_controllen : usize ,
1013
- address : MaybeUninit < sockaddr_storage > ,
1007
+ address : * mut sockaddr_storage ,
1014
1008
cmsg_buffer : & ' a mut Option < & ' b mut Vec < u8 > >
1015
1009
) -> RecvMsg < ' b > {
1016
1010
let cmsghdr = {
@@ -1029,7 +1023,7 @@ unsafe fn read_mhdr<'a, 'b>(
1029
1023
} ;
1030
1024
1031
1025
let address = sockaddr_storage_to_addr (
1032
- & address. assume_init ( ) ,
1026
+ & * address ,
1033
1027
mhdr. msg_namelen as usize
1034
1028
) . ok ( ) ;
1035
1029
@@ -1042,11 +1036,11 @@ unsafe fn read_mhdr<'a, 'b>(
1042
1036
}
1043
1037
}
1044
1038
1045
- unsafe fn recv_pack_mhdr < ' a , I > (
1039
+ unsafe fn pack_mhdr_to_receive < ' a , I > (
1046
1040
out : * mut msghdr ,
1047
1041
iov : I ,
1048
1042
cmsg_buffer : & mut Option < & mut Vec < u8 > > ,
1049
- address : & mut mem :: MaybeUninit < sockaddr_storage >
1043
+ address : * mut sockaddr_storage ,
1050
1044
) -> usize
1051
1045
where
1052
1046
I : AsRef < [ IoVec < & ' a mut [ u8 ] > ] > + ' a ,
@@ -1055,7 +1049,7 @@ unsafe fn recv_pack_mhdr<'a, I>(
1055
1049
. map ( |v| ( v. as_mut_ptr ( ) , v. capacity ( ) ) )
1056
1050
. unwrap_or ( ( ptr:: null_mut ( ) , 0 ) ) ;
1057
1051
1058
- ( * out) . msg_name = address. as_mut_ptr ( ) as * mut c_void ;
1052
+ ( * out) . msg_name = address as * mut c_void ;
1059
1053
( * out) . msg_namelen = mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ;
1060
1054
( * out) . msg_iov = iov. as_ref ( ) . as_ptr ( ) as * mut iovec ;
1061
1055
( * out) . msg_iovlen = iov. as_ref ( ) . len ( ) as _ ;
@@ -1067,7 +1061,7 @@ unsafe fn recv_pack_mhdr<'a, I>(
1067
1061
}
1068
1062
1069
1063
1070
- fn pack_mhdr < ' a , I , C > (
1064
+ fn pack_mhdr_to_send < ' a , I , C > (
1071
1065
out : * mut msghdr ,
1072
1066
cmsg_buffer : & mut [ u8 ] ,
1073
1067
iov : I ,
@@ -1146,7 +1140,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
1146
1140
let mut address = mem:: MaybeUninit :: uninit ( ) ;
1147
1141
1148
1142
let msg_controllen = unsafe {
1149
- recv_pack_mhdr ( out. as_mut_ptr ( ) , & iov, & mut cmsg_buffer, & mut address)
1143
+ pack_mhdr_to_receive ( out. as_mut_ptr ( ) , & iov, & mut cmsg_buffer, address. as_mut_ptr ( ) )
1150
1144
} ;
1151
1145
1152
1146
let mut mhdr = unsafe { out. assume_init ( ) } ;
@@ -1155,7 +1149,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
1155
1149
1156
1150
let r = Errno :: result ( ret) ?;
1157
1151
1158
- Ok ( unsafe { read_mhdr ( mhdr, r, msg_controllen, address, & mut cmsg_buffer) } )
1152
+ Ok ( unsafe { read_mhdr ( mhdr, r, msg_controllen, address. as_mut_ptr ( ) , & mut cmsg_buffer) } )
1159
1153
}
1160
1154
1161
1155
0 commit comments