use pwner::Spawner;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main(flavor = "current_thread")]
async fn main() {
let mut child = tokio::process::Command::new("cat")
.spawn_owned()
.expect("Couldn't start the child process");
let (stdin, stdout, stderr) = child.pipes();
let mut stdin_buffer = [0_u8; 1024];
let mut stdout_buffer = [0_u8; 1024];
let mut stderr_buffer = [0_u8; 1024];
let mut input = tokio::io::stdin();
loop {
tokio::select! {
result = input.read(&mut stdin_buffer) => {
if let Ok(bytes @ 1..=1024) = result {
if stdin.write_all(&stdin_buffer[..bytes]).await.is_err() {
eprintln!("Could not write to child");
break;
}
} else {
break;
}
},
Ok(bytes) = stdout.read(&mut stdout_buffer) => {
if bytes == 0 {
println!("out ::");
} else if let Ok(string) = std::str::from_utf8(&stdout_buffer[..bytes - 1]) {
println!("out :: {}", string);
}
},
Ok(bytes) = stderr.read(&mut stderr_buffer) => {
if bytes == 0 {
eprintln!("err ::");
} else if let Ok(string) = std::str::from_utf8(&stderr_buffer[..bytes - 1]) {
eprintln!("err :: {}", string);
}
},
else => break,
}
}
}