use qssh::pty::{Pty, TerminalSize};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use std::process::Stdio;
use std::os::unix::io::{AsRawFd, FromRawFd};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pty = Pty::new()?;
let size = TerminalSize {
rows: 24,
cols: 80,
pixel_width: 0,
pixel_height: 0,
};
pty.set_size(size)?;
let slave_fd = pty.slave_fd();
let mut cmd = tokio::process::Command::new("/bin/bash");
cmd.arg("-i")
.stdin(unsafe { Stdio::from_raw_fd(slave_fd) })
.stdout(unsafe { Stdio::from_raw_fd(slave_fd) })
.stderr(unsafe { Stdio::from_raw_fd(slave_fd) });
let mut child = cmd.spawn()?;
let (mut reader, mut writer) = pty.master_async();
writer.write_all(b"echo 'Hello from PTY'\n").await?;
writer.flush().await?;
let mut buffer = vec![0u8; 1024];
tokio::time::timeout(
std::time::Duration::from_secs(2),
async {
let n = reader.read(&mut buffer).await?;
println!("Read {} bytes: {:?}", n, String::from_utf8_lossy(&buffer[..n]));
Ok::<(), Box<dyn std::error::Error>>(())
}
).await??;
child.kill().await?;
Ok(())
}