wasmer/tests/wasi_test_resources/fd_read.rs
2020-04-15 16:31:05 -07:00

87 lines
2.0 KiB
Rust

// WASI:
// mapdir: .:tests/wasi_test_resources/test_fs/hamlet
// this program is used in the pause/resume test
use std::fs;
#[cfg(target_os = "wasi")]
use std::os::wasi::prelude::AsRawFd;
use std::path::PathBuf;
#[cfg(target_os = "wasi")]
#[repr(C)]
struct WasiIovec {
pub buf: u32,
pub buf_len: u32,
}
#[cfg(target_os = "wasi")]
#[link(wasm_import_module = "wasi_unstable")]
extern "C" {
fn fd_read(fd: u32, iovs: u32, iovs_len: u32, nread: u32) -> u16;
}
#[cfg(target_os = "wasi")]
fn read(fd: u32, iovs: &[&mut [u8]]) -> u32 {
let mut nread = 0;
let mut processed_iovs = vec![];
for iov in iovs {
processed_iovs.push(WasiIovec {
buf: iov.as_ptr() as usize as u32,
buf_len: iov.len() as u32,
})
}
unsafe {
fd_read(
fd,
processed_iovs.as_ptr() as usize as u32,
processed_iovs.len() as u32,
&mut nread as *mut u32 as usize as u32,
);
}
nread
}
fn main() {
#[cfg(not(target_os = "wasi"))]
let mut base = PathBuf::from("tests/wasi_test_resources/test_fs/hamlet");
#[cfg(target_os = "wasi")]
let mut base = PathBuf::from(".");
base.push("act3/scene4.txt");
let mut file = fs::File::open(&base).expect("Could not open file");
let mut buffer = [0u8; 64];
#[cfg(target_os = "wasi")]
{
let raw_fd = file.as_raw_fd();
assert_eq!(read(raw_fd, &[&mut buffer]), 64);
let str_val = std::str::from_utf8(&buffer[..]).unwrap().to_string();
println!("{}", &str_val);
}
// leak the file handle so that we can use it later
std::mem::forget(file);
#[cfg(not(target_os = "wasi"))]
{
// eh, just print the output directly
print!(
"SCENE IV. The Queen's closet.
Enter QUEEN GERTRUDE and POLO"
);
}
}
#[cfg(target_os = "wasi")]
#[no_mangle]
fn second_entry() -> bool {
let raw_fd = 5;
let mut buffer = [0u8; 8];
let result = read(raw_fd, &[&mut buffer]);
&buffer == b"NIUS \n\nL"
}