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_sync::{FileOpsCore, Locked};
11use starnix_uapi::errors::Errno;
12use starnix_uapi::ino_t;
13
14#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord)]
16pub struct VecDirectoryEntry {
17 pub entry_type: DirectoryEntryType,
19
20 pub name: FsString,
22
23 pub inode: Option<ino_t>,
25}
26
27pub struct VecDirectory(Vec<VecDirectoryEntry>);
29
30impl VecDirectory {
31 pub fn new_file(entries: Vec<VecDirectoryEntry>) -> Box<dyn FileOps> {
32 Box::new(Self(entries))
33 }
34}
35
36impl FileOps for VecDirectory {
37 fileops_impl_directory!();
38 fileops_impl_noop_sync!();
39 fileops_impl_unbounded_seek!();
40
41 fn readdir(
42 &self,
43 _locked: &mut Locked<FileOpsCore>,
44 file: &FileObject,
45 _current_task: &CurrentTask,
46 sink: &mut dyn DirentSink,
47 ) -> Result<(), Errno> {
48 emit_dotdot(file, sink)?;
49
50 for entry in self.0.iter().skip(sink.offset() as usize - 2) {
53 let inode = entry.inode.unwrap_or_else(|| file.fs.allocate_ino());
55 sink.add(inode, sink.offset() + 1, entry.entry_type, entry.name.as_ref())?;
56 }
57 Ok(())
58 }
59}