You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
945 B

use std::{
io::{self, Read, Write,},
};
use crate::{
multicast,
};
mod error;
pub use error::*;
pub struct LeakyPipe<'a, T, U>
where T: Read,
U: Write
{
oneesan: &'a mut T,
imouto: multicast::MulticastStream<&'a mut U>
}
impl<'a, T, U> LeakyPipe<'a, T, U>
where T: Read,
U: Write
{
pub fn new(oneesan: &'a mut T, imouto: multicast::MulticastStream<&'a mut U>) -> Self
{
Self {
oneesan,
imouto,
}
}
pub fn pipe(mut self, buf_size: usize, output_to_tty: bool) -> Result<(), Error>
{
let mut buffer = vec![0u8; buf_size];
let mut bytes_done=0;
let stdout = io::stdout();
let mut stdout = stdout.lock();
loop {
let sz = self.oneesan.read(&mut buffer[..]).try_oneesan(bytes_done)?;
if sz == 0 {return Ok(());}
self.imouto.write(&buffer[0..sz]).try_imouto(bytes_done)?;
if output_to_tty {
stdout.write(&buffer[0..sz])?;
}
bytes_done+=sz;
}
}
}