#[cfg(feature = "fs")] use std::io::{IoSlice, IoSliceMut}; #[cfg(feature = "fs")] #[test] fn test_readwrite_pv() { use rustix::fs::{cwd, openat, Mode, OFlags}; use rustix::io::{preadv, pwritev}; let tmp = tempfile::tempdir().unwrap(); let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); let foo = openat( &dir, "foo", OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, Mode::RUSR | Mode::WUSR, ) .unwrap(); // For most targets, just call `pwritev`. #[cfg(not(any(target_os = "ios", target_os = "macos")))] { pwritev(&foo, &[IoSlice::new(b"hello")], 200).unwrap(); } // macOS only has pwritev in newer versions; allow it to fail with `ENOSYS`. #[cfg(any(target_os = "ios", target_os = "macos"))] { match pwritev(&foo, &[IoSlice::new(b"hello")], 200) { Ok(_) => (), Err(rustix::io::Errno::NOSYS) => return, Err(err) => Err(err).unwrap(), } } pwritev(&foo, &[IoSlice::new(b"world")], 300).unwrap(); let mut buf = [0_u8; 5]; preadv(&foo, &mut [IoSliceMut::new(&mut buf)], 200).unwrap(); assert_eq!(&buf, b"hello"); preadv(&foo, &mut [IoSliceMut::new(&mut buf)], 300).unwrap(); assert_eq!(&buf, b"world"); } #[cfg(feature = "fs")] #[test] fn test_readwrite_p() { use rustix::fs::{cwd, openat, Mode, OFlags}; use rustix::io::{pread, pwrite}; let tmp = tempfile::tempdir().unwrap(); let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); let foo = openat( &dir, "foo", OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, Mode::RUSR | Mode::WUSR, ) .unwrap(); pwrite(&foo, b"hello", 200).unwrap(); pwrite(&foo, b"world", 300).unwrap(); let mut buf = [0_u8; 5]; pread(&foo, &mut buf, 200).unwrap(); assert_eq!(&buf, b"hello"); pread(&foo, &mut buf, 300).unwrap(); assert_eq!(&buf, b"world"); } #[cfg(feature = "fs")] #[test] fn test_readwrite_v() { use rustix::fs::{cwd, openat, seek, Mode, OFlags}; use rustix::io::{readv, writev, SeekFrom}; let tmp = tempfile::tempdir().unwrap(); let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); let foo = openat( &dir, "foo", OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, Mode::RUSR | Mode::WUSR, ) .unwrap(); writev(&foo, &[IoSlice::new(b"hello")]).unwrap(); writev(&foo, &[IoSlice::new(b"world")]).unwrap(); seek(&foo, SeekFrom::Start(0)).unwrap(); let mut buf = [0_u8; 5]; readv(&foo, &mut [IoSliceMut::new(&mut buf)]).unwrap(); assert_eq!(&buf, b"hello"); readv(&foo, &mut [IoSliceMut::new(&mut buf)]).unwrap(); assert_eq!(&buf, b"world"); } #[cfg(feature = "fs")] #[test] fn test_readwrite() { use rustix::fs::{cwd, openat, seek, Mode, OFlags}; use rustix::io::{read, write}; use std::io::SeekFrom; let tmp = tempfile::tempdir().unwrap(); let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); let foo = openat( &dir, "foo", OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, Mode::RUSR | Mode::WUSR, ) .unwrap(); write(&foo, b"hello").unwrap(); write(&foo, b"world").unwrap(); seek(&foo, SeekFrom::Start(0)).unwrap(); let mut buf = [0_u8; 5]; read(&foo, &mut buf).unwrap(); assert_eq!(&buf, b"hello"); read(&foo, &mut buf).unwrap(); assert_eq!(&buf, b"world"); }