1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
use crate::vfs::{INode, Metadata, Result}; use alloc::{string::String, sync::Arc}; pub struct File { inode: Arc<dyn INode>, offset: usize, readable: bool, writable: bool, } impl File { pub fn new(inode: Arc<dyn INode>, readable: bool, writable: bool) -> Self { File { inode, offset: 0, readable, writable, } } pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> { assert!(self.readable); let len = self.inode.read_at(self.offset, buf)?; self.offset += len; Ok(len) } pub fn write(&mut self, buf: &[u8]) -> Result<usize> { assert!(self.writable); let len = self.inode.write_at(self.offset, buf)?; self.offset += len; Ok(len) } pub fn info(&self) -> Result<Metadata> { self.inode.metadata() } pub fn get_entry(&self, id: usize) -> Result<String> { self.inode.get_entry(id) } }