Skip to content

Commit 008603d

Browse files
committed
Use MsgHdrMut in recvmsg
1 parent 2ff147e commit 008603d

File tree

2 files changed

+20
-35
lines changed

2 files changed

+20
-35
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ impl<'addr, 'bufs, 'control> MsgHdr<'addr, 'bufs, 'control> {
605605
///
606606
/// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix and `lpBuffers`
607607
/// and `dwBufferCount` on Windows.
608-
pub fn with_buffers(mut self, bufs: &'bufs [IoSlice<'bufs>]) -> Self {
608+
pub fn with_buffers(mut self, bufs: &'bufs [IoSlice<'_>]) -> Self {
609609
let ptr = bufs.as_ptr().cast_mut().cast();
610610
sys::set_msghdr_iov(&mut self.inner, ptr, bufs.len());
611611
self
@@ -677,7 +677,7 @@ impl<'addr, 'bufs, 'control> MsgHdrMut<'addr, 'bufs, 'control> {
677677
///
678678
/// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix and `lpBuffers`
679679
/// and `dwBufferCount` on Windows.
680-
pub fn with_buffers(mut self, bufs: &'bufs mut [MaybeUninitSlice<'bufs>]) -> Self {
680+
pub fn with_buffers(mut self, bufs: &'bufs mut [MaybeUninitSlice<'_>]) -> Self {
681681
sys::set_msghdr_iov(&mut self.inner, bufs.as_mut_ptr().cast(), bufs.len());
682682
self
683683
}

src/sys/unix.rs

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ use libc::{in6_addr, in_addr};
7272

7373
use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type};
7474
#[cfg(not(target_os = "redox"))]
75-
use crate::{MsgHdr, RecvFlags};
75+
use crate::{MsgHdr, MsgHdrMut, RecvFlags};
7676

7777
pub(crate) use libc::c_int;
7878

@@ -982,7 +982,9 @@ pub(crate) fn recv_vectored(
982982
bufs: &mut [crate::MaybeUninitSlice<'_>],
983983
flags: c_int,
984984
) -> 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()))
986988
}
987989

988990
#[cfg(not(target_os = "redox"))]
@@ -991,42 +993,25 @@ pub(crate) fn recv_from_vectored(
991993
bufs: &mut [crate::MaybeUninitSlice<'_>],
992994
flags: c_int,
993995
) -> 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
995998
// manually.
996-
unsafe {
999+
let (n, addr) = unsafe {
9971000
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))
10061010
}
10071011

1008-
/// Returns the (bytes received, sending address len, `RecvFlags`).
10091012
#[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)
10301015
}
10311016

10321017
pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result<usize> {

0 commit comments

Comments
 (0)