From bfafc102798ab1968ccf6b04315d8d3359a70ca8 Mon Sep 17 00:00:00 2001 From: login Date: Thu, 11 May 2023 17:41:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=BB=E5=8F=96stdin?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20(#264)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/tty/mod.rs | 14 +++++++++++++- kernel/src/driver/tty/tty_device.rs | 3 ++- kernel/src/filesystem/vfs/file.rs | 9 +++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/kernel/src/driver/tty/mod.rs b/kernel/src/driver/tty/mod.rs index 3b7b5b92..932ff786 100644 --- a/kernel/src/driver/tty/mod.rs +++ b/kernel/src/driver/tty/mod.rs @@ -1,3 +1,5 @@ +use core::intrinsics::unlikely; + use alloc::string::String; use thingbuf::mpsc::{ @@ -168,13 +170,23 @@ impl TtyCore { _ => return Err(TtyError::Unknown(format!("{err:?}"))), } } else { - buf[cnt] = *val.unwrap(); + let x = *val.unwrap(); + buf[cnt] = x; cnt += 1; + + if unlikely(self.stdin_should_return(x)) { + return Ok(cnt); + } } } return Ok(cnt); } + fn stdin_should_return(&self, c: u8) -> bool { + // 如果是换行符或者是ctrl+d,那么就应该返回 + return c == b'\n' || c == 4; + } + /// @brief 向stdin缓冲区内写入数据 /// /// @param buf 输入缓冲区 diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index bdc82c63..2243937a 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/kernel/src/driver/tty/tty_device.rs @@ -12,7 +12,7 @@ use crate::{ include::bindings::bindings::{textui_putchar, BLACK, WHITE}, kerror, libs::rwlock::RwLock, - syscall::SystemError, + syscall::SystemError, kdebug, arch::asm::current::current_pcb, }; use super::{TtyCore, TtyError, TtyFileFlag, TtyFilePrivateData}; @@ -263,6 +263,7 @@ impl IndexNode for TtyDevice { } return Ok(()); } + } impl TtyDevicePrivateData { diff --git a/kernel/src/filesystem/vfs/file.rs b/kernel/src/filesystem/vfs/file.rs index 6c2394c0..f1180bbb 100644 --- a/kernel/src/filesystem/vfs/file.rs +++ b/kernel/src/filesystem/vfs/file.rs @@ -173,9 +173,14 @@ impl File { /// /// @param origin 调整的起始位置 pub fn lseek(&mut self, origin: SeekFrom) -> Result { - if self.inode.metadata().unwrap().file_type == FileType::Pipe { - return Err(SystemError::ESPIPE); + let file_type = self.inode.metadata().unwrap().file_type; + match file_type { + FileType::Pipe | FileType::CharDevice => { + return Err(SystemError::ESPIPE); + } + _ => {} } + let pos: i64; match origin { SeekFrom::SeekSet(offset) => {