diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-05-05 13:56:27 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-05-05 13:56:27 +0000 |
commit | 63aec5066b6bca637f45a4acc23aa8f8079ca050 (patch) | |
tree | 99336681f8c43aa62e7adc772bf3c996014d4331 | |
parent | 71b35a07cc1cdd9a367773d391848a3cd314c388 (diff) | |
parent | cffb4b33f584bcc1fa6249795cd9160ae95291d2 (diff) | |
download | nix-63aec5066b6bca637f45a4acc23aa8f8079ca050.zip |
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 <vincentdagonneau@gmail.com>
-rw-r--r-- | src/sys/socket/mod.rs | 4 | ||||
-rw-r--r-- | test/sys/test_socket.rs | 8 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs index 5a054b4b..0ba28358 100644 --- a/src/sys/socket/mod.rs +++ b/src/sys/socket/mod.rs @@ -417,6 +417,7 @@ impl CmsgBuffer for Vec<u8> { #[allow(missing_debug_implementations)] // msghdr isn't Debug pub struct RecvMsg<'a> { + pub bytes: usize, cmsghdr: Option<&'a cmsghdr>, pub address: Option<SockAddr>, pub flags: MsgFlags, @@ -970,7 +971,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>], let ret = unsafe { libc::recvmsg(fd, &mut mhdr, flags.bits()) }; - Errno::result(ret).map(|_| { + Errno::result(ret).map(|r| { let cmsghdr = unsafe { if mhdr.msg_controllen > 0 { // got control message(s) @@ -986,6 +987,7 @@ pub fn recvmsg<'a>(fd: RawFd, iov: &[IoVec<&mut [u8]>], sockaddr_storage_to_addr(&address, mhdr.msg_namelen as usize).ok() }; RecvMsg { + bytes: r as usize, cmsghdr, address, flags: MsgFlags::from_bits_truncate(mhdr.msg_flags), diff --git a/test/sys/test_socket.rs b/test/sys/test_socket.rs index 2790f681..9cbf0257 100644 --- a/test/sys/test_socket.rs +++ b/test/sys/test_socket.rs @@ -172,6 +172,7 @@ pub fn test_scm_rights() { panic!("unexpected cmsg"); } } + assert_eq!(msg.bytes, 5); assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC)); close(fd2).unwrap(); } @@ -373,6 +374,7 @@ fn test_scm_rights_single_cmsg_multiple_fds() { } assert!(cmsgs.next().is_none(), "unexpected control msg"); + assert_eq!(msg.bytes, 8); assert_eq!(iovec[0].as_slice(), [1u8, 2, 3, 4, 5, 6, 7, 8]); }); @@ -414,6 +416,7 @@ pub fn test_sendmsg_empty_cmsgs() { panic!("unexpected cmsg"); } assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC)); + assert_eq!(msg.bytes, 5); close(fd2).unwrap(); } } @@ -464,6 +467,7 @@ fn test_scm_credentials() { } } received_cred.expect("no creds received"); + assert_eq!(msg.bytes, 5); assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC)); close(recv).unwrap(); } @@ -555,6 +559,7 @@ fn test_impl_scm_credentials_and_rights(mut space: Vec<u8>) { } } received_cred.expect("no creds received"); + assert_eq!(msg.bytes, 5); assert!(!msg.flags.intersects(MsgFlags::MSG_TRUNC | MsgFlags::MSG_CTRUNC)); close(recv).unwrap(); } @@ -754,6 +759,7 @@ pub fn test_recv_ipv4pktinfo() { _ => (), } assert!(cmsgs.next().is_none(), "unexpected additional control msg"); + assert_eq!(msg.bytes, 8); assert_eq!( iovec[0].as_slice(), [1u8, 2, 3, 4, 5, 6, 7, 8] @@ -862,6 +868,7 @@ pub fn test_recvif() { } assert_eq!(rx_recvif, true); assert_eq!(rx_recvdstaddr, true); + assert_eq!(msg.bytes, 8); assert_eq!( iovec[0].as_slice(), [1u8, 2, 3, 4, 5, 6, 7, 8] @@ -953,6 +960,7 @@ pub fn test_recv_ipv6pktinfo() { _ => (), } assert!(cmsgs.next().is_none(), "unexpected additional control msg"); + assert_eq!(msg.bytes, 8); assert_eq!( iovec[0].as_slice(), [1u8, 2, 3, 4, 5, 6, 7, 8] |