diff --git a/src/hostcalls_impl/fs.rs b/src/hostcalls_impl/fs.rs index 619ed8cc52..c44525cdb0 100644 --- a/src/hostcalls_impl/fs.rs +++ b/src/hostcalls_impl/fs.rs @@ -1062,3 +1062,23 @@ pub(crate) unsafe fn fd_prestat_dir_name( enc_slice_of(memory, path.as_bytes(), path_ptr) }) } + +#[allow(dead_code)] // trouble with sockets +#[derive(Clone, Copy, Debug)] +#[repr(u8)] +pub(crate) enum FileType { + Unknown = host::__WASI_FILETYPE_UNKNOWN, + BlockDevice = host::__WASI_FILETYPE_BLOCK_DEVICE, + CharacterDevice = host::__WASI_FILETYPE_CHARACTER_DEVICE, + Directory = host::__WASI_FILETYPE_DIRECTORY, + RegularFile = host::__WASI_FILETYPE_REGULAR_FILE, + SocketDgram = host::__WASI_FILETYPE_SOCKET_DGRAM, + SocketStream = host::__WASI_FILETYPE_SOCKET_STREAM, + Symlink = host::__WASI_FILETYPE_SYMBOLIC_LINK, +} + +impl FileType { + pub(crate) fn to_wasi(&self) -> host::__wasi_filetype_t { + *self as host::__wasi_filetype_t + } +} diff --git a/src/sys/unix/host_impl.rs b/src/sys/unix/host_impl.rs index c93c1e786f..f355002d3a 100644 --- a/src/sys/unix/host_impl.rs +++ b/src/sys/unix/host_impl.rs @@ -2,6 +2,7 @@ #![allow(non_camel_case_types)] #![allow(non_snake_case)] #![allow(dead_code)] +use crate::hostcalls_impl::FileType; use crate::{host, memory, Error, Result}; use log::warn; use std::ffi::OsStr; @@ -156,22 +157,22 @@ pub(crate) fn nix_from_oflags(oflags: host::__wasi_oflags_t) -> nix::fcntl::OFla nix_flags } -pub(crate) fn filetype_from_nix(sflags: nix::sys::stat::SFlag) -> host::__wasi_filetype_t { +pub(crate) fn filetype_from_nix(sflags: nix::sys::stat::SFlag) -> FileType { use nix::sys::stat::SFlag; if sflags.contains(SFlag::S_IFCHR) { - host::__WASI_FILETYPE_CHARACTER_DEVICE + FileType::CharacterDevice } else if sflags.contains(SFlag::S_IFBLK) { - host::__WASI_FILETYPE_BLOCK_DEVICE + FileType::BlockDevice } else if sflags.contains(SFlag::S_IFSOCK) { - host::__WASI_FILETYPE_SOCKET_STREAM + FileType::SocketStream } else if sflags.contains(SFlag::S_IFDIR) { - host::__WASI_FILETYPE_DIRECTORY + FileType::Directory } else if sflags.contains(SFlag::S_IFREG) { - host::__WASI_FILETYPE_REGULAR_FILE + FileType::RegularFile } else if sflags.contains(SFlag::S_IFLNK) { - host::__WASI_FILETYPE_SYMBOLIC_LINK + FileType::Symlink } else { - host::__WASI_FILETYPE_UNKNOWN + FileType::Unknown } } @@ -200,7 +201,7 @@ pub(crate) fn filestat_from_nix( st_atim, st_ctim, st_mtim, - st_filetype: filetype_from_nix(filetype), + st_filetype: filetype_from_nix(filetype).to_wasi(), }) } diff --git a/src/sys/unix/hostcalls_impl/fs.rs b/src/sys/unix/hostcalls_impl/fs.rs index f1a2bb1e5c..d5d79e96a7 100644 --- a/src/sys/unix/hostcalls_impl/fs.rs +++ b/src/sys/unix/hostcalls_impl/fs.rs @@ -2,7 +2,7 @@ #![allow(unused_unsafe)] use super::fs_helpers::*; use crate::helpers::systemtime_to_timestamp; -use crate::hostcalls_impl::PathGet; +use crate::hostcalls_impl::{FileType, PathGet}; use crate::sys::host_impl; use crate::{host, Error, Result}; use nix::libc; @@ -219,35 +219,35 @@ pub(crate) fn fd_filestat_get_impl(file: &std::fs::File) -> Result Result { +fn filetype(file: &File, metadata: &Metadata) -> Result { use nix::sys::socket::{self, SockType}; use std::os::unix::fs::FileTypeExt; let ftype = metadata.file_type(); if ftype.is_file() { - Ok(host::__WASI_FILETYPE_REGULAR_FILE) + Ok(FileType::RegularFile) } else if ftype.is_dir() { - Ok(host::__WASI_FILETYPE_DIRECTORY) + Ok(FileType::Directory) } else if ftype.is_symlink() { - Ok(host::__WASI_FILETYPE_SYMBOLIC_LINK) + Ok(FileType::Symlink) } else if ftype.is_char_device() { - Ok(host::__WASI_FILETYPE_CHARACTER_DEVICE) + Ok(FileType::CharacterDevice) } else if ftype.is_block_device() { - Ok(host::__WASI_FILETYPE_BLOCK_DEVICE) + Ok(FileType::BlockDevice) } else if ftype.is_socket() { match socket::getsockopt(file.as_raw_fd(), socket::sockopt::SockType) .map_err(|err| err.as_errno().unwrap()) .map_err(host_impl::errno_from_nix)? { - SockType::Datagram => Ok(host::__WASI_FILETYPE_SOCKET_DGRAM), - SockType::Stream => Ok(host::__WASI_FILETYPE_SOCKET_STREAM), - _ => Ok(host::__WASI_FILETYPE_UNKNOWN), + SockType::Datagram => Ok(FileType::SocketDgram), + SockType::Stream => Ok(FileType::SocketStream), + _ => Ok(FileType::Unknown), } } else { - Ok(host::__WASI_FILETYPE_UNKNOWN) + Ok(FileType::Unknown) } } diff --git a/src/sys/windows/hostcalls_impl/fs.rs b/src/sys/windows/hostcalls_impl/fs.rs index 70ae34f7f8..e8c195c9b2 100644 --- a/src/sys/windows/hostcalls_impl/fs.rs +++ b/src/sys/windows/hostcalls_impl/fs.rs @@ -4,7 +4,7 @@ use super::fs_helpers::*; use crate::ctx::WasiCtx; use crate::fdentry::FdEntry; use crate::helpers::systemtime_to_timestamp; -use crate::hostcalls_impl::{fd_filestat_set_times_impl, PathGet}; +use crate::hostcalls_impl::{fd_filestat_set_times_impl, FileType, PathGet}; use crate::sys::fdentry_impl::{determine_type_rights, OsFile}; use crate::sys::host_impl; use crate::sys::hostcalls_impl::fs_helpers::PathGetExt; @@ -286,20 +286,20 @@ pub(crate) fn fd_filestat_get_impl(file: &std::fs::File) -> Result Result { +fn filetype(_file: &File, metadata: &Metadata) -> Result { let ftype = metadata.file_type(); let ret = if ftype.is_file() { - host::__WASI_FILETYPE_REGULAR_FILE + FileType::RegularFile } else if ftype.is_dir() { - host::__WASI_FILETYPE_DIRECTORY + FileType::Directory } else if ftype.is_symlink() { - host::__WASI_FILETYPE_SYMBOLIC_LINK + FileType::Symlink } else { - host::__WASI_FILETYPE_UNKNOWN + FileType::Unknown }; Ok(ret)