wasmer_vfs/mem_fs/
mod.rs

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        // SAFETY: It's very unlikely that the system returns a time that
74        // is before `UNIX_EPOCH` :-).
75        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// If the `host-fs` feature is not enabled, let's write a
88// `TryInto<i32>` implementation for `FileDescriptor`, otherwise on
89// Unix, it conflicts with `TryInto<RawFd>` (where `RawFd` is an alias
90// to `i32`).
91#[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}