)
.map(|bytes_copied| bytes_copied + bytes_flushed)
}
- (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
- if reader_meta.is_fifo() || writer_meta.is_fifo() =>
- {
- // splice
- let bytes_flushed = flush()?;
- let max_write = reader.min_limit();
- let (mut reader, mut writer) =
- unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
- crate::sys::fs::sendfile_splice(
- crate::sys::fs::SpliceMode::Splice,
- &mut reader,
- &mut writer,
- max_write,
- )
- .map(|bytes_sent| bytes_sent + bytes_flushed)
- }
(
CopyParams(FdMeta::Metadata(reader_meta), Some(readfd)),
CopyParams(_, Some(writefd)),
&mut reader,
&mut writer,
min(len, max_write),
+ )
+ .map(|bytes_sent| bytes_sent + bytes_flushed)
+ }
+ (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
+ if reader_meta.is_fifo() || writer_meta.is_fifo() =>
+ {
+ // splice
+ let bytes_flushed = flush()?;
+ let max_write = reader.min_limit();
+ let (mut reader, mut writer) =
+ unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
+ crate::sys::fs::sendfile_splice(
+ crate::sys::fs::SpliceMode::Splice,
+ &mut reader,
+ &mut writer,
+ max_write,
)
.map(|bytes_sent| bytes_sent + bytes_flushed)
}
fn properties(&self) -> CopyParams;
}
+ impl<T> CopyRead for &mut T where T: CopyRead {
+ fn drain_to<W: Write>(&mut self, writer: &mut W, limit: u64) -> Result<u64> {
+ (**self).drain_to(writer, limit)
+ }
+
+ fn min_limit(&self) -> u64 {
+ (**self).min_limit()
+ }
+
+ fn properties(&self) -> CopyParams {
+ (**self).properties()
+ }
+ }
+
+ impl<T> CopyWrite for &mut T where T: CopyWrite {
+ fn properties(&self) -> CopyParams {
+ (**self).properties()
+ }
+ }
+
+
impl CopyRead for File {
fn properties(&self) -> CopyParams {
CopyParams(fd_to_meta(self), Some(self.as_raw_fd()))