tty_device.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. use alloc::sync::{Arc, Weak};
  2. use crate::{
  3. filesystem::{
  4. devfs::{DeviceINode, DevFS},
  5. vfs::{file::FileMode, FilePrivateData, IndexNode},
  6. },
  7. kerror, libs::rwlock::RwLock, syscall::SystemError,
  8. };
  9. use super::{TtyCore, TtyError, TtyFileFlag, TtyFilePrivateData};
  10. #[derive(Debug)]
  11. pub struct TtyDevice {
  12. core: TtyCore,
  13. fs: RwLock<Weak<DevFS>>
  14. }
  15. impl TtyDevice {
  16. pub fn new() -> Arc<TtyDevice> {
  17. return Arc::new(TtyDevice {
  18. core: TtyCore::new(),
  19. fs: RwLock::new(Weak::default()),
  20. });
  21. }
  22. /// @brief 判断文件私有信息是否为TTY的私有信息
  23. #[inline]
  24. fn verify_file_private_data<'a>(
  25. &self,
  26. private_data: &'a mut FilePrivateData,
  27. ) -> Result<&'a mut TtyFilePrivateData, SystemError> {
  28. if let FilePrivateData::Tty(t) = private_data {
  29. return Ok(t);
  30. }
  31. return Err(SystemError::EIO);
  32. }
  33. }
  34. impl DeviceINode for TtyDevice {
  35. fn set_fs(&self, fs: alloc::sync::Weak<crate::filesystem::devfs::DevFS>) {
  36. *self.fs.write() = fs;
  37. }
  38. }
  39. impl IndexNode for TtyDevice {
  40. fn open(&self, data: &mut FilePrivateData, mode: &FileMode) -> Result<(), SystemError> {
  41. let p = TtyFilePrivateData::default();
  42. *data = FilePrivateData::Tty(p);
  43. return Ok(());
  44. }
  45. fn read_at(
  46. &self,
  47. offset: usize,
  48. len: usize,
  49. buf: &mut [u8],
  50. data: &mut crate::filesystem::vfs::FilePrivateData,
  51. ) -> Result<usize, SystemError> {
  52. let _data: &mut TtyFilePrivateData = match self.verify_file_private_data(data) {
  53. Ok(t) => t,
  54. Err(e) => {
  55. kerror!("Try to read tty device, but file private data type mismatch!");
  56. return Err(e);
  57. }
  58. };
  59. // 读取stdin队列
  60. let r: Result<usize, TtyError> = self.core.read_stdin(buf, true);
  61. if r.is_ok() {
  62. return Ok(r.unwrap());
  63. }
  64. match r.unwrap_err() {
  65. TtyError::EOF(n) => {
  66. return Ok(n);
  67. }
  68. x => {
  69. kerror!("Error occurred when reading tty, msg={x:?}");
  70. return Err(SystemError::ECONNABORTED);
  71. }
  72. }
  73. }
  74. fn write_at(
  75. &self,
  76. offset: usize,
  77. len: usize,
  78. buf: &[u8],
  79. data: &mut crate::filesystem::vfs::FilePrivateData,
  80. ) -> Result<usize, SystemError> {
  81. let data: &mut TtyFilePrivateData = match self.verify_file_private_data(data) {
  82. Ok(t) => t,
  83. Err(e) => {
  84. kerror!("Try to write tty device, but file private data type mismatch!");
  85. return Err(e);
  86. }
  87. };
  88. // 根据当前文件是stdout还是stderr,选择不同的发送方式
  89. let r: Result<usize, TtyError> = if data.flags.contains(TtyFileFlag::STDOUT) {
  90. self.core.stdout(buf, true)
  91. } else if data.flags.contains(TtyFileFlag::STDERR) {
  92. self.core.stderr(buf, true)
  93. } else {
  94. return Err(SystemError::EPERM);
  95. };
  96. if r.is_ok() {
  97. return Ok(r.unwrap());
  98. }
  99. let r: TtyError = r.unwrap_err();
  100. kerror!("Error occurred when writing tty deivce. Error msg={r:?}");
  101. return Err(SystemError::EIO);
  102. }
  103. fn poll(&self) -> Result<crate::filesystem::vfs::PollStatus, SystemError> {
  104. return Err(SystemError::ENOTSUP);
  105. }
  106. fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
  107. return self.fs.read().upgrade().unwrap();
  108. }
  109. fn as_any_ref(&self) -> &dyn core::any::Any {
  110. self
  111. }
  112. fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> {
  113. return Err(SystemError::ENOTSUP);
  114. }
  115. }