diff --git a/Cargo.lock b/Cargo.lock index c550c54..43acbeb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,7 @@ dependencies = [ "async-trait", "avt", "axum", + "bytes", "clap", "clap_complete", "clap_mangen", diff --git a/Cargo.toml b/Cargo.toml index 9702374..71a047f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ tokio-util = { version = "0.7", features = ["rt"] } rand = "0.9" async-trait = "0.1" signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] } +bytes = "1.0" [build-dependencies] clap = { version = "4.0", features = ["derive", "wrap_help"] } diff --git a/src/session.rs b/src/session.rs index 0b470e2..e3fb4e1 100644 --- a/src/session.rs +++ b/src/session.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use std::time::SystemTime; use async_trait::async_trait; +use bytes::{Buf, BytesMut}; use futures_util::future; use futures_util::stream::StreamExt; use nix::sys::wait::{WaitPidFlag, WaitStatus}; @@ -135,8 +136,8 @@ impl Session { Signals::new([SIGWINCH, SIGINT, SIGTERM, SIGQUIT, SIGHUP, SIGALRM, SIGCHLD])?; let mut output_buf = [0u8; BUF_SIZE]; let mut input_buf = [0u8; BUF_SIZE]; - let mut input: Vec = Vec::with_capacity(BUF_SIZE); - let mut output: Vec = Vec::with_capacity(BUF_SIZE); + let mut input = BytesMut::with_capacity(BUF_SIZE); + let mut output = BytesMut::with_capacity(BUF_SIZE); let mut wait_status = None; loop { @@ -154,7 +155,7 @@ impl Session { result = pty.write(&input), if !input.is_empty() => { let n = result?; - input.drain(..n); + input.advance(n); } result = tty.read(&mut input_buf) => { @@ -171,7 +172,7 @@ impl Session { result = tty.write(&output), if !output.is_empty() => { let n = result?; - output.drain(..n); + output.advance(n); } Some(signal) = signals.next() => { diff --git a/src/tty/macos.rs b/src/tty/macos.rs index b638b52..688a857 100644 --- a/src/tty/macos.rs +++ b/src/tty/macos.rs @@ -11,6 +11,8 @@ use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd}; use std::os::unix::fs::OpenOptionsExt; use std::thread; +use bytes::{Buf, BytesMut}; + use async_trait::async_trait; use nix::errno::Errno; use nix::pty::Winsize; @@ -135,7 +137,7 @@ fn copy(src_fd: F, dst_fd: G) { let src_fd = src_fd.as_fd(); let dst_fd = dst_fd.as_fd(); let mut buf = [0u8; BUF_SIZE]; - let mut data = Vec::with_capacity(BUF_SIZE); + let mut data = BytesMut::with_capacity(BUF_SIZE); loop { let mut read_fds = select::FdSet::new(); @@ -177,7 +179,7 @@ fn copy(src_fd: F, dst_fd: G) { if write_fds.contains(dst_fd) { match unistd::write(dst_fd, &data) { Ok(n) => { - data.drain(..n); + data.advance(n); } Err(Errno::EWOULDBLOCK) => {} @@ -211,7 +213,7 @@ fn copy(src_fd: F, dst_fd: G) { match unistd::write(dst_fd, &data) { Ok(n) => { - data.drain(..n); + data.advance(n); } Err(Errno::EWOULDBLOCK) => {}