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:
31
crates/wasi-common/yanix/src/socket.rs
Normal file
31
crates/wasi-common/yanix/src/socket.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
use crate::{Errno, Result};
|
||||
use std::os::unix::prelude::*;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[repr(i32)]
|
||||
pub enum SockType {
|
||||
Stream = libc::SOCK_STREAM,
|
||||
Datagram = libc::SOCK_DGRAM,
|
||||
SeqPacket = libc::SOCK_SEQPACKET,
|
||||
Raw = libc::SOCK_RAW,
|
||||
Rdm = libc::SOCK_RDM,
|
||||
}
|
||||
|
||||
pub unsafe fn get_socket_type(fd: RawFd) -> Result<SockType> {
|
||||
use std::mem::{self, MaybeUninit};
|
||||
let mut buffer = MaybeUninit::<SockType>::zeroed().assume_init();
|
||||
let mut out_len = mem::size_of::<SockType>() as libc::socklen_t;
|
||||
Errno::from_success_code(libc::getsockopt(
|
||||
fd,
|
||||
libc::SOL_SOCKET,
|
||||
libc::SO_TYPE,
|
||||
&mut buffer as *mut SockType as *mut _,
|
||||
&mut out_len,
|
||||
))?;
|
||||
assert_eq!(
|
||||
out_len as usize,
|
||||
mem::size_of::<SockType>(),
|
||||
"invalid SockType value"
|
||||
);
|
||||
Ok(buffer)
|
||||
}
|
||||
Reference in New Issue
Block a user