@@ -772,7 +772,7 @@ pub fn sendmsg(fd: RawFd, iov: &[IoVec<&[u8]>], cmsgs: &[ControlMessage],
772
772
// because subsequent code will not clear the padding bytes.
773
773
let mut cmsg_buffer = vec ! [ 0u8 ; capacity] ;
774
774
775
- unsafe { send_pack_mhdr ( mhdr. as_mut_ptr ( ) , & mut cmsg_buffer[ ..] , iov, cmsgs, addr) } ;
775
+ unsafe { send_pack_mhdr ( mhdr. as_mut_ptr ( ) , & mut cmsg_buffer[ ..] , & iov, & cmsgs, addr) } ;
776
776
777
777
let mhdr = unsafe { mhdr. assume_init ( ) } ;
778
778
@@ -783,10 +783,15 @@ pub fn sendmsg(fd: RawFd, iov: &[IoVec<&[u8]>], cmsgs: &[ControlMessage],
783
783
784
784
#[ cfg( any( target_os = "linux" , target_os = "freebsd" ) ) ]
785
785
#[ derive( Debug ) ]
786
- pub struct SendMmsgData < ' a > {
787
- pub iov : & ' a [ IoVec < & ' a [ u8 ] > ] ,
788
- pub cmsgs : & ' a [ ControlMessage < ' a > ] ,
789
- pub addr : Option < & ' a SockAddr > ,
786
+ pub struct SendMmsgData < ' a , I , C >
787
+ where
788
+ I : AsRef < [ IoVec < & ' a [ u8 ] > ] > ,
789
+ C : AsRef < [ ControlMessage < ' a > ] >
790
+ {
791
+ pub iov : I ,
792
+ pub cmsgs : C ,
793
+ pub addr : Option < SockAddr > ,
794
+ pub _lt : std:: marker:: PhantomData < & ' a I > ,
790
795
}
791
796
792
797
/// An extension of `sendmsg`` that allows the caller to transmit multiple
@@ -804,7 +809,11 @@ pub struct SendMmsgData<'a> {
804
809
/// # References
805
810
/// [sendmmsg(2)](http://man7.org/linux/man-pages/man2/sendmmsg.2.html)
806
811
#[ cfg( any( target_os = "linux" , target_os = "freebsd" ) ) ]
807
- pub fn sendmmsg < ' a > ( fd : RawFd , data : impl std:: iter:: IntoIterator < Item =& ' a SendMmsgData < ' a > > , flags : MsgFlags ) -> Result < ( usize , Vec < usize > ) >
812
+ pub fn sendmmsg < ' a , I , C > ( fd : RawFd , data : impl std:: iter:: IntoIterator < Item =& ' a SendMmsgData < ' a , I , C > > , flags : MsgFlags )
813
+ -> Result < ( usize , Vec < usize > ) >
814
+ where
815
+ I : AsRef < [ IoVec < & ' a [ u8 ] > ] > + ' a ,
816
+ C : AsRef < [ ControlMessage < ' a > ] > + ' a ,
808
817
{
809
818
let iter = data. into_iter ( ) ;
810
819
@@ -823,11 +832,19 @@ pub fn sendmmsg<'a>(fd: RawFd, data: impl std::iter::IntoIterator<Item=&'a SendM
823
832
let element = & mut output[ i] ;
824
833
825
834
let cmsgs_start = cmsgs_buffer. len ( ) ;
826
- let cmsgs_required_capacity: usize = d. cmsgs . iter ( ) . map ( |c| c. space ( ) ) . sum ( ) ;
835
+ let cmsgs_required_capacity: usize = d. cmsgs . as_ref ( ) . iter ( ) . map ( |c| c. space ( ) ) . sum ( ) ;
827
836
let cmsgs_buffer_need_capacity = cmsgs_start + cmsgs_required_capacity;
828
837
cmsgs_buffer. resize ( cmsgs_buffer_need_capacity, 0 ) ;
829
838
830
- unsafe { send_pack_mhdr ( & mut ( * element. as_mut_ptr ( ) ) . msg_hdr , & mut cmsgs_buffer[ cmsgs_start..] , d. iov , d. cmsgs , d. addr ) } ;
839
+ unsafe {
840
+ send_pack_mhdr (
841
+ & mut ( * element. as_mut_ptr ( ) ) . msg_hdr ,
842
+ & mut cmsgs_buffer[ cmsgs_start..] ,
843
+ & d. iov ,
844
+ & d. cmsgs ,
845
+ d. addr . as_ref ( )
846
+ )
847
+ } ;
831
848
} ) ;
832
849
833
850
let mut initialized_data = unsafe { mem:: transmute :: < _ , Vec < libc:: mmsghdr > > ( output) } ;
@@ -848,8 +865,11 @@ pub fn sendmmsg<'a>(fd: RawFd, data: impl std::iter::IntoIterator<Item=&'a SendM
848
865
849
866
#[ cfg( any( target_os = "linux" , target_os = "freebsd" ) ) ]
850
867
#[ derive( Debug ) ]
851
- pub struct RecvMmsgData < ' a > {
852
- pub iov : & ' a [ IoVec < & ' a mut [ u8 ] > ] ,
868
+ pub struct RecvMmsgData < ' a , I >
869
+ where
870
+ I : AsRef < [ IoVec < & ' a mut [ u8 ] > ] > + ' a ,
871
+ {
872
+ pub iov : I ,
853
873
pub cmsg_buffer : Option < & ' a mut Vec < u8 > > ,
854
874
}
855
875
@@ -876,9 +896,13 @@ pub struct RecvMmsgData<'a> {
876
896
/// # References
877
897
/// [recvmmsg(2)](http://man7.org/linux/man-pages/man2/recvmmsg.2.html)
878
898
#[ cfg( any( target_os = "linux" , target_os = "freebsd" ) ) ]
879
- pub fn recvmmsg < ' a > ( fd : RawFd ,
880
- data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a > > ,
881
- flags : MsgFlags , timeout : Option < crate :: sys:: time:: TimeSpec > ) -> Result < Vec < RecvMsg < ' a > > >
899
+ pub fn recvmmsg < ' a , I > (
900
+ fd : RawFd ,
901
+ data : impl std:: iter:: IntoIterator < Item =& ' a mut RecvMmsgData < ' a , I > > ,
902
+ flags : MsgFlags , timeout : Option < crate :: sys:: time:: TimeSpec >
903
+ ) -> Result < Vec < RecvMsg < ' a > > >
904
+ where
905
+ I : AsRef < [ IoVec < & ' a mut [ u8 ] > ] > + ' a ,
882
906
{
883
907
let iter = data. into_iter ( ) ;
884
908
@@ -899,7 +923,7 @@ pub fn recvmmsg<'a>(fd: RawFd,
899
923
let msg_controllen = unsafe {
900
924
recv_pack_mhdr (
901
925
& mut ( * element. as_mut_ptr ( ) ) . msg_hdr ,
902
- d. iov ,
926
+ d. iov . as_ref ( ) ,
903
927
& mut d. cmsg_buffer ,
904
928
& mut address[ i]
905
929
)
@@ -974,15 +998,23 @@ unsafe fn recv_read_mhdr<'a, 'b>(
974
998
}
975
999
}
976
1000
977
- unsafe fn recv_pack_mhdr ( out : * mut msghdr , iov : & [ IoVec < & mut [ u8 ] > ] , cmsg_buffer : & mut Option < & mut Vec < u8 > > , address : & mut mem:: MaybeUninit < sockaddr_storage > ) -> usize {
1001
+ unsafe fn recv_pack_mhdr < ' a , I > (
1002
+ out : * mut msghdr ,
1003
+ iov : I ,
1004
+ cmsg_buffer : & mut Option < & mut Vec < u8 > > ,
1005
+ address : & mut mem:: MaybeUninit < sockaddr_storage >
1006
+ ) -> usize
1007
+ where
1008
+ I : AsRef < [ IoVec < & ' a mut [ u8 ] > ] > + ' a ,
1009
+ {
978
1010
let ( msg_control, msg_controllen) = cmsg_buffer. as_mut ( )
979
1011
. map ( |v| ( v. as_mut_ptr ( ) , v. capacity ( ) ) )
980
1012
. unwrap_or ( ( ptr:: null_mut ( ) , 0 ) ) ;
981
1013
982
1014
( * out) . msg_name = address. as_mut_ptr ( ) as * mut c_void ;
983
1015
( * out) . msg_namelen = mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ;
984
- ( * out) . msg_iov = iov. as_ptr ( ) as * mut iovec ;
985
- ( * out) . msg_iovlen = iov. len ( ) as _ ;
1016
+ ( * out) . msg_iov = iov. as_ref ( ) . as_ptr ( ) as * mut iovec ;
1017
+ ( * out) . msg_iovlen = iov. as_ref ( ) . len ( ) as _ ;
986
1018
( * out) . msg_control = msg_control as * mut c_void ;
987
1019
( * out) . msg_controllen = msg_controllen as _ ;
988
1020
( * out) . msg_flags = 0 ;
@@ -991,7 +1023,17 @@ unsafe fn recv_pack_mhdr(out: *mut msghdr, iov: &[IoVec<&mut [u8]>], cmsg_buffer
991
1023
}
992
1024
993
1025
994
- unsafe fn send_pack_mhdr ( out : * mut msghdr , cmsg_buffer : & mut [ u8 ] , iov : & [ IoVec < & [ u8 ] > ] , cmsgs : & [ ControlMessage ] , addr : Option < & SockAddr > ) {
1026
+ unsafe fn send_pack_mhdr < ' a , I , C > (
1027
+ out : * mut msghdr ,
1028
+ cmsg_buffer : & mut [ u8 ] ,
1029
+ iov : I ,
1030
+ cmsgs : C ,
1031
+ addr : Option < & SockAddr >
1032
+ )
1033
+ where
1034
+ I : AsRef < [ IoVec < & ' a [ u8 ] > ] > ,
1035
+ C : AsRef < [ ControlMessage < ' a > ] >
1036
+ {
995
1037
let cmsg_capacity = cmsg_buffer. len ( ) ;
996
1038
997
1039
// Next encode the sending address, if provided
@@ -1016,8 +1058,8 @@ unsafe fn send_pack_mhdr(out: *mut msghdr, cmsg_buffer: &mut [u8], iov: &[IoVec<
1016
1058
( * out) . msg_namelen = namelen;
1017
1059
// transmute iov into a mutable pointer. sendmsg doesn't really mutate
1018
1060
// the buffer, but the standard says that it takes a mutable pointer
1019
- ( * out) . msg_iov = iov. as_ptr ( ) as * mut _ ;
1020
- ( * out) . msg_iovlen = iov. len ( ) as _ ;
1061
+ ( * out) . msg_iov = iov. as_ref ( ) . as_ptr ( ) as * mut _ ;
1062
+ ( * out) . msg_iovlen = iov. as_ref ( ) . len ( ) as _ ;
1021
1063
( * out) . msg_control = cmsg_ptr;
1022
1064
( * out) . msg_controllen = cmsg_capacity as _ ;
1023
1065
( * out) . msg_flags = 0 ;
@@ -1026,7 +1068,7 @@ unsafe fn send_pack_mhdr(out: *mut msghdr, cmsg_buffer: &mut [u8], iov: &[IoVec<
1026
1068
// CMSG_NEXT_HDR and friends read the msg_control and msg_controllen fields.
1027
1069
// CMSG_FIRSTHDR is always safe
1028
1070
let mut pmhdr: * mut cmsghdr = CMSG_FIRSTHDR ( out) ;
1029
- for cmsg in cmsgs {
1071
+ for cmsg in cmsgs. as_ref ( ) {
1030
1072
assert_ne ! ( pmhdr, ptr:: null_mut( ) ) ;
1031
1073
// Safe because we know that pmhdr is valid, and we initialized it with
1032
1074
// sufficient space
@@ -1057,7 +1099,9 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &'a [IoVec<&'a mut [u8]>],
1057
1099
let mut out = mem:: MaybeUninit :: < msghdr > :: zeroed ( ) ;
1058
1100
let mut address = mem:: MaybeUninit :: uninit ( ) ;
1059
1101
1060
- let msg_controllen = unsafe { recv_pack_mhdr ( out. as_mut_ptr ( ) , iov, & mut cmsg_buffer, & mut address) } ;
1102
+ let msg_controllen = unsafe {
1103
+ recv_pack_mhdr ( out. as_mut_ptr ( ) , & iov, & mut cmsg_buffer, & mut address)
1104
+ } ;
1061
1105
1062
1106
let mut mhdr = unsafe { out. assume_init ( ) } ;
1063
1107
0 commit comments