pub struct INodeTable<F> { /* private fields */ }Expand description
A generic INodeTable which allows indexing by paths and inodes
Maps F as a “File” type
Implementations§
Source§impl<F> INodeTable<F>
impl<F> INodeTable<F>
Sourcepub fn push_entry<E: IntoINodeEntry<F>>(
&mut self,
parent: INode,
name: OsString,
entry: E,
) -> Option<INode>
pub fn push_entry<E: IntoINodeEntry<F>>( &mut self, parent: INode, name: OsString, entry: E, ) -> Option<INode>
Examples found in repository?
examples/memfs.rs (line 18)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 let mount = &Path::new("./memfs-mount/");
14 let _ = std::fs::create_dir(mount);
15
16 let mut fs = MemFS::new();
17 fs.inodes
18 .push_entry(ROOT_INODE, "test".into(), Directory::default());
19
20 fs.inodes
21 .push_entry(2u64.into(), "test2".into(), Directory::default());
22
23 fs.inodes
24 .push_entry(3u64.into(), "test3".into(), Directory::default());
25
26 fs.inodes
27 .push_entry(1u64.into(), "root2".into(), Directory::default());
28
29 fs.inodes.push_entry(
30 ROOT_INODE,
31 "file".into(),
32 File::new(TEST_MSG.as_bytes().into()),
33 );
34
35 let mut r = Runner::new(fs, mount);
36 println!("{:#?}", r);
37 r.run_block()?;
38
39 Ok(())
40}Sourcepub fn get<T: Into<INode>>(&self, ino: T) -> Option<&INodeEntry<F>>
pub fn get<T: Into<INode>>(&self, ino: T) -> Option<&INodeEntry<F>>
Examples found in repository?
examples/memfs.rs (line 90)
87 fn lookup(&mut self, parent: INode, name: &OsStr) -> Result<Lookup> {
88 let parent = self
89 .inodes
90 .get(parent)
91 .ok_or(FSError::NoEntry)
92 .and_then(|x| x.as_dir().ok_or(FSError::NotDirectory))?;
93
94 let (child_ino, child) = parent
95 .get(name)
96 // get the inode entry and then map it into (inode, &entry)
97 .and_then(|ino| self.inodes.get(*ino).map(|x| (*ino, x)))
98 .ok_or(FSError::NoEntry)?;
99
100 Ok(Lookup::builder()
101 .attributes(child.getattrs())
102 .inode(child_ino)
103 .build())
104 }
105
106 fn getattr(&mut self, inode: INode) -> Result<FileAttributes> {
107 let entry = self.inodes.get(inode).ok_or(FSError::NoEntry)?;
108
109 Ok(entry.getattrs())
110 }
111
112 fn readdir(&mut self, dir_ino: INode, offset: u64) -> Result<Vec<DirEntry>> {
113 let dir_main = self.inodes.get(dir_ino).ok_or(FSError::NoEntry)?;
114 let dir = dir_main.as_dir().ok_or(FSError::NotDirectory)?;
115
116 let dots = [
117 DirEntry::builder()
118 .name(".".into())
119 .inode(dir_ino)
120 .typ(FileType::Directory)
121 .offset(1)
122 .build(),
123 DirEntry::builder()
124 .name("..".into())
125 .inode(dir_main.parent().unwrap_or(ROOT_INODE))
126 .typ(FileType::Directory)
127 .offset(2)
128 .build(),
129 ];
130
131 Ok(dots
132 .into_iter()
133 .chain(
134 dir.children()
135 .enumerate()
136 .map(
137 |(off, v)| (off + 3, v), // add 3 to skip 0 and the two dots
138 )
139 .map(|(offset, (name, inode))| {
140 DirEntry::builder()
141 .name(name.clone())
142 .offset(offset as u64)
143 .inode(inode)
144 .typ(self.inodes.get(inode).unwrap().file_type())
145 .build()
146 }),
147 )
148 .skip(offset as usize)
149 .collect())
150 }
151
152 fn read(&mut self, ino: INode, offset: u64, size: u32) -> Result<&[u8]> {
153 let file = self.inodes.get(ino).ok_or(FSError::NoEntry)?;
154 let file = file.as_file().ok_or(FSError::NotFile)?;
155
156 let offset = offset as usize;
157 let size = size as usize;
158
159 let content = file.data.get(offset..).unwrap_or(&[]);
160 let content = &content[..std::cmp::min(file.size(), size)];
161
162 Ok(content)
163 }Sourcepub fn get_mut<T: Into<INode>>(&mut self, ino: T) -> Option<&mut INodeEntry<F>>
pub fn get_mut<T: Into<INode>>(&mut self, ino: T) -> Option<&mut INodeEntry<F>>
Examples found in repository?
examples/memfs.rs (line 166)
165 fn write<T: BufRead>(&mut self, ino: INode, offset: u64, size: u32, mut buf: T) -> Result<u32> {
166 let file = self.inodes.get_mut(ino).ok_or(FSError::NoEntry)?;
167 let file = file.as_file_mut().ok_or(FSError::NotFile)?;
168
169 let offset = offset as usize;
170 let size = size as usize;
171
172 file.data
173 .resize(std::cmp::max(file.size(), offset + size), 0);
174
175 buf.read_exact(&mut file.data[offset..offset + size])
176 .unwrap();
177
178 file.attrs.set_size((offset + size) as u64);
179
180 Ok(size as u32)
181 }
182
183 fn setattr(&mut self, ino: INode, attrs: SetFileAttributes) -> Result<FileAttributes> {
184 let entry = self.inodes.get_mut(ino).ok_or(FSError::NoEntry)?;
185
186 match entry.kind_mut() {
187 INodeKind::Directory(dir) => dir.apply_attrs(attrs),
188 INodeKind::File(file) => file.attrs.apply_attrs(attrs),
189 };
190
191 Ok(entry.getattrs())
192 }Sourcepub fn lookup<T: AsRef<Path>>(&self, path: T) -> Option<(INode, &INodeEntry<F>)>
pub fn lookup<T: AsRef<Path>>(&self, path: T) -> Option<(INode, &INodeEntry<F>)>
Looks up a path. Will function with or without a leading slash
let mut tbl = INodeTable::<()>::default();
let test_dir_inode = tbl.push_entry(ROOT_INODE, "example directory".into(),
Directory::default()).unwrap();
let root = tbl.lookup("/").unwrap();
let test_dir = tbl.lookup("example directory").unwrap();
assert_eq!(root.0, ROOT_INODE);
assert_eq!(test_dir.0, test_dir_inode);Sourcepub fn lookup_mut<T: AsRef<Path>>(
&mut self,
path: T,
) -> Option<(INode, &mut INodeEntry<F>)>
pub fn lookup_mut<T: AsRef<Path>>( &mut self, path: T, ) -> Option<(INode, &mut INodeEntry<F>)>
See lookup for details
Trait Implementations§
Source§impl<F: Debug> Debug for INodeTable<F>
impl<F: Debug> Debug for INodeTable<F>
Source§impl<F> Default for INodeTable<F>
impl<F> Default for INodeTable<F>
Source§fn default() -> INodeTable<F>
fn default() -> INodeTable<F>
Returns the “default value” for a type. Read more
Auto Trait Implementations§
impl<F> Freeze for INodeTable<F>
impl<F> RefUnwindSafe for INodeTable<F>where
F: RefUnwindSafe,
impl<F> Send for INodeTable<F>where
F: Send,
impl<F> Sync for INodeTable<F>where
F: Sync,
impl<F> Unpin for INodeTable<F>where
F: Unpin,
impl<F> UnsafeUnpin for INodeTable<F>
impl<F> UnwindSafe for INodeTable<F>where
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more