bpf_writer.rs 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use solana_program::program_memory::sol_memcpy;
  2. use std::cmp;
  3. use std::io::{self, Write};
  4. #[derive(Debug, Default)]
  5. pub struct BpfWriter<T> {
  6. inner: T,
  7. pos: u64,
  8. }
  9. impl<T> BpfWriter<T> {
  10. pub fn new(inner: T) -> Self {
  11. Self { inner, pos: 0 }
  12. }
  13. }
  14. impl Write for BpfWriter<&mut [u8]> {
  15. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  16. if self.pos >= self.inner.len() as u64 {
  17. return Ok(0);
  18. }
  19. let amt = cmp::min(
  20. self.inner.len().saturating_sub(self.pos as usize),
  21. buf.len(),
  22. );
  23. sol_memcpy(&mut self.inner[(self.pos as usize)..], buf, amt);
  24. self.pos += amt as u64;
  25. Ok(amt)
  26. }
  27. fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
  28. if self.write(buf)? == buf.len() {
  29. Ok(())
  30. } else {
  31. Err(io::Error::new(
  32. io::ErrorKind::WriteZero,
  33. "failed to write whole buffer",
  34. ))
  35. }
  36. }
  37. fn flush(&mut self) -> io::Result<()> {
  38. Ok(())
  39. }
  40. }