inode.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. use crate::filesystem::vfs::IndexNode;
  2. use alloc::sync::Arc;
  3. use system_error::SystemError;
  4. use crate::net::socket::*;
  5. #[derive(Debug)]
  6. pub struct Inode {
  7. inner: Arc<dyn Socket>,
  8. epoll_items: EPollItems,
  9. }
  10. impl IndexNode for Inode {
  11. fn read_at(
  12. &self,
  13. _offset: usize,
  14. _len: usize,
  15. buf: &mut [u8],
  16. data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  17. ) -> Result<usize, SystemError> {
  18. drop(data);
  19. self.inner.read(buf)
  20. }
  21. fn write_at(
  22. &self,
  23. _offset: usize,
  24. _len: usize,
  25. buf: &[u8],
  26. data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  27. ) -> Result<usize, SystemError> {
  28. drop(data);
  29. self.inner.write(buf)
  30. }
  31. /* Following are not yet available in socket */
  32. fn as_any_ref(&self) -> &dyn core::any::Any {
  33. self
  34. }
  35. /* filesystem associate interfaces are about unix and netlink socket */
  36. fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
  37. unimplemented!()
  38. }
  39. fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> {
  40. unimplemented!()
  41. }
  42. fn poll(&self, _: &crate::filesystem::vfs::FilePrivateData) -> Result<usize, SystemError> {
  43. Ok(self.inner.poll())
  44. }
  45. fn open(
  46. &self,
  47. _data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  48. _mode: &crate::filesystem::vfs::file::FileMode,
  49. ) -> Result<(), SystemError> {
  50. Ok(())
  51. }
  52. fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> {
  53. let meta = crate::filesystem::vfs::Metadata {
  54. mode: crate::filesystem::vfs::syscall::ModeType::from_bits_truncate(0o755),
  55. file_type: crate::filesystem::vfs::FileType::Socket,
  56. size: self.send_buffer_size() as i64,
  57. ..Default::default()
  58. };
  59. return Ok(meta);
  60. }
  61. fn close(
  62. &self,
  63. _data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  64. ) -> Result<(), SystemError> {
  65. self.inner.close()
  66. }
  67. }
  68. impl Inode {
  69. // pub fn wait_queue(&self) -> WaitQueue {
  70. // self.inner.wait_queue()
  71. // }
  72. pub fn send_buffer_size(&self) -> usize {
  73. self.inner.send_buffer_size()
  74. }
  75. pub fn recv_buffer_size(&self) -> usize {
  76. self.inner.recv_buffer_size()
  77. }
  78. pub fn accept(&self) -> Result<(Arc<Self>, Endpoint), SystemError> {
  79. self.inner.accept()
  80. }
  81. pub fn bind(&self, endpoint: Endpoint) -> Result<(), SystemError> {
  82. self.inner.bind(endpoint)
  83. }
  84. pub fn set_option(
  85. &self,
  86. level: OptionLevel,
  87. name: usize,
  88. value: &[u8],
  89. ) -> Result<(), SystemError> {
  90. self.inner.set_option(level, name, value)
  91. }
  92. pub fn get_option(
  93. &self,
  94. level: OptionLevel,
  95. name: usize,
  96. value: &mut [u8],
  97. ) -> Result<usize, SystemError> {
  98. self.inner.get_option(level, name, value)
  99. }
  100. pub fn listen(&self, backlog: usize) -> Result<(), SystemError> {
  101. self.inner.listen(backlog)
  102. }
  103. pub fn send_to(
  104. &self,
  105. buffer: &[u8],
  106. address: Endpoint,
  107. flags: MessageFlag,
  108. ) -> Result<usize, SystemError> {
  109. self.inner.send_to(buffer, flags, address)
  110. }
  111. pub fn send(&self, buffer: &[u8], flags: MessageFlag) -> Result<usize, SystemError> {
  112. self.inner.send(buffer, flags)
  113. }
  114. pub fn recv(&self, buffer: &mut [u8], flags: MessageFlag) -> Result<usize, SystemError> {
  115. self.inner.recv(buffer, flags)
  116. }
  117. // TODO receive from split with endpoint or not
  118. pub fn recv_from(
  119. &self,
  120. buffer: &mut [u8],
  121. flags: MessageFlag,
  122. address: Option<Endpoint>,
  123. ) -> Result<(usize, Endpoint), SystemError> {
  124. self.inner.recv_from(buffer, flags, address)
  125. }
  126. pub fn shutdown(&self, how: ShutdownTemp) -> Result<(), SystemError> {
  127. self.inner.shutdown(how)
  128. }
  129. pub fn connect(&self, endpoint: Endpoint) -> Result<(), SystemError> {
  130. self.inner.connect(endpoint)
  131. }
  132. pub fn get_name(&self) -> Result<Endpoint, SystemError> {
  133. self.inner.get_name()
  134. }
  135. pub fn get_peer_name(&self) -> Result<Endpoint, SystemError> {
  136. self.inner.get_peer_name()
  137. }
  138. pub fn new(inner: Arc<dyn Socket>) -> Arc<Self> {
  139. Arc::new(Self {
  140. inner,
  141. epoll_items: EPollItems::default(),
  142. })
  143. }
  144. /// # `epoll_items`
  145. /// socket的epoll事件集
  146. pub fn epoll_items(&self) -> EPollItems {
  147. self.epoll_items.clone()
  148. }
  149. pub fn set_nonblock(&self, _nonblock: bool) {
  150. log::warn!("nonblock is not support yet");
  151. }
  152. pub fn set_close_on_exec(&self, _close_on_exec: bool) {
  153. log::warn!("close_on_exec is not support yet");
  154. }
  155. pub fn inner(&self) -> Arc<dyn Socket> {
  156. return self.inner.clone();
  157. }
  158. }