mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-21 12:41:32 +00:00
add mapdir for emscripten; implement getdents, etc.
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -2336,6 +2336,7 @@ version = "0.4.2"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -9,14 +9,15 @@ edition = "2018"
|
|||||||
build = "build/mod.rs"
|
build = "build/mod.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" }
|
byteorder = "1"
|
||||||
|
hashbrown = "0.1"
|
||||||
lazy_static = "1.2.0"
|
lazy_static = "1.2.0"
|
||||||
libc = "0.2.49"
|
libc = "0.2.49"
|
||||||
byteorder = "1"
|
|
||||||
time = "0.1.41"
|
time = "0.1.41"
|
||||||
wasmer-clif-backend = { path = "../clif-backend", version = "0.4.2" }
|
wasmer-clif-backend = { path = "../clif-backend", version = "0.4.2" }
|
||||||
wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.4.2", optional = true }
|
|
||||||
wasmer-llvm-backend = { path = "../llvm-backend", version = "0.4.2", optional = true }
|
wasmer-llvm-backend = { path = "../llvm-backend", version = "0.4.2", optional = true }
|
||||||
|
wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" }
|
||||||
|
wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.4.2", optional = true }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
rand = "0.6"
|
rand = "0.6"
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate wasmer_runtime_core;
|
extern crate wasmer_runtime_core;
|
||||||
|
|
||||||
|
use hashbrown::HashMap;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::{f64, ffi::c_void};
|
use std::{f64, ffi::c_void};
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
error::CallResult,
|
error::CallResult,
|
||||||
@ -141,10 +143,14 @@ pub struct EmscriptenData<'a> {
|
|||||||
pub stack_save: Option<Func<'a, (), i32>>,
|
pub stack_save: Option<Func<'a, (), i32>>,
|
||||||
pub stack_restore: Option<Func<'a, (i32)>>,
|
pub stack_restore: Option<Func<'a, (i32)>>,
|
||||||
pub set_threw: Option<Func<'a, (i32, i32)>>,
|
pub set_threw: Option<Func<'a, (i32, i32)>>,
|
||||||
|
pub mapped_dirs: HashMap<String, PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> EmscriptenData<'a> {
|
impl<'a> EmscriptenData<'a> {
|
||||||
pub fn new(instance: &'a mut Instance) -> EmscriptenData<'a> {
|
pub fn new(
|
||||||
|
instance: &'a mut Instance,
|
||||||
|
mapped_dirs: HashMap<String, PathBuf>,
|
||||||
|
) -> EmscriptenData<'a> {
|
||||||
let malloc = instance.func("_malloc").unwrap();
|
let malloc = instance.func("_malloc").unwrap();
|
||||||
let free = instance.func("_free").unwrap();
|
let free = instance.func("_free").unwrap();
|
||||||
let memalign = instance.func("_memalign").ok();
|
let memalign = instance.func("_memalign").ok();
|
||||||
@ -272,6 +278,7 @@ impl<'a> EmscriptenData<'a> {
|
|||||||
stack_save,
|
stack_save,
|
||||||
stack_restore,
|
stack_restore,
|
||||||
set_threw,
|
set_threw,
|
||||||
|
mapped_dirs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -282,8 +289,9 @@ pub fn run_emscripten_instance(
|
|||||||
path: &str,
|
path: &str,
|
||||||
args: Vec<&str>,
|
args: Vec<&str>,
|
||||||
entrypoint: Option<String>,
|
entrypoint: Option<String>,
|
||||||
|
mapped_dirs: Vec<(String, PathBuf)>,
|
||||||
) -> CallResult<()> {
|
) -> CallResult<()> {
|
||||||
let mut data = EmscriptenData::new(instance);
|
let mut data = EmscriptenData::new(instance, mapped_dirs.into_iter().collect());
|
||||||
let data_ptr = &mut data as *mut _ as *mut c_void;
|
let data_ptr = &mut data as *mut _ as *mut c_void;
|
||||||
instance.context_mut().data = data_ptr;
|
instance.context_mut().data = data_ptr;
|
||||||
|
|
||||||
|
@ -10,7 +10,8 @@ pub use self::unix::*;
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
pub use self::windows::*;
|
pub use self::windows::*;
|
||||||
|
|
||||||
use super::utils::copy_stat_into_wasm;
|
use crate::utils::{copy_stat_into_wasm, get_cstr_path, get_current_directory};
|
||||||
|
|
||||||
use super::varargs::VarArgs;
|
use super::varargs::VarArgs;
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
/// NOTE: TODO: These syscalls only support wasm_32 for now because they assume offsets are u32
|
/// NOTE: TODO: These syscalls only support wasm_32 for now because they assume offsets are u32
|
||||||
@ -94,13 +95,17 @@ pub fn ___syscall6(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
pub fn ___syscall12(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
pub fn ___syscall12(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||||
debug!("emscripten::___syscall12 (chdir) {}", _which);
|
debug!("emscripten::___syscall12 (chdir) {}", _which);
|
||||||
let path_addr: i32 = varargs.get(ctx);
|
let path_addr: i32 = varargs.get(ctx);
|
||||||
unsafe {
|
|
||||||
let path_ptr = emscripten_memory_pointer!(ctx.memory(0), path_addr) as *const i8;
|
let path_ptr = emscripten_memory_pointer!(ctx.memory(0), path_addr) as *const i8;
|
||||||
let _path = std::ffi::CStr::from_ptr(path_ptr);
|
let real_path = get_cstr_path(ctx, path_ptr)
|
||||||
let ret = chdir(path_ptr);
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
debug!("=> path: {:?}, ret: {}", _path, ret);
|
.unwrap_or(path_ptr);
|
||||||
|
let ret = unsafe { chdir(real_path) };
|
||||||
|
debug!(
|
||||||
|
"=> path: {:?}, ret: {}",
|
||||||
|
unsafe { std::ffi::CStr::from_ptr(real_path) },
|
||||||
|
ret
|
||||||
|
);
|
||||||
ret
|
ret
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ___syscall10(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
pub fn ___syscall10(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||||
@ -126,11 +131,17 @@ pub fn ___syscall38(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
|
|||||||
let new_path_addr: u32 = varargs.get(ctx);
|
let new_path_addr: u32 = varargs.get(ctx);
|
||||||
let old_path = emscripten_memory_pointer!(ctx.memory(0), old_path_addr) as *const i8;
|
let old_path = emscripten_memory_pointer!(ctx.memory(0), old_path_addr) as *const i8;
|
||||||
let new_path = emscripten_memory_pointer!(ctx.memory(0), new_path_addr) as *const i8;
|
let new_path = emscripten_memory_pointer!(ctx.memory(0), new_path_addr) as *const i8;
|
||||||
let result = unsafe { rename(old_path, new_path) };
|
let real_old_path = get_cstr_path(ctx, old_path)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(old_path);
|
||||||
|
let real_new_path = get_cstr_path(ctx, new_path)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(new_path);
|
||||||
|
let result = unsafe { rename(real_old_path, real_new_path) };
|
||||||
debug!(
|
debug!(
|
||||||
"=> old_path: {}, new_path: {}, result: {}",
|
"=> old_path: {}, new_path: {}, result: {}",
|
||||||
unsafe { std::ffi::CStr::from_ptr(old_path).to_str().unwrap() },
|
unsafe { std::ffi::CStr::from_ptr(real_old_path).to_str().unwrap() },
|
||||||
unsafe { std::ffi::CStr::from_ptr(new_path).to_str().unwrap() },
|
unsafe { std::ffi::CStr::from_ptr(real_new_path).to_str().unwrap() },
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
result
|
result
|
||||||
@ -141,7 +152,10 @@ pub fn ___syscall40(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
debug!("emscripten::___syscall40 (rmdir)");
|
debug!("emscripten::___syscall40 (rmdir)");
|
||||||
let pathname: u32 = varargs.get(ctx);
|
let pathname: u32 = varargs.get(ctx);
|
||||||
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
||||||
unsafe { rmdir(pathname_addr) }
|
let real_path = get_cstr_path(ctx, pathname_addr)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(pathname_addr);
|
||||||
|
unsafe { rmdir(real_path) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// pipe
|
// pipe
|
||||||
@ -224,10 +238,9 @@ pub fn ___syscall110(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
|||||||
// getcwd
|
// getcwd
|
||||||
pub fn ___syscall183(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
|
pub fn ___syscall183(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
|
||||||
debug!("emscripten::___syscall183");
|
debug!("emscripten::___syscall183");
|
||||||
use std::env;
|
|
||||||
let buf_offset: c_int = varargs.get(ctx);
|
let buf_offset: c_int = varargs.get(ctx);
|
||||||
let _size: c_int = varargs.get(ctx);
|
let _size: c_int = varargs.get(ctx);
|
||||||
let path = env::current_dir();
|
let path = get_current_directory(ctx);
|
||||||
let path_string = path.unwrap().display().to_string();
|
let path_string = path.unwrap().display().to_string();
|
||||||
let len = path_string.len();
|
let len = path_string.len();
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -401,15 +414,18 @@ pub fn ___syscall195(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
|||||||
let buf: u32 = varargs.get(ctx);
|
let buf: u32 = varargs.get(ctx);
|
||||||
|
|
||||||
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
||||||
|
let real_path = get_cstr_path(ctx, pathname_addr)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(pathname_addr);
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut _stat: stat = std::mem::zeroed();
|
let mut _stat: stat = std::mem::zeroed();
|
||||||
let ret = stat(pathname_addr, &mut _stat);
|
let ret = stat(real_path, &mut _stat);
|
||||||
debug!(
|
debug!(
|
||||||
"=> pathname: {}, buf: {}, path: {} = {}\nlast os error: {}",
|
"=> pathname: {}, buf: {}, path: {} = {}\nlast os error: {}",
|
||||||
pathname,
|
pathname,
|
||||||
buf,
|
buf,
|
||||||
std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap(),
|
std::ffi::CStr::from_ptr(real_path).to_str().unwrap(),
|
||||||
ret,
|
ret,
|
||||||
Error::last_os_error()
|
Error::last_os_error()
|
||||||
);
|
);
|
||||||
@ -440,11 +456,6 @@ pub fn ___syscall197(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ___syscall220(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
|
||||||
debug!("emscripten::___syscall220");
|
|
||||||
-1
|
|
||||||
}
|
|
||||||
|
|
||||||
// fcntl64
|
// fcntl64
|
||||||
pub fn ___syscall221(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
pub fn ___syscall221(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||||
debug!("emscripten::___syscall221 (fcntl64) {}", _which);
|
debug!("emscripten::___syscall221 (fcntl64) {}", _which);
|
||||||
@ -457,7 +468,7 @@ pub fn ___syscall221(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
|||||||
// |FNONBLOCK - 0x04
|
// |FNONBLOCK - 0x04
|
||||||
debug!("=> fd: {}, cmd: {}", _fd, cmd);
|
debug!("=> fd: {}, cmd: {}", _fd, cmd);
|
||||||
match cmd {
|
match cmd {
|
||||||
2 => 0,
|
1 | 2 => 0,
|
||||||
13 | 14 => 0, // pretend file locking worked
|
13 | 14 => 0, // pretend file locking worked
|
||||||
_ => -1,
|
_ => -1,
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,7 @@ use libc::{
|
|||||||
pid_t,
|
pid_t,
|
||||||
pread,
|
pread,
|
||||||
pwrite,
|
pwrite,
|
||||||
|
readdir,
|
||||||
// readv,
|
// readv,
|
||||||
recvfrom,
|
recvfrom,
|
||||||
recvmsg,
|
recvmsg,
|
||||||
@ -108,8 +109,11 @@ pub fn ___syscall5(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
let flags: i32 = varargs.get(ctx);
|
let flags: i32 = varargs.get(ctx);
|
||||||
let mode: u32 = varargs.get(ctx);
|
let mode: u32 = varargs.get(ctx);
|
||||||
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
|
||||||
let _path_str = unsafe { std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap() };
|
let real_path = utils::get_cstr_path(ctx, pathname_addr)
|
||||||
let fd = unsafe { open(pathname_addr, flags, mode) };
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(pathname_addr);
|
||||||
|
let _path_str = unsafe { std::ffi::CStr::from_ptr(real_path).to_str().unwrap() };
|
||||||
|
let fd = unsafe { open(real_path, flags, mode) };
|
||||||
debug!(
|
debug!(
|
||||||
"=> pathname: {}, flags: {}, mode: {} = fd: {}\npath: {}\nlast os error: {}",
|
"=> pathname: {}, flags: {}, mode: {} = fd: {}\npath: {}\nlast os error: {}",
|
||||||
pathname,
|
pathname,
|
||||||
@ -160,11 +164,17 @@ pub fn ___syscall83(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
let path2_ptr: c_int = varargs.get(ctx);
|
let path2_ptr: c_int = varargs.get(ctx);
|
||||||
let path1 = emscripten_memory_pointer!(ctx.memory(0), path1_ptr) as *mut i8;
|
let path1 = emscripten_memory_pointer!(ctx.memory(0), path1_ptr) as *mut i8;
|
||||||
let path2 = emscripten_memory_pointer!(ctx.memory(0), path2_ptr) as *mut i8;
|
let path2 = emscripten_memory_pointer!(ctx.memory(0), path2_ptr) as *mut i8;
|
||||||
let result = unsafe { symlink(path1, path2) };
|
let real_path1 = utils::get_cstr_path(ctx, path1)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(path1);
|
||||||
|
let real_path2 = utils::get_cstr_path(ctx, path2)
|
||||||
|
.map(|cstr| cstr.as_c_str() as *const _ as *const i8)
|
||||||
|
.unwrap_or(path2);
|
||||||
|
let result = unsafe { symlink(real_path1, real_path2) };
|
||||||
debug!(
|
debug!(
|
||||||
"=> path1: {}, path2: {}, result: {}",
|
"=> path1: {}, path2: {}, result: {}",
|
||||||
unsafe { std::ffi::CStr::from_ptr(path1).to_str().unwrap() },
|
unsafe { std::ffi::CStr::from_ptr(real_path1).to_str().unwrap() },
|
||||||
unsafe { std::ffi::CStr::from_ptr(path2).to_str().unwrap() },
|
unsafe { std::ffi::CStr::from_ptr(real_path2).to_str().unwrap() },
|
||||||
result,
|
result,
|
||||||
);
|
);
|
||||||
result
|
result
|
||||||
@ -796,6 +806,81 @@ pub fn ___syscall196(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getdents
|
||||||
|
// dirent structure is
|
||||||
|
// i64, i64, u16 (280), i8, [i8; 256]
|
||||||
|
pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
||||||
|
debug!("emscripten::___syscall220");
|
||||||
|
let fd: i32 = varargs.get(ctx);
|
||||||
|
let dirp_addr: i32 = varargs.get(ctx);
|
||||||
|
let count: u32 = varargs.get(ctx);
|
||||||
|
|
||||||
|
//let dir = dbg!(emscripten_memory_pointer!(ctx.memory(0), dbg!(fd)) as *mut libc::DIR);
|
||||||
|
let dirp = emscripten_memory_pointer!(ctx.memory(0), dirp_addr) as *mut u8;
|
||||||
|
|
||||||
|
let mut pos = 0;
|
||||||
|
// need to persist stream across calls?
|
||||||
|
|
||||||
|
let dir: *mut libc::DIR = unsafe { libc::fdopendir(fd) };
|
||||||
|
|
||||||
|
dbg!("Start loop");
|
||||||
|
while pos + 280 <= dbg!(count) as usize {
|
||||||
|
dbg!("Pre readdir");
|
||||||
|
let dirent = unsafe { readdir(dir) };
|
||||||
|
dbg!("post readdir");
|
||||||
|
if dirent.is_null() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dbg!("dirent is not null");
|
||||||
|
unsafe {
|
||||||
|
*(dirp.add(pos) as *mut u64) = dbg!((*dirent).d_ino);
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
{
|
||||||
|
*(dirp.add(pos + 8) as *mut u64) = 280 //dbg!((*dirent).d_off);
|
||||||
|
}
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
*(dirp.add(pos + 8) as *mut u64) = if pos + 280 > count as usize {
|
||||||
|
count.into()
|
||||||
|
} else {
|
||||||
|
dbg!((*dirent).d_seekoff);
|
||||||
|
pos as u64 + 56 //280
|
||||||
|
}; //;
|
||||||
|
}
|
||||||
|
dbg!((*dirent).d_namlen);
|
||||||
|
*(dirp.add(pos + 16) as *mut u16) = 280; //dbg!((*dirent).d_reclen);
|
||||||
|
*(dirp.add(pos + 18) as *mut u8) = dbg!((*dirent).d_type);
|
||||||
|
let upper_bound = std::cmp::min((*dirent).d_reclen, 255) as usize;
|
||||||
|
let mut i = 0;
|
||||||
|
while i < upper_bound {
|
||||||
|
*(dirp.add(pos + 19 + i) as *mut i8) = (*dirent).d_name[i];
|
||||||
|
//dbg!((*dirent).d_name[i] as u8 as char);
|
||||||
|
//dbg!((*dirent).d_name[i] as u8 as char);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
*(dirp.add(pos + 19 + i) as *mut i8) = 0 as i8;
|
||||||
|
}
|
||||||
|
dbg!("dirent written to memory");
|
||||||
|
pos += 280;
|
||||||
|
/*unsafe {
|
||||||
|
eprintln!(
|
||||||
|
"{}",
|
||||||
|
std::ffi::CStr::from_bytes_with_nul_unchecked({
|
||||||
|
let arr = *(dirent as *const u8 as *const [u8; 256]);
|
||||||
|
&arr.to_vec()
|
||||||
|
.into_iter()
|
||||||
|
.map(|b| b as u8)
|
||||||
|
.collect::<Vec<u8>>()[..20]
|
||||||
|
})
|
||||||
|
.to_str()
|
||||||
|
.unwrap()
|
||||||
|
);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg!(pos as i32)
|
||||||
|
}
|
||||||
|
|
||||||
/// fallocate
|
/// fallocate
|
||||||
pub fn ___syscall324(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
pub fn ___syscall324(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||||
debug!("emscripten::___syscall324 (fallocate) {}", _which);
|
debug!("emscripten::___syscall324 (fallocate) {}", _which);
|
||||||
|
@ -251,6 +251,12 @@ pub fn ___syscall196(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
|||||||
-1
|
-1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getdents
|
||||||
|
pub fn ___syscall220(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||||
|
debug!("emscripten::___syscall220");
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
|
||||||
/// fchown
|
/// fchown
|
||||||
pub fn ___syscall207(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
|
pub fn ___syscall207(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
|
||||||
debug!("emscripten::___syscall207 (fchown) {}", _which);
|
debug!("emscripten::___syscall207 (fchown) {}", _which);
|
||||||
|
@ -5,6 +5,7 @@ use libc::stat;
|
|||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
use wasmer_runtime_core::memory::Memory;
|
use wasmer_runtime_core::memory::Memory;
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
@ -204,6 +205,37 @@ pub fn read_string_from_wasm(memory: &Memory, offset: u32) -> String {
|
|||||||
String::from_utf8_lossy(&v).to_owned().to_string()
|
String::from_utf8_lossy(&v).to_owned().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This function trys to find an entry in mapdir
|
||||||
|
/// translating paths into their correct value
|
||||||
|
pub fn get_cstr_path(ctx: &mut Ctx, path: *const i8) -> Option<std::ffi::CString> {
|
||||||
|
let path_str = unsafe { std::ffi::CStr::from_ptr(path).to_str().unwrap() }.to_string();
|
||||||
|
if let Some(val) = get_emscripten_data(ctx).mapped_dirs.get(&path_str) {
|
||||||
|
std::ffi::CString::new(val.to_string_lossy().as_bytes()).ok()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// gets the current directory
|
||||||
|
/// handles mapdir logic
|
||||||
|
pub fn get_current_directory(ctx: &mut Ctx) -> Option<PathBuf> {
|
||||||
|
if let Some(val) = get_emscripten_data(ctx).mapped_dirs.get(".") {
|
||||||
|
return Some(val.clone());
|
||||||
|
}
|
||||||
|
std::env::current_dir()
|
||||||
|
.map(|cwd| {
|
||||||
|
if let Some(val) = get_emscripten_data(ctx)
|
||||||
|
.mapped_dirs
|
||||||
|
.get(&cwd.to_string_lossy().to_string())
|
||||||
|
{
|
||||||
|
val.clone()
|
||||||
|
} else {
|
||||||
|
cwd
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.ok()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::is_emscripten_module;
|
use super::is_emscripten_module;
|
||||||
|
@ -458,6 +458,7 @@ fn execute_wasm(options: &Run) -> Result<(), String> {
|
|||||||
},
|
},
|
||||||
options.args.iter().map(|arg| arg.as_str()).collect(),
|
options.args.iter().map(|arg| arg.as_str()).collect(),
|
||||||
options.em_entrypoint.clone(),
|
options.em_entrypoint.clone(),
|
||||||
|
mapped_dirs,
|
||||||
)
|
)
|
||||||
.map_err(|e| format!("{:?}", e))?;
|
.map_err(|e| format!("{:?}", e))?;
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user