WIP: Process termios cc

This commit is contained in:
Jeremy Soller
2017-07-23 15:06:41 -06:00
parent a44184adb7
commit 6f02841197
2 changed files with 117 additions and 8 deletions
+3 -7
View File
@@ -31,7 +31,7 @@ impl Resource for PtyMaster {
fn pty(&self) -> Weak<RefCell<Pty>> {
Rc::downgrade(&self.pty)
}
fn flags(&self) -> usize {
self.flags
}
@@ -62,13 +62,9 @@ impl Resource for PtyMaster {
fn write(&self, buf: &[u8]) -> Result<usize> {
let mut pty = self.pty.borrow_mut();
let mut i = 0;
while i < buf.len() {
pty.mosi.push_back(buf[i]);
i += 1;
}
pty.input(buf);
Ok(i)
Ok(buf.len())
}
fn sync(&self) -> Result<usize> {
+114 -1
View File
@@ -1,6 +1,7 @@
use std::collections::VecDeque;
use redox_termios::*;
use syscall;
use syscall::error::Result;
pub struct Pty {
@@ -40,7 +41,6 @@ impl Pty {
cc(VWERASE, 0o027); // CTRL-W
cc(VKILL, 0o025); // CTRL-U
cc(VREPRINT, 0o022);// CTRL-R
cc(VSWTC, 0o000); // NUL
cc(VINTR, 0o003); // CTRL-C
cc(VQUIT, 0o034); // CTRL-\
cc(VSUSP, 0o032); // CTRL-Z
@@ -67,4 +67,117 @@ impl Pty {
Ok(i)
}
pub fn input(&mut self, buf: &[u8]) {
//let ifl = &self.termios.c_iflag;
//let ofl = &self.termios.c_oflag;
//let cfl = &self.termios.c_cflag;
let lfl = &self.termios.c_lflag;
let cc = &self.termios.c_cc;
let icanon = lfl & ICANON == ICANON;
let isig = lfl & ISIG == ISIG;
let iexten = lfl & IEXTEN == IEXTEN;
let ixon = lfl & IXON == IXON;
for &b in buf.iter() {
let mut ignore = false;
if b == 0 {
println!("NUL");
} else {
if icanon {
if b == cc[VEOF] {
println!("VEOF");
ignore = true;
}
if b == cc[VEOL] {
println!("VEOL");
}
if b == cc[VEOL2] {
println!("VEOL2");
}
if b == cc[VERASE] {
println!("ERASE");
ignore = true;
}
if b == cc[VWERASE] && iexten {
println!("VWERASE");
ignore = true;
}
if b == cc[VKILL] {
println!("VKILL");
ignore = true;
}
if b == cc[VREPRINT] && iexten {
println!("VREPRINT");
ignore = true;
}
}
if isig {
if b == cc[VINTR] {
println!("VINTR");
if self.pgrp != 0 {
let _ = syscall::kill(!self.pgrp, syscall::SIGINT);
}
ignore = true;
}
if b == cc[VQUIT] {
println!("VQUIT");
if self.pgrp != 0 {
let _ = syscall::kill(!self.pgrp, syscall::SIGQUIT);
}
ignore = true;
}
if b == cc[VSUSP] {
println!("VSUSP");
if self.pgrp != 0 {
let _ = syscall::kill(!self.pgrp, syscall::SIGTSTP);
}
ignore = true;
}
}
if ixon {
if b == cc[VSTART] {
println!("VSTART");
ignore = true;
}
if b == cc[VSTOP] {
println!("VSTOP");
ignore = true;
}
}
if b == cc[VLNEXT] && iexten {
println!("VLNEXT");
ignore = true;
}
if b == cc[VDISCARD] && iexten {
println!("VDISCARD");
ignore = true;
}
}
if ! ignore {
self.mosi.push_back(b);
}
}
}
}