From 0018ac4d6352de75987341169feb94d9016c3e62 Mon Sep 17 00:00:00 2001 From: Jianfeng Jiang Date: Wed, 14 Jun 2023 16:40:27 +0800 Subject: [PATCH] Support TCSETSW and TCSETSF for ioctl --- .../jinux-std/src/device/tty/line_discipline.rs | 5 +++++ services/libs/jinux-std/src/device/tty/mod.rs | 15 +++++++++++++++ services/libs/jinux-std/src/fs/utils/ioctl.rs | 4 ++++ 3 files changed, 24 insertions(+) diff --git a/services/libs/jinux-std/src/device/tty/line_discipline.rs b/services/libs/jinux-std/src/device/tty/line_discipline.rs index ca4c05af2..f130bd437 100644 --- a/services/libs/jinux-std/src/device/tty/line_discipline.rs +++ b/services/libs/jinux-std/src/device/tty/line_discipline.rs @@ -328,6 +328,11 @@ impl LineDiscipline { pub fn set_termios(&self, termios: KernelTermios) { *self.termios.lock_irq_disabled() = termios; } + + pub fn drain_input(&self) { + self.current_line.lock().drain(); + let _: Vec<_> = self.read_buffer.lock().pop_iter().collect(); + } } fn meet_new_line(item: u8, termios: &KernelTermios) -> bool { diff --git a/services/libs/jinux-std/src/device/tty/mod.rs b/services/libs/jinux-std/src/device/tty/mod.rs index c974b5a91..2419c12ae 100644 --- a/services/libs/jinux-std/src/device/tty/mod.rs +++ b/services/libs/jinux-std/src/device/tty/mod.rs @@ -114,6 +114,21 @@ impl Device for Tty { self.ldisc.set_termios(termios); Ok(0) } + IoctlCmd::TCSETSW => { + let termios = read_val_from_user(arg)?; + debug!("set termios = {:?}", termios); + self.ldisc.set_termios(termios); + // TODO: drain output buffer + Ok(0) + } + IoctlCmd::TCSETSF => { + let termios = read_val_from_user(arg)?; + debug!("set termios = {:?}", termios); + self.ldisc.set_termios(termios); + self.ldisc.drain_input(); + // TODO: drain output buffer + Ok(0) + } IoctlCmd::TIOCGWINSZ => { // TODO:get window size Ok(0) diff --git a/services/libs/jinux-std/src/fs/utils/ioctl.rs b/services/libs/jinux-std/src/fs/utils/ioctl.rs index 5489dd98d..58c0c4d81 100644 --- a/services/libs/jinux-std/src/fs/utils/ioctl.rs +++ b/services/libs/jinux-std/src/fs/utils/ioctl.rs @@ -6,6 +6,10 @@ pub enum IoctlCmd { // Get terminal attributes TCGETS = 0x5401, TCSETS = 0x5402, + // Drain the output buffer and set attributes + TCSETSW = 0x5403, + // Drain the output buffer, and discard pending input, and set attributes + TCSETSF = 0x5404, // Get the process group ID of the foreground process group on this terminal TIOCGPGRP = 0x540f, // Set the foreground process group ID of this terminal.