Skip to content

Commit 3d0f7c9

Browse files
committed
sendmmsg now allows to have different control messages
1 parent b13b7d1 commit 3d0f7c9

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/sys/socket/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,28 +1512,32 @@ pub fn sendmsg<S>(fd: RawFd, iov: &[IoSlice<'_>], cmsgs: &[ControlMessage],
15121512
target_os = "freebsd",
15131513
target_os = "netbsd",
15141514
))]
1515-
pub fn sendmmsg<'a, XS, AS, C, I, S>(
1515+
pub fn sendmmsg<'a, XS, AS, C, CM, I, S>(
15161516
fd: RawFd,
15171517
data: &'a mut MultiHeaders<S>,
15181518
slices: XS,
15191519
// one address per group of slices
15201520
addrs: AS,
1521-
// shared across all the messages
1522-
cmsgs: C,
1521+
// one group of messages per address
1522+
cmsgs_iter: C,
15231523
flags: MsgFlags
15241524
) -> crate::Result<MultiResults<'a, S>>
15251525
where
15261526
XS: IntoIterator<Item = &'a I>,
15271527
AS: AsRef<[Option<S>]>,
15281528
I: AsRef<[IoSlice<'a>]> + 'a,
1529-
C: AsRef<[ControlMessage<'a>]> + 'a,
1529+
C: IntoIterator<Item= CM> + 'a,
1530+
CM: AsRef<[ControlMessage<'a>]> + 'a,
15301531
S: SockaddrLike + 'a
15311532
{
15321533

15331534
let mut count = 0;
15341535

15351536

1536-
for (i, ((slice, addr), mmsghdr)) in slices.into_iter().zip(addrs.as_ref()).zip(data.items.iter_mut() ).enumerate() {
1537+
for (i, (((slice, addr), mmsghdr), cmsgs)) in
1538+
slices.into_iter()
1539+
.zip(addrs.as_ref())
1540+
.zip(data.items.iter_mut()).zip(cmsgs_iter.into_iter()).enumerate() {
15371541
let p = &mut mmsghdr.msg_hdr;
15381542
p.msg_iov = slice.as_ref().as_ptr() as *mut libc::iovec;
15391543
p.msg_iovlen = slice.as_ref().len() as _;

test/sys/test_socket.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,14 @@ mod recvfrom {
435435
addrs.push(Some(sock_addr2));
436436
}
437437

438-
let res = sendmmsg(s, &mut data, &iovs, addrs, [], flags)?;
438+
let res = sendmmsg(
439+
s,
440+
&mut data,
441+
&iovs,
442+
addrs,
443+
std::iter::repeat([]),
444+
flags,
445+
)?;
439446
let mut sent_messages = 0;
440447
let mut sent_bytes = 0;
441448
for item in res {

0 commit comments

Comments
 (0)