inode.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use crate::{
  2. filesystem::vfs::{
  3. syscall::ModeType, FilePrivateData, FileType, IndexNode, Metadata, PollableInode,
  4. },
  5. libs::spinlock::SpinLockGuard,
  6. };
  7. use alloc::{string::String, sync::Arc, vec::Vec};
  8. use system_error::SystemError;
  9. use super::Socket;
  10. impl<T: Socket + 'static> IndexNode for T {
  11. fn open(
  12. &self,
  13. _: SpinLockGuard<FilePrivateData>,
  14. _: &crate::filesystem::vfs::file::FileMode,
  15. ) -> Result<(), SystemError> {
  16. Ok(())
  17. }
  18. fn close(&self, _: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  19. self.do_close()
  20. }
  21. fn read_at(
  22. &self,
  23. _: usize,
  24. _: usize,
  25. buf: &mut [u8],
  26. _: SpinLockGuard<FilePrivateData>,
  27. ) -> Result<usize, SystemError> {
  28. self.read(buf)
  29. }
  30. fn write_at(
  31. &self,
  32. _offset: usize,
  33. _len: usize,
  34. buf: &[u8],
  35. _data: SpinLockGuard<FilePrivateData>,
  36. ) -> Result<usize, SystemError> {
  37. self.write(buf)
  38. }
  39. fn resize(&self, _len: usize) -> Result<(), SystemError> {
  40. Ok(())
  41. }
  42. fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
  43. unreachable!("Socket does not have a file system")
  44. }
  45. fn as_any_ref(&self) -> &dyn core::any::Any {
  46. self
  47. }
  48. fn list(&self) -> Result<Vec<String>, SystemError> {
  49. Err(SystemError::ENOTDIR)
  50. }
  51. fn as_pollable_inode(&self) -> Result<&dyn PollableInode, SystemError> {
  52. Ok(self)
  53. }
  54. fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> {
  55. Ok(Metadata::new(
  56. FileType::Socket,
  57. ModeType::from_bits_truncate(0o755),
  58. ))
  59. }
  60. // TODO: implement ioctl for socket
  61. fn ioctl(
  62. &self,
  63. _cmd: u32,
  64. _data: usize,
  65. _private_data: &FilePrivateData,
  66. ) -> Result<usize, SystemError> {
  67. log::warn!("Socket not support ioctl");
  68. return Ok(0);
  69. }
  70. fn as_socket(&self) -> Option<&dyn Socket> {
  71. Some(self)
  72. }
  73. }
  74. impl<T: Socket + 'static> PollableInode for T {
  75. fn poll(&self, _: &FilePrivateData) -> Result<usize, SystemError> {
  76. Ok(self.check_io_event().bits() as usize)
  77. }
  78. fn add_epitem(
  79. &self,
  80. epitem: Arc<crate::filesystem::epoll::EPollItem>,
  81. _: &FilePrivateData,
  82. ) -> Result<(), SystemError> {
  83. self.epoll_items().add(epitem);
  84. return Ok(());
  85. }
  86. fn remove_epitem(
  87. &self,
  88. epitm: &Arc<crate::filesystem::epoll::EPollItem>,
  89. _: &FilePrivateData,
  90. ) -> Result<(), SystemError> {
  91. let _ = self.epoll_items().remove(&epitm.epoll());
  92. return Ok(());
  93. }
  94. }