@@ -70,9 +70,9 @@ use std::{io, slice};
70
70
use libc:: ssize_t;
71
71
use libc:: { in6_addr, in_addr} ;
72
72
73
- #[ cfg( not( target_os = "redox" ) ) ]
74
- use crate :: RecvFlags ;
75
73
use crate :: { Domain , Protocol , SockAddr , TcpKeepalive , Type } ;
74
+ #[ cfg( not( target_os = "redox" ) ) ]
75
+ use crate :: { MsgHdr , RecvFlags } ;
76
76
77
77
pub ( crate ) use libc:: c_int;
78
78
@@ -1036,7 +1036,8 @@ pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result<usize> {
1036
1036
1037
1037
#[ cfg( not( target_os = "redox" ) ) ]
1038
1038
pub ( crate ) fn send_vectored ( fd : Socket , bufs : & [ IoSlice < ' _ > ] , flags : c_int ) -> io:: Result < usize > {
1039
- sendmsg ( fd, ptr:: null ( ) , 0 , bufs, flags)
1039
+ let msg = MsgHdr :: new ( ) . with_buffers ( bufs) ;
1040
+ sendmsg ( fd, & msg, flags)
1040
1041
}
1041
1042
1042
1043
pub ( crate ) fn send_to ( fd : Socket , buf : & [ u8 ] , addr : & SockAddr , flags : c_int ) -> io:: Result < usize > {
@@ -1058,30 +1059,13 @@ pub(crate) fn send_to_vectored(
1058
1059
addr : & SockAddr ,
1059
1060
flags : c_int ,
1060
1061
) -> io:: Result < usize > {
1061
- sendmsg ( fd, addr. as_storage_ptr ( ) , addr. len ( ) , bufs, flags)
1062
+ let msg = MsgHdr :: new ( ) . with_addr ( addr) . with_buffers ( bufs) ;
1063
+ sendmsg ( fd, & msg, flags)
1062
1064
}
1063
1065
1064
- /// Returns the (bytes received, sending address len, `RecvFlags`).
1065
1066
#[ cfg( not( target_os = "redox" ) ) ]
1066
- #[ allow( clippy:: unnecessary_cast) ] // For `IovLen::MAX as usize` (Already `usize` on Linux).
1067
- fn sendmsg (
1068
- fd : Socket ,
1069
- msg_name : * const sockaddr_storage ,
1070
- msg_namelen : socklen_t ,
1071
- bufs : & [ IoSlice < ' _ > ] ,
1072
- flags : c_int ,
1073
- ) -> io:: Result < usize > {
1074
- // libc::msghdr contains unexported padding fields on Fuchsia.
1075
- let mut msg: libc:: msghdr = unsafe { mem:: zeroed ( ) } ;
1076
- // Safety: we're creating a `*mut` pointer from a reference, which is UB
1077
- // once actually used. However the OS should not write to it in the
1078
- // `sendmsg` system call.
1079
- msg. msg_name = ( msg_name as * mut sockaddr_storage ) . cast ( ) ;
1080
- msg. msg_namelen = msg_namelen;
1081
- // Safety: Same as above about `*const` -> `*mut`.
1082
- msg. msg_iov = bufs. as_ptr ( ) as * mut _ ;
1083
- msg. msg_iovlen = min ( bufs. len ( ) , IovLen :: MAX as usize ) as IovLen ;
1084
- syscall ! ( sendmsg( fd, & msg, flags) ) . map ( |n| n as usize )
1067
+ fn sendmsg ( fd : Socket , msg : & MsgHdr < ' _ , ' _ , ' _ > , flags : c_int ) -> io:: Result < usize > {
1068
+ syscall ! ( sendmsg( fd, & msg. inner, flags) ) . map ( |n| n as usize )
1085
1069
}
1086
1070
1087
1071
/// Wrapper around `getsockopt` to deal with platform specific timeouts.
0 commit comments