io.rs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. use crate::kernel::constants::EFAULT;
  2. use crate::prelude::*;
  3. use core::{cmp, mem::MaybeUninit};
  4. #[must_use]
  5. pub enum FillResult {
  6. Done(usize),
  7. Partial(usize),
  8. Full,
  9. }
  10. impl FillResult {
  11. pub fn ok_or(self, err: u32) -> KResult<()> {
  12. match self {
  13. FillResult::Done(_) => Ok(()),
  14. _ => Err(err),
  15. }
  16. }
  17. pub fn should_stop(self) -> bool {
  18. return !matches!(self, FillResult::Done(_));
  19. }
  20. pub fn allow_partial(self) -> usize {
  21. match self {
  22. FillResult::Done(n) | FillResult::Partial(n) => n,
  23. FillResult::Full => 0,
  24. }
  25. }
  26. }
  27. pub trait Buffer {
  28. fn total(&self) -> usize;
  29. fn wrote(&self) -> usize;
  30. #[must_use]
  31. fn fill(&mut self, data: &[u8]) -> KResult<FillResult>;
  32. fn available(&self) -> usize {
  33. self.total() - self.wrote()
  34. }
  35. fn get_writer(&mut self) -> BufferWrite<'_, Self>
  36. where
  37. Self: Sized,
  38. {
  39. BufferWrite(self)
  40. }
  41. }
  42. pub trait Stream {
  43. fn poll_data<'a>(&mut self, buf: &'a mut [u8]) -> KResult<Option<&'a mut [u8]>>;
  44. fn ignore(&mut self, len: usize) -> KResult<Option<usize>>;
  45. }
  46. pub trait IntoStream {
  47. type Stream: Stream;
  48. fn into_stream(self) -> Self::Stream;
  49. }
  50. pub trait StreamRead {
  51. fn read_till_end(
  52. &mut self,
  53. buffer: &mut [u8],
  54. func: impl Fn(&mut [u8]) -> KResult<()>,
  55. ) -> KResult<usize>;
  56. fn ignore_all(&mut self) -> KResult<usize>;
  57. }
  58. impl<T> StreamRead for T
  59. where
  60. T: Stream + ?Sized,
  61. {
  62. fn read_till_end(
  63. &mut self,
  64. buffer: &mut [u8],
  65. func: impl Fn(&mut [u8]) -> KResult<()>,
  66. ) -> KResult<usize> {
  67. let mut total = 0;
  68. while let Some(data) = self.poll_data(buffer)? {
  69. func(data)?;
  70. total += data.len();
  71. }
  72. Ok(total)
  73. }
  74. fn ignore_all(&mut self) -> KResult<usize> {
  75. let mut total = 0;
  76. while let Some(len) = self.ignore(usize::MAX)? {
  77. total += len;
  78. }
  79. Ok(total)
  80. }
  81. }
  82. pub trait BufferFill<T: Copy> {
  83. fn copy(&mut self, object: &T) -> KResult<FillResult>;
  84. }
  85. impl<T: Copy, B: Buffer + ?Sized> BufferFill<T> for B {
  86. fn copy(&mut self, object: &T) -> KResult<FillResult> {
  87. let ptr = object as *const T as *const u8;
  88. let len = core::mem::size_of::<T>();
  89. // SAFETY: `object` is a valid object.
  90. self.fill(unsafe { core::slice::from_raw_parts(ptr, len) })
  91. }
  92. }
  93. pub struct BufferWrite<'b, B>(&'b mut B)
  94. where
  95. B: Buffer + ?Sized;
  96. impl<'b, B> core::fmt::Write for BufferWrite<'b, B>
  97. where
  98. B: Buffer + ?Sized,
  99. {
  100. fn write_str(&mut self, s: &str) -> core::fmt::Result {
  101. match self.0.fill(s.as_bytes()) {
  102. Ok(FillResult::Done(_)) => Ok(()),
  103. _ => Err(core::fmt::Error),
  104. }
  105. }
  106. }
  107. pub struct UninitBuffer<'lt, T: Copy + Sized> {
  108. data: Box<MaybeUninit<T>>,
  109. buffer: ByteBuffer<'lt>,
  110. }
  111. impl<'lt, T: Copy + Sized> UninitBuffer<'lt, T> {
  112. pub fn new() -> Self {
  113. let mut data = Box::new(MaybeUninit::uninit());
  114. let ptr = data.as_mut_ptr();
  115. Self {
  116. data,
  117. buffer: ByteBuffer::from(unsafe {
  118. core::slice::from_raw_parts_mut(ptr as *mut u8, core::mem::size_of::<T>())
  119. }),
  120. }
  121. }
  122. pub fn assume_filled_ref(&self) -> KResult<&T> {
  123. if self.buffer.available() != 0 {
  124. Err(EFAULT)
  125. } else {
  126. Ok(unsafe { self.data.assume_init_ref() })
  127. }
  128. }
  129. pub fn assume_init(self) -> KResult<T> {
  130. if self.buffer.available() != 0 {
  131. Err(EFAULT)
  132. } else {
  133. Ok(unsafe { *self.data.assume_init() })
  134. }
  135. }
  136. }
  137. impl<'lt, T: Copy + Sized> Buffer for UninitBuffer<'lt, T> {
  138. fn total(&self) -> usize {
  139. self.buffer.total()
  140. }
  141. fn wrote(&self) -> usize {
  142. self.buffer.wrote()
  143. }
  144. fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  145. self.buffer.fill(data)
  146. }
  147. }
  148. pub struct ByteBuffer<'lt> {
  149. buf: &'lt mut [u8],
  150. cur: usize,
  151. }
  152. impl<'lt> ByteBuffer<'lt> {
  153. pub fn new(buf: &'lt mut [u8]) -> Self {
  154. Self { buf, cur: 0 }
  155. }
  156. pub fn available(&self) -> usize {
  157. self.buf.len() - self.cur
  158. }
  159. pub fn data(&self) -> &[u8] {
  160. &self.buf[..self.cur]
  161. }
  162. }
  163. impl<'lt, T: Copy + Sized> From<&'lt mut [T]> for ByteBuffer<'lt> {
  164. fn from(value: &'lt mut [T]) -> Self {
  165. Self {
  166. buf: unsafe {
  167. core::slice::from_raw_parts_mut(
  168. value.as_ptr() as *mut u8,
  169. core::mem::size_of::<T>() * value.len(),
  170. )
  171. },
  172. cur: 0,
  173. }
  174. }
  175. }
  176. impl Buffer for ByteBuffer<'_> {
  177. fn total(&self) -> usize {
  178. self.buf.len()
  179. }
  180. fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  181. match self.available() {
  182. 0 => Ok(FillResult::Full),
  183. n if n < data.len() => {
  184. self.buf[self.cur..].copy_from_slice(&data[..n]);
  185. self.cur += n;
  186. Ok(FillResult::Partial(n))
  187. }
  188. _ => {
  189. self.buf[self.cur..self.cur + data.len()].copy_from_slice(data);
  190. self.cur += data.len();
  191. Ok(FillResult::Done(data.len()))
  192. }
  193. }
  194. }
  195. fn wrote(&self) -> usize {
  196. self.cur
  197. }
  198. }
  199. /// Iterator that generates chunks of a given length from a start index
  200. /// until the end of the total length.
  201. ///
  202. /// The iterator returns a tuple of (start, len) for each chunk.
  203. pub struct Chunks {
  204. end: usize,
  205. cur: usize,
  206. chunk_len: usize,
  207. }
  208. impl Chunks {
  209. pub const fn new(start: usize, total_len: usize, chunk_len: usize) -> Self {
  210. Self {
  211. end: start + total_len,
  212. cur: start,
  213. chunk_len,
  214. }
  215. }
  216. }
  217. impl Iterator for Chunks {
  218. type Item = (usize, usize);
  219. fn next(&mut self) -> Option<Self::Item> {
  220. if self.cur >= self.end {
  221. return None;
  222. }
  223. let start = self.cur;
  224. let len = cmp::min(self.chunk_len, self.end - start);
  225. self.cur += self.chunk_len;
  226. Some((start, len))
  227. }
  228. }
  229. pub struct ByteStream<'a> {
  230. data: &'a [u8],
  231. cur: usize,
  232. }
  233. impl<'a> ByteStream<'a> {
  234. pub fn new(data: &'a [u8]) -> Self {
  235. Self { data, cur: 0 }
  236. }
  237. }
  238. impl<'a> Stream for ByteStream<'a> {
  239. fn poll_data<'b>(&mut self, buf: &'b mut [u8]) -> KResult<Option<&'b mut [u8]>> {
  240. if self.cur >= self.data.len() {
  241. return Ok(None);
  242. }
  243. let end = core::cmp::min(self.data.len(), self.cur + buf.len());
  244. let data = &self.data[self.cur..end];
  245. let buf = &mut buf[..data.len()];
  246. buf.copy_from_slice(data);
  247. self.cur += data.len();
  248. Ok(Some(buf))
  249. }
  250. fn ignore(&mut self, len: usize) -> KResult<Option<usize>> {
  251. if self.cur >= self.data.len() {
  252. return Ok(None);
  253. }
  254. let remaining = self.data.len() - self.cur;
  255. let ignored = core::cmp::min(remaining, len);
  256. self.cur += ignored;
  257. Ok(Some(ignored))
  258. }
  259. }
  260. impl<'a> IntoStream for &'a [u8] {
  261. type Stream = ByteStream<'a>;
  262. fn into_stream(self) -> Self::Stream {
  263. ByteStream::new(self)
  264. }
  265. }