From 4d5c090fcf9f6f51d4303e903676f2d487d60272 Mon Sep 17 00:00:00 2001 From: Ryan Zoeller Date: Fri, 24 Dec 2021 17:57:20 -0600 Subject: Add sendfile(2) for DragonFly --- test/test.rs | 1 + test/test_sendfile.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/test.rs b/test/test.rs index 83cb4645..3cac48f7 100644 --- a/test/test.rs +++ b/test/test.rs @@ -33,6 +33,7 @@ mod test_pty; target_os = "linux"))] mod test_sched; #[cfg(any(target_os = "android", + target_os = "dragonfly", target_os = "freebsd", target_os = "ios", target_os = "linux", diff --git a/test/test_sendfile.rs b/test/test_sendfile.rs index b6559d32..e56ff12f 100644 --- a/test/test_sendfile.rs +++ b/test/test_sendfile.rs @@ -8,7 +8,7 @@ use tempfile::tempfile; cfg_if! { if #[cfg(any(target_os = "android", target_os = "linux"))] { use nix::unistd::{close, pipe, read}; - } else if #[cfg(any(target_os = "freebsd", target_os = "ios", target_os = "macos"))] { + } else if #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", target_os = "macos"))] { use std::net::Shutdown; use std::os::unix::net::UnixStream; } @@ -105,6 +105,51 @@ fn test_sendfile_freebsd() { assert_eq!(expected_string, read_string); } +#[cfg(target_os = "dragonfly")] +#[test] +fn test_sendfile_dragonfly() { + // Declare the content + let header_strings = vec!["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; + let body = "Xabcdef123456"; + let body_offset = 1; + let trailer_strings = vec!["\n", "Served by Make Believe\n"]; + + // Write the body to a file + let mut tmp = tempfile().unwrap(); + tmp.write_all(body.as_bytes()).unwrap(); + + // Prepare headers and trailers for sendfile + let headers: Vec<&[u8]> = header_strings.iter().map(|s| s.as_bytes()).collect(); + let trailers: Vec<&[u8]> = trailer_strings.iter().map(|s| s.as_bytes()).collect(); + + // Prepare socket pair + let (mut rd, wr) = UnixStream::pair().unwrap(); + + // Call the test method + let (res, bytes_written) = sendfile( + tmp.as_raw_fd(), + wr.as_raw_fd(), + body_offset as off_t, + None, + Some(headers.as_slice()), + Some(trailers.as_slice()), + ); + assert!(res.is_ok()); + wr.shutdown(Shutdown::Both).unwrap(); + + // Prepare the expected result + let expected_string = + header_strings.concat() + &body[body_offset..] + &trailer_strings.concat(); + + // Verify the message that was sent + 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(); + assert_eq!(bytes_written as usize, bytes_read); + assert_eq!(expected_string, read_string); +} + #[cfg(any(target_os = "ios", target_os = "macos"))] #[test] fn test_sendfile_darwin() { -- cgit v1.2.3