wasmer_wasix/syscalls/wasi/
fd_prestat_dir_name.rs1use 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 let guard = inode.read();
22 match guard.deref() {
23 Kind::Dir { .. } | Kind::Root { .. } => {
24 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 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}