You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
908 B
37 lines
908 B
use vfs::{INode, Result, FileInfo};
|
|
use alloc::{sync::Arc, string::String};
|
|
|
|
pub struct File {
|
|
inode: Arc<INode>,
|
|
offset: usize,
|
|
readable: bool,
|
|
writable: bool,
|
|
}
|
|
|
|
impl File {
|
|
pub fn new(inode: Arc<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<FileInfo> {
|
|
self.inode.info()
|
|
}
|
|
|
|
pub fn get_entry(&self, id: usize) -> Result<String> {
|
|
self.inode.get_entry(id)
|
|
}
|
|
} |