inode.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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(
  43. &self,
  44. private_data: &crate::filesystem::vfs::FilePrivateData,
  45. ) -> Result<usize, SystemError> {
  46. // let _ = private_data;
  47. Ok(self.inner.poll())
  48. }
  49. fn open(
  50. &self,
  51. _data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  52. _mode: &crate::filesystem::vfs::file::FileMode,
  53. ) -> Result<(), SystemError> {
  54. Ok(())
  55. }
  56. fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> {
  57. let meta = crate::filesystem::vfs::Metadata {
  58. mode: crate::filesystem::vfs::syscall::ModeType::from_bits_truncate(0o755),
  59. file_type: crate::filesystem::vfs::FileType::Socket,
  60. size: self.send_buffer_size() as i64,
  61. ..Default::default()
  62. };
  63. return Ok(meta);
  64. }
  65. fn close(
  66. &self,
  67. _data: crate::libs::spinlock::SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
  68. ) -> Result<(), SystemError> {
  69. self.inner.close()
  70. }
  71. }
  72. impl Inode {
  73. // pub fn wait_queue(&self) -> WaitQueue {
  74. // self.inner.wait_queue()
  75. // }
  76. pub fn send_buffer_size(&self) -> usize {
  77. self.inner.send_buffer_size()
  78. }
  79. pub fn recv_buffer_size(&self) -> usize {
  80. self.inner.recv_buffer_size()
  81. }
  82. pub fn accept(&self) -> Result<(Arc<Self>, Endpoint), SystemError> {
  83. self.inner.accept()
  84. }
  85. pub fn bind(&self, endpoint: Endpoint) -> Result<(), SystemError> {
  86. self.inner.bind(endpoint)
  87. }
  88. pub fn set_option(
  89. &self,
  90. level: OptionsLevel,
  91. name: usize,
  92. value: &[u8],
  93. ) -> Result<(), SystemError> {
  94. self.inner.set_option(level, name, value)
  95. }
  96. pub fn get_option(
  97. &self,
  98. level: OptionsLevel,
  99. name: usize,
  100. value: &mut [u8],
  101. ) -> Result<usize, SystemError> {
  102. self.inner.get_option(level, name, value)
  103. }
  104. pub fn listen(&self, backlog: usize) -> Result<(), SystemError> {
  105. self.inner.listen(backlog)
  106. }
  107. pub fn send_to(
  108. &self,
  109. buffer: &[u8],
  110. address: Endpoint,
  111. flags: MessageFlag,
  112. ) -> Result<usize, SystemError> {
  113. self.inner.send_to(buffer, flags, address)
  114. }
  115. pub fn send(&self, buffer: &[u8], flags: MessageFlag) -> Result<usize, SystemError> {
  116. self.inner.send(buffer, flags)
  117. }
  118. pub fn recv(&self, buffer: &mut [u8], flags: MessageFlag) -> Result<usize, SystemError> {
  119. self.inner.recv(buffer, flags)
  120. }
  121. // TODO receive from split with endpoint or not
  122. pub fn recv_from(
  123. &self,
  124. buffer: &mut [u8],
  125. flags: MessageFlag,
  126. address: Option<Endpoint>,
  127. ) -> Result<(usize, Endpoint), SystemError> {
  128. self.inner.recv_from(buffer, flags, address)
  129. }
  130. pub fn shutdown(&self, how: ShutdownTemp) -> Result<(), SystemError> {
  131. self.inner.shutdown(how)
  132. }
  133. pub fn connect(&self, endpoint: Endpoint) -> Result<(), SystemError> {
  134. self.inner.connect(endpoint)
  135. }
  136. pub fn get_name(&self) -> Result<Endpoint, SystemError> {
  137. self.inner.get_name()
  138. }
  139. pub fn get_peer_name(&self) -> Result<Endpoint, SystemError> {
  140. self.inner.get_peer_name()
  141. }
  142. pub fn new(inner: Arc<dyn Socket>) -> Arc<Self> {
  143. Arc::new(Self {
  144. inner,
  145. epoll_items: EPollItems::default(),
  146. })
  147. }
  148. /// # `epoll_items`
  149. /// socket的epoll事件集
  150. pub fn epoll_items(&self) -> EPollItems {
  151. self.epoll_items.clone()
  152. }
  153. pub fn set_nonblock(&self, nonblock: bool) {
  154. log::warn!("nonblock is not support yet");
  155. }
  156. pub fn set_close_on_exec(&self, close_on_exec: bool) {
  157. log::warn!("close_on_exec is not support yet");
  158. }
  159. pub fn inner(&self) -> Arc<dyn Socket> {
  160. return self.inner.clone();
  161. }
  162. }