1mod file;
2mod file_opener;
3mod filesystem;
4mod stdio;
5
6use file::{File, FileHandle};
7pub use file_opener::FileOpener;
8pub use filesystem::FileSystem;
9pub use stdio::{Stderr, Stdin, Stdout};
10
11use crate::Metadata;
12use std::ffi::{OsStr, OsString};
13
14type Inode = usize;
15const ROOT_INODE: Inode = 0;
16
17#[derive(Debug)]
18enum Node {
19 File {
20 inode: Inode,
21 name: OsString,
22 file: File,
23 metadata: Metadata,
24 },
25 Directory {
26 inode: Inode,
27 name: OsString,
28 children: Vec<Inode>,
29 metadata: Metadata,
30 },
31}
32
33impl Node {
34 fn inode(&self) -> Inode {
35 *match self {
36 Self::File { inode, .. } => inode,
37 Self::Directory { inode, .. } => inode,
38 }
39 }
40
41 fn name(&self) -> &OsStr {
42 match self {
43 Self::File { name, .. } => name.as_os_str(),
44 Self::Directory { name, .. } => name.as_os_str(),
45 }
46 }
47
48 fn metadata(&self) -> &Metadata {
49 match self {
50 Self::File { metadata, .. } => metadata,
51 Self::Directory { metadata, .. } => metadata,
52 }
53 }
54
55 fn metadata_mut(&mut self) -> &mut Metadata {
56 match self {
57 Self::File { metadata, .. } => metadata,
58 Self::Directory { metadata, .. } => metadata,
59 }
60 }
61
62 fn set_name(&mut self, new_name: OsString) {
63 match self {
64 Self::File { name, .. } => *name = new_name,
65 Self::Directory { name, .. } => *name = new_name,
66 }
67 }
68}
69
70fn time() -> u64 {
71 #[cfg(not(feature = "no-time"))]
72 {
73 std::time::SystemTime::now()
76 .duration_since(std::time::SystemTime::UNIX_EPOCH)
77 .unwrap()
78 .as_secs()
79 }
80
81 #[cfg(feature = "no-time")]
82 {
83 0
84 }
85}
86
87#[cfg(not(all(unix, feature = "host-fs")))]
92impl std::convert::TryInto<i32> for crate::FileDescriptor {
93 type Error = crate::FsError;
94
95 fn try_into(self) -> std::result::Result<i32, Self::Error> {
96 self.0.try_into().map_err(|_| crate::FsError::InvalidFd)
97 }
98}