Skip to content

Commit 63aec50

Browse files
bors[bot]vdagonneau
andcommitted
Merge #1048
1048: Restored the bytes field on RecvMsg r=asomers a=vdagonneau This pull request restores the `bytes` field on the `RecvMsg` structure in order to be able to know the amount of bytes read during a call to `recvmsg`. Co-authored-by: Vincent Dagonneau <[email protected]>
2 parents 71b35a0 + cffb4b3 commit 63aec50

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

src/sys/socket/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ impl CmsgBuffer for Vec<u8> {
417417

418418
#[allow(missing_debug_implementations)] // msghdr isn't Debug
419419
pub struct RecvMsg<'a> {
420+
pub bytes: usize,
420421
cmsghdr: Option<&'a cmsghdr>,
421422
pub address: Option<SockAddr>,
422423
pub flags: MsgFlags,
@@ -970,7 +971,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
970971

971972
let ret = unsafe { libc::recvmsg(fd, &mut mhdr, flags.bits()) };
972973

973-
Errno::result(ret).map(|_| {
974+
Errno::result(ret).map(|r| {
974975
let cmsghdr = unsafe {
975976
if mhdr.msg_controllen > 0 {
976977
// got control message(s)
@@ -986,6 +987,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>],
986987
sockaddr_storage_to_addr(&address, mhdr.msg_namelen as usize).ok()
987988
};
988989
RecvMsg {
990+
bytes: r as usize,
989991
cmsghdr,
990992
address,
991993
flags: MsgFlags::from_bits_truncate(mhdr.msg_flags),

test/sys/test_socket.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ pub fn test_scm_rights() {
172172
panic!("unexpected cmsg");
173173
}
174174
}
175+
assert_eq!(msg.bytes, 5);
175176
assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC));
176177
close(fd2).unwrap();
177178
}
@@ -373,6 +374,7 @@ fn test_scm_rights_single_cmsg_multiple_fds() {
373374
}
374375
assert!(cmsgs.next().is_none(), "unexpected control msg");
375376

377+
assert_eq!(msg.bytes, 8);
376378
assert_eq!(iovec[0].as_slice(), [1u8, 2, 3, 4, 5, 6, 7, 8]);
377379
});
378380

@@ -414,6 +416,7 @@ pub fn test_sendmsg_empty_cmsgs() {
414416
panic!("unexpected cmsg");
415417
}
416418
assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC));
419+
assert_eq!(msg.bytes, 5);
417420
close(fd2).unwrap();
418421
}
419422
}
@@ -464,6 +467,7 @@ fn test_scm_credentials() {
464467
}
465468
}
466469
received_cred.expect("no creds received");
470+
assert_eq!(msg.bytes, 5);
467471
assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC));
468472
close(recv).unwrap();
469473
}
@@ -555,6 +559,7 @@ fn test_impl_scm_credentials_and_rights(mut space: Vec<u8>) {
555559
}
556560
}
557561
received_cred.expect("no creds received");
562+
assert_eq!(msg.bytes, 5);
558563
assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC));
559564
close(recv).unwrap();
560565
}
@@ -754,6 +759,7 @@ pub fn test_recv_ipv4pktinfo() {
754759
_ => (),
755760
}
756761
assert!(cmsgs.next().is_none(), "unexpected additional control msg");
762+
assert_eq!(msg.bytes, 8);
757763
assert_eq!(
758764
iovec[0].as_slice(),
759765
[1u8, 2, 3, 4, 5, 6, 7, 8]
@@ -862,6 +868,7 @@ pub fn test_recvif() {
862868
}
863869
assert_eq!(rx_recvif, true);
864870
assert_eq!(rx_recvdstaddr, true);
871+
assert_eq!(msg.bytes, 8);
865872
assert_eq!(
866873
iovec[0].as_slice(),
867874
[1u8, 2, 3, 4, 5, 6, 7, 8]
@@ -953,6 +960,7 @@ pub fn test_recv_ipv6pktinfo() {
953960
_ => (),
954961
}
955962
assert!(cmsgs.next().is_none(), "unexpected additional control msg");
963+
assert_eq!(msg.bytes, 8);
956964
assert_eq!(
957965
iovec[0].as_slice(),
958966
[1u8, 2, 3, 4, 5, 6, 7, 8]

0 commit comments

Comments
 (0)