qssh 0.0.2-alpha

Experimental quantum-safe SSH using post-quantum crypto. Research project - NOT for production. See LIMITATIONS.md
Documentation
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>> {
    // Create PTY
    let pty = Pty::new()?;
    
    // Set size
    let size = TerminalSize {
        rows: 24,
        cols: 80,
        pixel_width: 0,
        pixel_height: 0,
    };
    pty.set_size(size)?;
    
    // Spawn bash with PTY slave
    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()?;
    
    // Get async reader/writer for master
    let (mut reader, mut writer) = pty.master_async();
    
    // Write a command
    writer.write_all(b"echo 'Hello from PTY'\n").await?;
    writer.flush().await?;
    
    // Read output
    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??;
    
    // Kill child
    child.kill().await?;
    
    Ok(())
}