diff --git a/lib/runtime/src/vmcontext.rs b/lib/runtime/src/vmcontext.rs
index 1a4e5f4..fec9f9a 100644
@@ -476,6 +476,8 @@ impl Default for VMCallerCheckedAnyfunc {
#[derive(Debug)]
#[repr(C)]
pub struct VMContext {}
+fixme: prohibit independent construction of VMContext? that would make
+instance_contents and host_state safe.
impl VMContext {
/// Return a mutable reference to the associated `Instance`.
diff --git a/lib/wasi/src/syscalls.rs b/lib/wasi/src/syscalls.rs
index c1c4391..8276d82 100644
@@ -12,8 +12,8 @@ fn return_encoded_errno(e: host::__wasi_errno_t) -> wasm32::__wasi_errno_t {
errno
}
-unsafe fn get_curfds(vmctx: *mut VMContext) -> *mut fd_table {
- (&mut *(&mut *vmctx)
+fn get_curfds(vmctx: &mut VMContext) -> *mut fd_table {
+ (&mut *vmctx
.host_state()
.downcast_mut::<WASIState>()
.unwrap()
@@ -92,7 +92,7 @@ impl AbiRet for () {
}
macro_rules! syscalls {
- ($(pub unsafe extern "C" fn $name:ident($ctx:ident: *mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty {
+ ($(pub extern "C" fn $name:ident($ctx:ident: &mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty {
$($body:tt)*
})*) => ($(
pub mod $name {
@@ -114,13 +114,13 @@ macro_rules! syscalls {
///
/// NB: ideally we'd expose `shim` below, but it seems like there's
/// a compiler bug which prvents that from being cast to a `usize`.
- pub static SHIM: unsafe extern "C" fn(
- *mut VMContext,
+ pub static SHIM: extern "C" fn(
+ &mut VMContext,
$(<$ty as AbiParam>::Abi),*
) -> <$ret as AbiRet>::Abi = shim;
- unsafe extern "C" fn shim(
- $ctx: *mut VMContext,
+ extern "C" fn shim(
+ $ctx: &mut VMContext,
$($arg: <$ty as AbiParam>::Abi,)*
) -> <$ret as AbiRet>::Abi {
let r = super::$name($ctx, $(<$ty as AbiParam>::convert($arg),)*);
@@ -128,7 +128,7 @@ macro_rules! syscalls {
}
}
- pub unsafe extern "C" fn $name($ctx: *mut VMContext, $($arg: $ty,)*) -> $ret {
+ pub extern "C" fn $name($ctx: &mut VMContext, $($arg: $ty,)*) -> $ret {
$($body)*
}
)*)
@@ -136,8 +136,8 @@ macro_rules! syscalls {
syscalls! {
- pub unsafe extern "C" fn clock_res_get(
- vmctx: *mut VMContext,
+ pub extern "C" fn clock_res_get(
+ vmctx: &mut VMContext,
clock_id: wasm32::__wasi_clockid_t,
resolution: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -147,7 +147,6 @@ syscalls! {
resolution,
);
- let vmctx = &mut *vmctx;
let clock_id = decode_clockid(clock_id);
let mut host_resolution = match decode_timestamp_byref(vmctx, resolution) {
Ok(host_resolution) => host_resolution,
@@ -162,8 +161,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn clock_time_get(
- vmctx: *mut VMContext,
+ pub extern "C" fn clock_time_get(
+ vmctx: &mut VMContext,
clock_id: wasm32::__wasi_clockid_t,
precision: wasm32::__wasi_timestamp_t,
time: wasm32::uintptr_t,
@@ -175,7 +174,6 @@ syscalls! {
time,
);
- let vmctx = &mut *vmctx;
let clock_id = decode_clockid(clock_id);
let precision = decode_timestamp(precision);
let mut host_time = match decode_timestamp_byref(vmctx, time) {
@@ -191,13 +189,12 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_close(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_close(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_close(fd={:?})", fd);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
@@ -206,13 +203,12 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_datasync(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_datasync(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_datasync(fd={:?})", fd);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
@@ -221,8 +217,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_pread(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_pread(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -238,7 +234,6 @@ syscalls! {
nread
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let iovs = match decode_iovec_slice(vmctx, iovs, iovs_len) {
@@ -266,8 +261,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_pwrite(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_pwrite(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -283,7 +278,6 @@ syscalls! {
nwritten
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let iovs = match decode_ciovec_slice(vmctx, iovs, iovs_len) {
@@ -311,8 +305,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_read(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_read(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -326,7 +320,6 @@ syscalls! {
nread
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let iovs = match decode_iovec_slice(vmctx, iovs, iovs_len) {
@@ -346,14 +339,13 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_renumber(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_renumber(
+ vmctx: &mut VMContext,
from: wasm32::__wasi_fd_t,
to: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_renumber(from={:?}, to={:?})", from, to);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let from = decode_fd(from);
let to = decode_fd(to);
@@ -363,8 +355,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_seek(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_seek(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filedelta_t,
whence: wasm32::__wasi_whence_t,
@@ -378,7 +370,6 @@ syscalls! {
newoffset
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let offset = decode_filedelta(offset);
@@ -396,14 +387,13 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_tell(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_tell(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
newoffset: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_tell(fd={:?}, newoffset={:#x?})", fd, newoffset);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let mut host_newoffset = match decode_filesize_byref(vmctx, newoffset) {
@@ -419,14 +409,13 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_stat_get(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_stat_get(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_stat_get(fd={:?}, buf={:#x?})", fd, buf);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let mut host_buf = match decode_fdstat_byref(vmctx, buf) {
@@ -442,8 +431,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_stat_put(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_stat_put(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
flags: wasm32::__wasi_fdsflags_t,
@@ -455,7 +444,6 @@ syscalls! {
flags
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let host_buf = match decode_fdstat_byref(vmctx, buf) {
@@ -469,13 +457,12 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_sync(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_sync(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_sync(fd={:?})", fd);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
@@ -484,8 +471,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn fd_write(
- vmctx: *mut VMContext,
+ pub extern "C" fn fd_write(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -499,7 +486,6 @@ syscalls! {
nwritten
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let iovs = match decode_ciovec_slice(vmctx, iovs, iovs_len) {
@@ -519,8 +505,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_advise(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_advise(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filesize_t,
len: wasm32::__wasi_filesize_t,
@@ -534,7 +520,6 @@ syscalls! {
advice
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let offset = decode_filesize(offset);
@@ -546,15 +531,14 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_allocate(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_allocate(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filesize_t,
len: wasm32::__wasi_filesize_t,
) -> wasm32::__wasi_errno_t {
trace!("file_allocate(fd={:?}, offset={}, len={})", fd, offset, len);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let offset = decode_filesize(offset);
@@ -565,8 +549,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_mkdir(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_mkdir(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -578,7 +562,6 @@ syscalls! {
path_len,
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -591,8 +574,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_link(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_link(
+ vmctx: &mut VMContext,
fd0: wasm32::__wasi_fd_t,
flags0: wasm32::__wasi_lookupflags_t,
path0: wasm32::uintptr_t,
@@ -612,7 +595,6 @@ syscalls! {
path_len1
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd0 = decode_fd(fd0);
let flags0 = decode_lookupflags(flags0);
@@ -634,8 +616,8 @@ syscalls! {
// TODO: When multi-value happens, switch to that instead of passing
// the `fd` by reference?
- pub unsafe extern "C" fn file_open(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_open(
+ vmctx: &mut VMContext,
dirfd: wasm32::__wasi_fd_t,
dirflags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -655,7 +637,6 @@ syscalls! {
fd
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let dirfd = decode_fd(dirfd);
let dirflags = decode_lookupflags(dirflags);
@@ -687,8 +668,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_readdir(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_readdir(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
buf_len: wasm32::size_t,
@@ -704,7 +685,6 @@ syscalls! {
buf_used,
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let (buf, buf_len) = match decode_char_slice(vmctx, buf, buf_len) {
@@ -732,8 +712,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_readlink(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_readlink(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -751,7 +731,6 @@ syscalls! {
buf_used,
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -783,8 +762,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_rename(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_rename(
+ vmctx: &mut VMContext,
fd0: wasm32::__wasi_fd_t,
path0: wasm32::uintptr_t,
path_len0: wasm32::size_t,
@@ -802,7 +781,6 @@ syscalls! {
path_len1,
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd0 = decode_fd(fd0);
let (path0, path_len0) = match decode_char_slice(vmctx, path0, path_len0) {
@@ -820,14 +798,13 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_stat_fget(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_stat_fget(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
trace!("file_stat_fget(fd={:?}, buf={:#x?})", fd, buf);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let mut host_buf = match decode_filestat_byref(vmctx, buf) {
@@ -843,8 +820,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_stat_fput(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_stat_fput(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
fsflags: wasm32::__wasi_fsflags_t,
@@ -856,7 +833,6 @@ syscalls! {
fsflags
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let host_buf = match decode_filestat_byref(vmctx, buf) {
@@ -870,8 +846,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_stat_get(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_stat_get(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
flags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -887,7 +863,6 @@ syscalls! {
buf
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let flags = decode_lookupflags(flags);
@@ -908,8 +883,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_stat_put(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_stat_put(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
flags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -927,7 +902,6 @@ syscalls! {
fsflags
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let flags = decode_lookupflags(flags);
@@ -946,8 +920,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_symlink(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_symlink(
+ vmctx: &mut VMContext,
path0: wasm32::uintptr_t,
path_len0: wasm32::size_t,
fd: wasm32::__wasi_fd_t,
@@ -963,7 +937,6 @@ syscalls! {
path_len1
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let (path0, path_len0) = match decode_char_slice(vmctx, path0, path_len0) {
Ok((path0, path_len0)) => (path0, path_len0),
@@ -980,8 +953,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn file_unlink(
- vmctx: *mut VMContext,
+ pub extern "C" fn file_unlink(
+ vmctx: &mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -995,7 +968,6 @@ syscalls! {
flags
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let fd = decode_fd(fd);
let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -1009,8 +981,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn poll_oneoff(
- vmctx: *mut VMContext,
+ pub extern "C" fn poll_oneoff(
+ vmctx: &mut VMContext,
in_: wasm32::uintptr_t,
out: wasm32::uintptr_t,
nsubscriptions: wasm32::size_t,
@@ -1024,7 +996,6 @@ syscalls! {
nevents,
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let in_ = match decode_subscription_slice(vmctx, in_, nsubscriptions) {
Ok(in_) => in_,
@@ -1063,7 +1034,7 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext, rval: u32,) -> () {
+ pub extern "C" fn proc_exit(_vmctx: &mut VMContext, rval: u32,) -> () {
trace!("proc_exec(rval={:?})", rval);
let rval = decode_exitcode(rval);
@@ -1074,21 +1045,20 @@ syscalls! {
panic!("__wasi_proc_exit({})", rval)
}
- pub unsafe extern "C" fn proc_raise(
- _vmctx: *mut VMContext,
+ pub extern "C" fn proc_raise(
+ _vmctx: &mut VMContext,
_sig: wasm32::__wasi_signal_t,
) -> wasm32::__wasi_errno_t {
unimplemented!("__wasi_proc_raise");
}
- pub unsafe extern "C" fn random_get(
- vmctx: *mut VMContext,
+ pub extern "C" fn random_get(
+ vmctx: &mut VMContext,
buf: wasm32::uintptr_t,
buf_len: wasm32::size_t,
) -> wasm32::__wasi_errno_t {
trace!("random_get(buf={:#x?}, buf_len={:?})", buf, buf_len);
- let vmctx = &mut *vmctx;
let (buf, buf_len) = match decode_char_slice(vmctx, buf, buf_len) {
Ok((buf, buf_len)) => (buf, buf_len),
Err(e) => return return_encoded_errno(e),
@@ -1099,14 +1069,14 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,) -> wasm32::__wasi_errno_t {
+ pub extern "C" fn sched_yield(_vmctx: &mut VMContext,) -> wasm32::__wasi_errno_t {
let e = host::wasmtime_ssp_sched_yield();
return_encoded_errno(e)
}
- pub unsafe extern "C" fn sock_recv(
- vmctx: *mut VMContext,
+ pub extern "C" fn sock_recv(
+ vmctx: &mut VMContext,
sock: wasm32::__wasi_fd_t,
in_: wasm32::uintptr_t,
out: wasm32::uintptr_t,
@@ -1118,7 +1088,6 @@ syscalls! {
out
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let sock = decode_fd(sock);
let in_ = match decode_recv_in_byref(vmctx, in_) {
@@ -1139,8 +1108,8 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn sock_send(
- vmctx: *mut VMContext,
+ pub extern "C" fn sock_send(
+ vmctx: &mut VMContext,
sock: wasm32::__wasi_fd_t,
in_: wasm32::uintptr_t,
out: wasm32::uintptr_t,
@@ -1152,7 +1121,6 @@ syscalls! {
out
);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let sock = decode_fd(sock);
let in_ = match decode_send_in_byref(vmctx, in_) {
@@ -1172,14 +1140,13 @@ syscalls! {
return_encoded_errno(e)
}
- pub unsafe extern "C" fn sock_shutdown(
- vmctx: *mut VMContext,
+ pub extern "C" fn sock_shutdown(
+ vmctx: &mut VMContext,
sock: wasm32::__wasi_fd_t,
how: wasm32::__wasi_sdflags_t,
) -> wasm32::__wasi_errno_t {
trace!("sock_shutdown(sock={:?}, how={:?})", sock, how);
- let vmctx = &mut *vmctx;
let curfds = get_curfds(vmctx);
let sock = decode_fd(sock);
let how = decode_sdflags(how);