Add yanix crate and replace nix with yanix in wasi-common (#649)
* Add yanix crate This commit adds `yanix` crate as a Unix dependency for `wasi-common`. `yanix` stands for Yet Another Nix crate and is exactly what the name suggests: a crate in the spirit of the `nix` crate, but which takes a different approach, using lower-level interfaces with less abstraction, so that it fits better with its main use case, implementation of WASI syscalls. * Replace nix with yanix crate Having introduced `yanix` crate as an in-house replacement for the `nix` crate, this commit makes the necessary changes to `wasi-common` to depend _only_ on `yanix` crate. * Address review comments * make `fd_dup` unsafe * rename `get_fd` to `get_fd_flags`, etc. * reuse `io::Error::last_os_error()` to get the last errno value * Address more comments * make all `fcntl` fns unsafe * adjust `wasi-common` impl appropriately * Make all fns operating on RawFd unsafe * Fix linux build * Address more comments
This commit is contained in:
@@ -5,7 +5,8 @@
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
use crate::wasi::*;
|
||||
use std::{io, slice};
|
||||
use crate::{Error, Result};
|
||||
use std::{convert::TryInto, io, mem, slice};
|
||||
use wig::witx_host_types;
|
||||
|
||||
witx_host_types!("snapshot" "wasi_snapshot_preview1");
|
||||
@@ -20,6 +21,64 @@ pub(crate) unsafe fn iovec_to_host_mut(iovec: &mut __wasi_iovec_t) -> io::IoSlic
|
||||
io::IoSliceMut::new(slice)
|
||||
}
|
||||
|
||||
#[allow(dead_code)] // trouble with sockets
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
#[repr(u8)]
|
||||
pub(crate) enum FileType {
|
||||
Unknown = __WASI_FILETYPE_UNKNOWN,
|
||||
BlockDevice = __WASI_FILETYPE_BLOCK_DEVICE,
|
||||
CharacterDevice = __WASI_FILETYPE_CHARACTER_DEVICE,
|
||||
Directory = __WASI_FILETYPE_DIRECTORY,
|
||||
RegularFile = __WASI_FILETYPE_REGULAR_FILE,
|
||||
SocketDgram = __WASI_FILETYPE_SOCKET_DGRAM,
|
||||
SocketStream = __WASI_FILETYPE_SOCKET_STREAM,
|
||||
Symlink = __WASI_FILETYPE_SYMBOLIC_LINK,
|
||||
}
|
||||
|
||||
impl FileType {
|
||||
pub(crate) fn to_wasi(&self) -> __wasi_filetype_t {
|
||||
*self as __wasi_filetype_t
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct Dirent {
|
||||
pub name: String,
|
||||
pub ftype: FileType,
|
||||
pub ino: u64,
|
||||
pub cookie: __wasi_dircookie_t,
|
||||
}
|
||||
|
||||
impl Dirent {
|
||||
/// Serialize the directory entry to the format define by `__wasi_fd_readdir`,
|
||||
/// so that the serialized entries can be concatenated by the implementation.
|
||||
pub fn to_wasi_raw(&self) -> Result<Vec<u8>> {
|
||||
let name = self.name.as_bytes();
|
||||
let namlen = name.len();
|
||||
let dirent_size = mem::size_of::<__wasi_dirent_t>();
|
||||
let offset = dirent_size.checked_add(namlen).ok_or(Error::EOVERFLOW)?;
|
||||
|
||||
let mut raw = Vec::<u8>::with_capacity(offset);
|
||||
raw.resize(offset, 0);
|
||||
|
||||
let sys_dirent = raw.as_mut_ptr() as *mut __wasi_dirent_t;
|
||||
unsafe {
|
||||
*sys_dirent = __wasi_dirent_t {
|
||||
d_namlen: namlen.try_into()?,
|
||||
d_ino: self.ino,
|
||||
d_next: self.cookie,
|
||||
d_type: self.ftype.to_wasi(),
|
||||
};
|
||||
}
|
||||
|
||||
let sys_name = unsafe { sys_dirent.offset(1) as *mut u8 };
|
||||
let sys_name = unsafe { slice::from_raw_parts_mut(sys_name, namlen) };
|
||||
sys_name.copy_from_slice(&name);
|
||||
|
||||
Ok(raw)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user