wasmer_wasix/syscalls/wasi/
fd_prestat_dir_name.rs

1use super::*;
2use crate::syscalls::*;
3
4#[instrument(level = "trace", skip_all, fields(%fd, path = field::Empty), ret)]
5pub fn fd_prestat_dir_name<M: MemorySize>(
6    ctx: FunctionEnvMut<'_, WasiEnv>,
7    fd: WasiFd,
8    path: WasmPtr<u8, M>,
9    path_len: M::Offset,
10) -> Errno {
11    let env = ctx.data();
12    let (memory, mut state) = unsafe { env.get_memory_and_wasi_state(&ctx, 0) };
13    let path_chars = wasi_try_mem!(path.slice(&memory, path_len));
14
15    let inode = wasi_try!(state.fs.get_fd_inode(fd));
16    let name = inode.name.read().unwrap();
17    Span::current().record("path", name.as_ref());
18
19    // check inode-val.is_preopened?
20
21    let guard = inode.read();
22    match guard.deref() {
23        Kind::Dir { .. } | Kind::Root { .. } => {
24            // TODO: verify this: null termination, etc
25            let path_len: u64 = path_len.into();
26            if (name.len() as u64) < path_len {
27                wasi_try_mem!(
28                    path_chars
29                        .subslice(0..name.len() as u64)
30                        .write_slice(name.as_bytes())
31                );
32                wasi_try_mem!(path_chars.index(name.len() as u64).write(0));
33
34                //trace!("=> result: \"{}\"", inode_val.name);
35
36                Errno::Success
37            } else {
38                Errno::Overflow
39            }
40        }
41        Kind::Symlink { .. }
42        | Kind::Buffer { .. }
43        | Kind::File { .. }
44        | Kind::Socket { .. }
45        | Kind::PipeRx { .. }
46        | Kind::PipeTx { .. }
47        | Kind::DuplexPipe { .. }
48        | Kind::EventNotifications { .. }
49        | Kind::Epoll { .. } => Errno::Notdir,
50    }
51}