Add XON/XOFF support

This commit is contained in:
pjht 2024-09-16 16:14:34 -05:00
parent e5144a8e6e
commit 63012f5e37
Signed by: pjht
GPG Key ID: CA239FC6934E6F3A
2 changed files with 17 additions and 3 deletions

View File

@ -5,7 +5,10 @@ use std::{
collections::HashMap,
os::mikros::{ipc, syscalls},
path::{Path, PathBuf},
sync::Arc,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
};
use parking_lot::{Mutex, RwLock};
@ -16,6 +19,7 @@ struct Pty {
input_buffer: Mutex<Vec<u8>>,
output_buffer: Mutex<Vec<u8>>,
termios: Termios,
output_paused: AtomicBool,
}
impl Pty {
@ -24,10 +28,14 @@ impl Pty {
input_buffer: Mutex::new(Vec::new()),
output_buffer: Mutex::new(Vec::new()),
termios: Termios::default(),
output_paused: AtomicBool::new(false),
}
}
fn read_master(&self, len: usize) -> Result<Vec<u8>, ()> {
if self.output_paused.load(Ordering::Relaxed) {
return Ok(vec![]);
}
let mut output_buffer = self.output_buffer.lock();
let buf_len = output_buffer.len();
let rem_buf = output_buffer.split_off(usize::min(buf_len, len));
@ -37,7 +45,7 @@ impl Pty {
fn write_master(&self, data: &[u8]) -> Result<(), ()> {
if !self.termios.cflags.cread {
return Ok(())
return Ok(());
}
let mut input_buffer = self.input_buffer.lock();
let mut output_buffer = self.output_buffer.lock();
@ -66,6 +74,12 @@ impl Pty {
}
input_buffer.pop();
}
} else if byte as char == self.termios.vstop && self.termios.iflags.ixon {
self.output_paused.store(true, Ordering::Relaxed);
} else if (byte as char == self.termios.vstart && self.termios.iflags.ixon)
|| (self.termios.iflags.ixany && self.output_paused.load(Ordering::Relaxed))
{
self.output_paused.store(false, Ordering::Relaxed);
} else {
input_buffer.push(byte);
if self.termios.lflags.echo || (byte == b'\n' && self.termios.lflags.echonl) {

View File

@ -27,7 +27,7 @@ impl Default for Iflags {
istrip: false,
ixany: false,
ixoff: false,
ixon: false,
ixon: true,
parmark: false,
}
}