From d06ad3835077c36aaf218a81c18e54abd5436c6d Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 25 Nov 2023 18:19:20 +0000 Subject: [PATCH] changes from review. --- src/sys/sendfile.rs | 36 ++++++++++++------------------------ test/test_sendfile.rs | 10 +++++++--- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/sys/sendfile.rs b/src/sys/sendfile.rs index c60732b048..a89a790d8f 100644 --- a/src/sys/sendfile.rs +++ b/src/sys/sendfile.rs @@ -21,7 +21,7 @@ use crate::Result; /// `in_fd` must support `mmap`-like operations and therefore cannot be a socket. /// /// For more information, see [the sendfile(2) man page.](https://man7.org/linux/man-pages/man2/sendfile.2.html) for Linux, -/// see [the sendfile(2) man page.](https://docs.oracle.com/cd/E88353_01/html/E37843/sendfile-3c.html) for Solaris. +/// see [the sendfile(2) man page.](https://illumos.org/man/3EXT/sendfile) for Solaris. #[cfg(any(target_os = "android", target_os = "linux", solarish))] pub fn sendfile( out_fd: F1, @@ -123,15 +123,7 @@ cfg_if! { } else if #[cfg(solarish)] { #[derive(Debug, Copy, Clone)] /// Mapping of the raw C sendfilevec_t struct - /// no need to bother with `sfv_flag` since it needs to be always 0. - pub struct SendfileVec { - /// input file descriptor - pub fd: i32, - /// offset to read from - pub off: off_t, - /// size of the data to read - pub len: usize, - } + pub struct SendfileVec(libc::sendfilevec_t); const SFV_FD_SELF: i32 = -2; @@ -142,7 +134,7 @@ cfg_if! { off: off_t, len: usize ) -> SendfileVec { - SendfileVec{fd: SFV_FD_SELF, off, len} + SendfileVec(libc::sendfilevec_t{sfv_fd: SFV_FD_SELF, sfv_flag: 0, sfv_off: off, sfv_len: len}) } /// initialises SendfileVec to send data from `fd`. @@ -151,16 +143,13 @@ cfg_if! { off: off_t, len: usize ) -> SendfileVec { - SendfileVec{fd: fd.as_fd().as_raw_fd(), off, len} + SendfileVec(libc::sendfilevec_t{sfv_fd: fd.as_fd().as_raw_fd(), sfv_flag: 0, sfv_off: off, sfv_len: len}) } + } - fn tosendfilevec(&self) -> libc::sendfilevec_t { - libc::sendfilevec_t{ - sfv_fd: self.fd, - sfv_flag: 0, - sfv_off: self.off, - sfv_len: self.len - } + impl From for libc::sendfilevec_t { + fn from(vec: SendfileVec) -> Self { + vec.0 } } } @@ -340,19 +329,18 @@ cfg_if! { /// The former allows to send data from a file descriptor through `fd`, /// from an offset `off` and for a given amount of data `len`. /// - /// The latter allows to send data from the process' address space, from an offset `off` + /// The latter allows to send data from the process's address space, from an offset `off` /// and for a given amount of data `len`. /// /// For more information, see - /// [the sendfilev{3) man page.](https://docs.oracle.com/cd/E86824_01/html/E54768/sendfilev-3ext.html) + /// [the sendfilev(3) man page.](https://illumos.org/man/3EXT/sendfilev) pub fn sendfilev( out_sock: F, - vec: Vec + vec: &[SendfileVec] ) -> (Result<()>, usize) { - let rawvec: Vec = vec.iter().map(|&v| v.tosendfilevec()).collect(); let mut len = 0usize; let return_code = unsafe { - libc::sendfilev(out_sock.as_fd().as_raw_fd(), rawvec.as_ptr(), rawvec.len() as i32, &mut len) + libc::sendfilev(out_sock.as_fd().as_raw_fd(), vec.iter().map(|&v| v.into()).collect::>().as_ptr(), vec.len() as i32, &mut len) }; (Errno::result(return_code).and(Ok(())), len) } diff --git a/test/test_sendfile.rs b/test/test_sendfile.rs index 2afe34ddb2..31fe76feb3 100644 --- a/test/test_sendfile.rs +++ b/test/test_sendfile.rs @@ -228,13 +228,17 @@ fn test_sendfilev() { .write_all(trailer_strings.concat().as_bytes()) .unwrap(); let (mut rd, wr) = UnixStream::pair().unwrap(); - let vec: Vec = vec![ + let vec: &[SendfileVec] = &[ SendfileVec::new( &header_data, 0, header_strings.iter().map(|s| s.len()).sum(), ), - SendfileVec::new(&body_data, body_offset as off_t, body.len() - 1), + SendfileVec::new( + &body_data, + body_offset as off_t, + body.len() - body_offset, + ), SendfileVec::new( &trailer_data, 0, @@ -252,7 +256,7 @@ fn test_sendfilev() { + &trailer_strings.concat(); // Verify the message that was sent - //assert_eq!(bytes_written as usize, expected_string.as_bytes().len()); + assert_eq!(bytes_written as usize, expected_string.as_bytes().len()); let mut read_string = String::new(); let bytes_read = rd.read_to_string(&mut read_string).unwrap();