wasi-vfs 0.2.0

A virtual filesystem layer for WASI
Documentation
#[cfg(feature = "trace-syscall")]
fn is_tracing_enabled() -> bool {
    extern "C" {
        fn getenv(name: *const i8) -> *const i8;
    }
    let wasi_vfs_trace = std::ffi::CString::new("WASI_VFS_TRACE").unwrap();
    unsafe { !getenv(wasi_vfs_trace.as_ptr()).is_null() }
}

#[cfg(feature = "trace-syscall")]
pub(crate) fn trace_syscall_entry(args: std::fmt::Arguments<'_>) {
    if !is_tracing_enabled() {
        return;
    }
    let message = std::fmt::format(args);
    let data = [wasi::Ciovec {
        buf: message.as_ptr(),
        buf_len: message.len(),
    }];
    let stderr = 2;
    unsafe {
        wasi::fd_write(stderr, &data).unwrap();
    }
}

#[cfg(feature = "trace-syscall")]
pub(crate) fn trace_syscall_error(name: &str, errno: crate::Error) {
    if !is_tracing_enabled() {
        return;
    }
    let message = format!("{} returns {}\n", name, errno.raw());
    let data = [wasi::Ciovec {
        buf: message.as_ptr(),
        buf_len: message.len(),
    }];
    let stderr = 2;
    unsafe {
        wasi::fd_write(stderr, &data).unwrap();
    }
}

pub(crate) fn print(message: String) {
    let data = [wasi::Ciovec {
        buf: message.as_ptr(),
        buf_len: message.len(),
    }];
    let stdout = 1;
    unsafe {
        wasi::fd_write(stdout, &data).unwrap();
    }
}