@@ -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,46 +846,39 @@ 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
- let mut initialized_data = unsafe { mem:: transmute :: < _ , Vec < libc:: mmsghdr > > ( output) } ;
880
-
881
- let ret = unsafe { libc:: sendmmsg ( fd, initialized_data. as_mut_ptr ( ) , initialized_data. len ( ) as _ , flags. bits ( ) as _ ) } ;
875
+ let ret = unsafe { libc:: sendmmsg ( fd, output. as_mut_ptr ( ) , output. len ( ) as _ , flags. bits ( ) as _ ) } ;
882
876
883
877
let sent_messages = Errno :: result ( ret) ? as usize ;
884
878
let mut sent_bytes = Vec :: with_capacity ( sent_messages) ;
885
- unsafe { sent_bytes. set_len ( sent_messages) } ;
886
879
887
- for i in 0 ..sent_messages {
888
- sent_bytes[ i ] = initialized_data [ i ] . msg_len as usize ;
880
+ for item in & output {
881
+ sent_bytes. push ( item . msg_len as usize ) ;
889
882
}
890
883
891
884
Ok ( sent_bytes)
@@ -941,7 +934,8 @@ pub struct RecvMmsgData<'a, I>
941
934
) ) ]
942
935
pub fn recvmmsg < ' a , I > (
943
936
fd : RawFd ,
944
- data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a , I > > ,
937
+ data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a , I > ,
938
+ IntoIter =impl ExactSizeIterator + Iterator < Item =& ' a mut RecvMmsgData < ' a , I > > > ,
945
939
flags : MsgFlags ,
946
940
timeout : Option < crate :: sys:: time:: TimeSpec >
947
941
) -> Result < Vec < RecvMsg < ' a > > >
@@ -950,23 +944,22 @@ pub fn recvmmsg<'a, I>(
950
944
{
951
945
let iter = data. into_iter ( ) ;
952
946
953
- let ( min_size, max_size) = iter. size_hint ( ) ;
954
- let reserve_items = max_size. unwrap_or ( min_size) ;
947
+ let num_messages = iter. len ( ) ;
955
948
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 ] ;
949
+ let mut output: Vec < libc:: mmsghdr > = Vec :: with_capacity ( num_messages ) ;
950
+ let mut address: Vec < sockaddr_storage > = Vec :: with_capacity ( num_messages ) ;
958
951
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
- }
952
+ unsafe {
953
+ output. set_len ( num_messages) ;
954
+ address. set_len ( num_messages) ;
955
+ }
964
956
957
+ let results: Vec < _ > = iter. enumerate ( ) . map ( |( i, d) | {
965
958
let element = & mut output[ i] ;
966
959
967
960
let msg_controllen = unsafe {
968
- recv_pack_mhdr (
969
- & mut ( * element. as_mut_ptr ( ) ) . msg_hdr ,
961
+ pack_mhdr_to_receive (
962
+ & mut element. msg_hdr ,
970
963
d. iov . as_ref ( ) ,
971
964
& mut d. cmsg_buffer ,
972
965
& mut address[ i]
@@ -976,29 +969,27 @@ pub fn recvmmsg<'a, I>(
976
969
( msg_controllen as usize , & mut d. cmsg_buffer )
977
970
} ) . collect ( ) ;
978
971
979
- let mut initialized_data = unsafe { mem:: transmute :: < _ , Vec < libc:: mmsghdr > > ( output) } ;
980
-
981
972
let timeout = if let Some ( mut t) = timeout {
982
973
t. as_mut ( ) as * mut libc:: timespec
983
974
} else {
984
975
ptr:: null_mut ( )
985
976
} ;
986
977
987
- let ret = unsafe { libc:: recvmmsg ( fd, initialized_data . as_mut_ptr ( ) , initialized_data . len ( ) as _ , flags. bits ( ) as _ , timeout) } ;
978
+ let ret = unsafe { libc:: recvmmsg ( fd, output . as_mut_ptr ( ) , output . len ( ) as _ , flags. bits ( ) as _ , timeout) } ;
988
979
989
980
let r = Errno :: result ( ret) ?;
990
981
991
- Ok ( initialized_data
982
+ Ok ( output
992
983
. into_iter ( )
993
984
. zip ( address. into_iter ( ) )
994
985
. zip ( results. into_iter ( ) )
995
- . map ( |( ( mmsghdr, address) , ( msg_controllen, cmsg_buffer) ) | {
986
+ . map ( |( ( mmsghdr, mut address) , ( msg_controllen, cmsg_buffer) ) | {
996
987
unsafe {
997
988
read_mhdr (
998
989
mmsghdr. msg_hdr ,
999
990
r as isize ,
1000
991
msg_controllen,
1001
- address,
992
+ & mut address,
1002
993
cmsg_buffer
1003
994
)
1004
995
}
@@ -1010,7 +1001,7 @@ unsafe fn read_mhdr<'a, 'b>(
1010
1001
mhdr : msghdr ,
1011
1002
r : isize ,
1012
1003
msg_controllen : usize ,
1013
- address : MaybeUninit < sockaddr_storage > ,
1004
+ address : * mut sockaddr_storage ,
1014
1005
cmsg_buffer : & ' a mut Option < & ' b mut Vec < u8 > >
1015
1006
) -> RecvMsg < ' b > {
1016
1007
let cmsghdr = {
@@ -1029,7 +1020,7 @@ unsafe fn read_mhdr<'a, 'b>(
1029
1020
} ;
1030
1021
1031
1022
let address = sockaddr_storage_to_addr (
1032
- & address. assume_init ( ) ,
1023
+ & * address ,
1033
1024
mhdr. msg_namelen as usize
1034
1025
) . ok ( ) ;
1035
1026
@@ -1042,11 +1033,11 @@ unsafe fn read_mhdr<'a, 'b>(
1042
1033
}
1043
1034
}
1044
1035
1045
- unsafe fn recv_pack_mhdr < ' a , I > (
1036
+ unsafe fn pack_mhdr_to_receive < ' a , I > (
1046
1037
out : * mut msghdr ,
1047
1038
iov : I ,
1048
1039
cmsg_buffer : & mut Option < & mut Vec < u8 > > ,
1049
- address : & mut mem :: MaybeUninit < sockaddr_storage >
1040
+ address : * mut sockaddr_storage ,
1050
1041
) -> usize
1051
1042
where
1052
1043
I : AsRef < [ IoVec < & ' a mut [ u8 ] > ] > + ' a ,
@@ -1055,7 +1046,7 @@ unsafe fn recv_pack_mhdr<'a, I>(
1055
1046
. map ( |v| ( v. as_mut_ptr ( ) , v. capacity ( ) ) )
1056
1047
. unwrap_or ( ( ptr:: null_mut ( ) , 0 ) ) ;
1057
1048
1058
- ( * out) . msg_name = address. as_mut_ptr ( ) as * mut c_void ;
1049
+ ( * out) . msg_name = address as * mut c_void ;
1059
1050
( * out) . msg_namelen = mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ;
1060
1051
( * out) . msg_iov = iov. as_ref ( ) . as_ptr ( ) as * mut iovec ;
1061
1052
( * out) . msg_iovlen = iov. as_ref ( ) . len ( ) as _ ;
@@ -1067,7 +1058,7 @@ unsafe fn recv_pack_mhdr<'a, I>(
1067
1058
}
1068
1059
1069
1060
1070
- fn pack_mhdr < ' a , I , C > (
1061
+ fn pack_mhdr_to_send < ' a , I , C > (
1071
1062
out : * mut msghdr ,
1072
1063
cmsg_buffer : & mut [ u8 ] ,
1073
1064
iov : I ,
@@ -1146,7 +1137,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
1146
1137
let mut address = mem:: MaybeUninit :: uninit ( ) ;
1147
1138
1148
1139
let msg_controllen = unsafe {
1149
- recv_pack_mhdr ( out. as_mut_ptr ( ) , & iov, & mut cmsg_buffer, & mut address)
1140
+ pack_mhdr_to_receive ( out. as_mut_ptr ( ) , & iov, & mut cmsg_buffer, address. as_mut_ptr ( ) )
1150
1141
} ;
1151
1142
1152
1143
let mut mhdr = unsafe { out. assume_init ( ) } ;
@@ -1155,7 +1146,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
1155
1146
1156
1147
let r = Errno :: result ( ret) ?;
1157
1148
1158
- Ok ( unsafe { read_mhdr ( mhdr, r, msg_controllen, address, & mut cmsg_buffer) } )
1149
+ Ok ( unsafe { read_mhdr ( mhdr, r, msg_controllen, address. as_mut_ptr ( ) , & mut cmsg_buffer) } )
1159
1150
}
1160
1151
1161
1152
0 commit comments