starnix_core/vfs/pseudo/
vec_directory.rs1use crate::task::CurrentTask;
6use crate::vfs::{
7 DirectoryEntryType, DirentSink, FileObject, FileOps, FsString, emit_dotdot,
8 fileops_impl_directory, fileops_impl_noop_sync, fileops_impl_unbounded_seek,
9};
10use starnix_uapi::errors::Errno;
11use starnix_uapi::ino_t;
12
13#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord)]
15pub struct VecDirectoryEntry {
16 pub entry_type: DirectoryEntryType,
18
19 pub name: FsString,
21
22 pub inode: Option<ino_t>,
24}
25
26pub struct VecDirectory(Vec<VecDirectoryEntry>);
28
29impl VecDirectory {
30 pub fn new_file(entries: Vec<VecDirectoryEntry>) -> Box<dyn FileOps> {
31 Box::new(Self(entries))
32 }
33}
34
35impl FileOps for VecDirectory {
36 fileops_impl_directory!();
37 fileops_impl_noop_sync!();
38 fileops_impl_unbounded_seek!();
39
40 fn readdir(
41 &self,
42 file: &FileObject,
43 _current_task: &CurrentTask,
44 sink: &mut dyn DirentSink,
45 ) -> Result<(), Errno> {
46 emit_dotdot(file, sink)?;
47
48 for entry in self.0.iter().skip(sink.offset() as usize - 2) {
51 let inode = entry.inode.unwrap_or_else(|| file.fs.allocate_ino());
53 sink.add(inode, sink.offset() + 1, entry.entry_type, entry.name.as_ref())?;
54 }
55 Ok(())
56 }
57}