mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-21 04:31:33 +00:00
Squashed commit of the following:
commit 62d9da4e3e02251a0f61c904e826bc06cf964ff7 Author: Syrus <me@syrusakbary.com> Date: Sun Jul 7 18:16:34 2019 -0700 Fixed syscall221 commit a8fde9148d50d89616d8a85a68110b89e3273229 Author: Syrus <me@syrusakbary.com> Date: Sun Jul 7 18:16:04 2019 -0700 Improved ioctl use case commit 5ad109d39838624ad84232a4c17714b885835893 Merge:61526e2c
5cab8161
Author: Syrus <me@syrusakbary.com> Date: Sun Jul 7 17:44:25 2019 -0700 Merge branch 'command/dash' into feature/emscripten-update commit5cab816193
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 20:11:49 2019 +0200 Generic IOCTLs mapping commit5a0dc0374c
Merge:61cfed79
9d120ed3
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 17:15:02 2019 +0200 Merge remote-tracking branch 'origin/master' into command/dash commit61cfed7916
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 13:04:04 2019 +0200 Fixed implementation for syscalls 200, 201 and 202 commit91e26d1a0e
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 13:03:26 2019 +0200 Improved debug messages commit53a8fbeb2a
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 13:03:04 2019 +0200 [___syscall146] Move loop out of `unsafe` zone commitd6dd3696f1
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 13:01:31 2019 +0200 [___syscall140] Fixed types commitc827a6a993
Merge:2bc16826
5e18d04d
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Sat Jul 6 12:21:33 2019 +0200 Merge remote-tracking branch 'origin/master' into command/dash commit2bc16826b5
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Thu Jul 4 07:05:00 2019 +0200 Implement `getpgid` syscall commitd464954f58
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Thu Jul 4 07:04:36 2019 +0200 [fcntl64] Replace mock for real implementation commit3fe0183d85
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Thu Jul 4 07:03:39 2019 +0200 [ioctl] No-of for `TIOCSPGRP` command & code clean-up commitcc83ec9ac1
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Thu Jul 4 07:02:47 2019 +0200 [___syscall5] debug messages commit91587c8bde
Author: Jesús Leganés-Combarro 'piranna <piranna@gmail.com> Date: Thu Jul 4 07:02:20 2019 +0200 [___syscall57] debug messages
This commit is contained in:
@ -17,21 +17,22 @@ use byteorder::{ByteOrder, LittleEndian};
|
||||
/// NOTE: TODO: These syscalls only support wasm_32 for now because they assume offsets are u32
|
||||
/// Syscall list: https://www.cs.utexas.edu/~bismith/test/syscalls/syscalls32.html
|
||||
use libc::{
|
||||
// ENOTTY,
|
||||
c_int,
|
||||
c_void,
|
||||
chdir,
|
||||
// fcntl, setsockopt, getppid
|
||||
// setsockopt, getppid
|
||||
close,
|
||||
dup2,
|
||||
exit,
|
||||
fcntl,
|
||||
fstat,
|
||||
getpgid,
|
||||
getpid,
|
||||
// readlink,
|
||||
// iovec,
|
||||
lseek,
|
||||
off_t,
|
||||
// open,
|
||||
pid_t,
|
||||
read,
|
||||
rename,
|
||||
// sockaddr_in,
|
||||
@ -40,6 +41,7 @@ use libc::{
|
||||
// writev,
|
||||
stat,
|
||||
write,
|
||||
// ENOTTY,
|
||||
};
|
||||
use wasmer_runtime_core::{
|
||||
memory::ptr::{Array, WasmPtr},
|
||||
@ -227,6 +229,9 @@ pub fn ___syscall42(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
||||
let result: c_int = unsafe { libc::pipe(fd_ptr, 2048, 0) };
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
let result: c_int = unsafe { libc::pipe(fd_ptr) };
|
||||
if result == -1 {
|
||||
debug!("=> os error: {}", Error::last_os_error());
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
@ -306,9 +311,17 @@ pub fn ___syscall125(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
-1
|
||||
}
|
||||
|
||||
pub fn ___syscall132(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
debug!("emscripten::___syscall132");
|
||||
-1
|
||||
pub fn ___syscall132(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||
debug!("emscripten::___syscall132 (getpgid)");
|
||||
|
||||
let pid: pid_t = varargs.get(ctx);
|
||||
|
||||
let ret = unsafe { getpgid(pid) };
|
||||
debug!("=> pid: {} = {}", pid, ret);
|
||||
if ret == -1 {
|
||||
debug!("=> last os error: {}", Error::last_os_error(),);
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn ___syscall133(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
@ -408,11 +421,11 @@ pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
||||
// -> c_int
|
||||
debug!("emscripten::___syscall140 (lseek) {}", _which);
|
||||
let fd: i32 = varargs.get(ctx);
|
||||
let _offset_high: i32 = varargs.get(ctx); // We don't use the offset high as emscripten skips it
|
||||
let offset_low: i32 = varargs.get(ctx);
|
||||
let _offset_high: u32 = varargs.get(ctx); // We don't use the offset high as emscripten skips it
|
||||
let offset_low: u32 = varargs.get(ctx);
|
||||
let result_ptr_value: WasmPtr<i64> = varargs.get(ctx);
|
||||
let whence: i32 = varargs.get(ctx);
|
||||
let offset = offset_low as off_t;
|
||||
let offset = offset_low as i64;
|
||||
let ret = unsafe { lseek(fd, offset, whence) as i64 };
|
||||
|
||||
let result_ptr = result_ptr_value.deref(ctx.memory(0)).unwrap();
|
||||
@ -484,8 +497,8 @@ pub fn ___syscall146(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
||||
|
||||
debug!("=> fd: {}, iov: {}, iovcnt = {}", fd, iov, iovcnt);
|
||||
let mut ret = 0;
|
||||
unsafe {
|
||||
for i in 0..iovcnt {
|
||||
for i in 0..iovcnt {
|
||||
unsafe {
|
||||
let guest_iov_addr =
|
||||
emscripten_memory_pointer!(ctx.memory(0), (iov + i * 8)) as *mut GuestIovec;
|
||||
let iov_base = emscripten_memory_pointer!(ctx.memory(0), (*guest_iov_addr).iov_base)
|
||||
@ -493,14 +506,21 @@ pub fn ___syscall146(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
||||
let iov_len = (*guest_iov_addr).iov_len as _;
|
||||
// debug!("=> iov_addr: {:?}, {:?}", iov_base, iov_len);
|
||||
let curr = write(fd, iov_base, iov_len);
|
||||
debug!(
|
||||
"=> iov_base: {}, iov_len: {}, curr = {}",
|
||||
(*guest_iov_addr).iov_base,
|
||||
iov_len,
|
||||
curr
|
||||
);
|
||||
if curr < 0 {
|
||||
debug!("=> os error: {}", Error::last_os_error());
|
||||
return -1;
|
||||
}
|
||||
ret += curr;
|
||||
}
|
||||
// debug!(" => ret: {}", ret);
|
||||
ret as _
|
||||
}
|
||||
debug!(" => ret: {}", ret);
|
||||
ret as _
|
||||
}
|
||||
|
||||
pub fn ___syscall191(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
|
||||
@ -542,13 +562,13 @@ pub fn ___syscall195(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
||||
let mut _stat: stat = std::mem::zeroed();
|
||||
let ret = stat(real_path, &mut _stat);
|
||||
debug!(
|
||||
"=> pathname: {}, buf: {} = {}, last os error: {}",
|
||||
"=> pathname: {}, buf: {} = {}",
|
||||
std::ffi::CStr::from_ptr(real_path).to_str().unwrap(),
|
||||
buf,
|
||||
ret,
|
||||
Error::last_os_error()
|
||||
ret
|
||||
);
|
||||
if ret != 0 {
|
||||
debug!("=> os error: {}", Error::last_os_error());
|
||||
return ret;
|
||||
}
|
||||
copy_stat_into_wasm(ctx, buf, &_stat);
|
||||
@ -559,19 +579,20 @@ pub fn ___syscall195(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
||||
// fstat64
|
||||
pub fn ___syscall197(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||
debug!("emscripten::___syscall197 (fstat64) {}", _which);
|
||||
|
||||
let fd: c_int = varargs.get(ctx);
|
||||
let buf: u32 = varargs.get(ctx);
|
||||
|
||||
unsafe {
|
||||
let mut stat = std::mem::zeroed();
|
||||
let ret = fstat(fd, &mut stat);
|
||||
debug!("ret: {}", ret);
|
||||
debug!("=> fd: {}, buf: {} = {}", fd, buf, ret);
|
||||
if ret != 0 {
|
||||
debug!("=> os error: {}", Error::last_os_error());
|
||||
return ret;
|
||||
}
|
||||
copy_stat_into_wasm(ctx, buf, &stat);
|
||||
}
|
||||
|
||||
0
|
||||
}
|
||||
|
||||
@ -594,18 +615,19 @@ pub fn ___syscall218(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
pub fn ___syscall221(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||
debug!("emscripten::___syscall221 (fcntl64) {}", _which);
|
||||
// fcntl64
|
||||
let _fd: i32 = varargs.get(ctx);
|
||||
let cmd: u32 = varargs.get(ctx);
|
||||
let fd: i32 = varargs.get(ctx);
|
||||
let cmd: i32 = varargs.get(ctx);
|
||||
let arg: i32 = varargs.get(ctx);
|
||||
// (FAPPEND - 0x08
|
||||
// |FASYNC - 0x40
|
||||
// |FFSYNC - 0x80
|
||||
// |FNONBLOCK - 0x04
|
||||
debug!("=> fd: {}, cmd: {}", _fd, cmd);
|
||||
match cmd {
|
||||
1 | 2 => 0,
|
||||
13 | 14 => 0, // pretend file locking worked
|
||||
_ => -1,
|
||||
let ret = unsafe { fcntl(fd, cmd, arg) };
|
||||
debug!("=> fd: {}, cmd: {} = {}", fd, cmd, ret);
|
||||
if ret == -1 {
|
||||
debug!("=> last os error: {}", Error::last_os_error(),);
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn ___syscall268(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
|
@ -8,6 +8,7 @@ use libc::{
|
||||
access,
|
||||
bind,
|
||||
c_int,
|
||||
c_ulong,
|
||||
c_void,
|
||||
chown,
|
||||
// fcntl, setsockopt, getppid
|
||||
@ -19,6 +20,8 @@ use libc::{
|
||||
fcntl,
|
||||
// ENOTTY,
|
||||
fsync,
|
||||
getegid,
|
||||
geteuid,
|
||||
getgid,
|
||||
getgroups,
|
||||
getpeername,
|
||||
@ -72,8 +75,38 @@ use libc::{
|
||||
F_SETFD,
|
||||
SOL_SOCKET,
|
||||
TIOCGWINSZ,
|
||||
TIOCSPGRP,
|
||||
// TCGETS,
|
||||
// TCSETSW,
|
||||
};
|
||||
|
||||
const TCGETS: u64 = 0x5401;
|
||||
const TCSETSW: u64 = 0x5403;
|
||||
|
||||
// `libc` constants as provided by `emscripten`. Maybe move to own file?
|
||||
const WASM_FIONBIO: u32 = 0x5421;
|
||||
const WASM_FIOCLEX: u32 = 0x5451;
|
||||
const WASM_TIOCSPGRP: u32 = 0x5410;
|
||||
const WASM_TIOCGWINSZ: u32 = 0x5413;
|
||||
const WASM_TCGETS: u32 = 0x5401;
|
||||
const WASM_TCSETSW: u32 = 0x5403;
|
||||
|
||||
// Based on @syrusakbary sugerence at
|
||||
// https://github.com/wasmerio/wasmer/pull/532#discussion_r300837800
|
||||
fn translate_ioctl(wasm_ioctl: u32) -> c_ulong {
|
||||
match wasm_ioctl {
|
||||
WASM_FIOCLEX => FIOCLEX,
|
||||
WASM_TIOCGWINSZ => TIOCGWINSZ,
|
||||
WASM_TIOCSPGRP => TIOCSPGRP,
|
||||
WASM_FIONBIO => FIONBIO,
|
||||
WASM_TCGETS => TCGETS,
|
||||
WASM_TCSETSW => TCSETSW,
|
||||
_otherwise => {
|
||||
unimplemented!("The ioctl {} is not yet implemented", wasm_ioctl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused_imports)]
|
||||
use std::ffi::CStr;
|
||||
use wasmer_runtime_core::{memory::ptr::WasmPtr, vm::Ctx};
|
||||
@ -120,13 +153,12 @@ pub fn ___syscall5(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
||||
let _path_str = unsafe { std::ffi::CStr::from_ptr(real_path).to_str().unwrap() };
|
||||
let fd = unsafe { open(real_path, flags, mode) };
|
||||
debug!(
|
||||
"=> path: {}, flags: {}, mode: {} = fd: {}, last os error: {}",
|
||||
_path_str,
|
||||
flags,
|
||||
mode,
|
||||
fd,
|
||||
Error::last_os_error(),
|
||||
"=> path: {}, flags: {}, mode: {} = fd: {}",
|
||||
_path_str, flags, mode, fd,
|
||||
);
|
||||
if fd == -1 {
|
||||
debug!("=> last os error: {}", Error::last_os_error(),);
|
||||
}
|
||||
fd
|
||||
}
|
||||
|
||||
@ -347,28 +379,28 @@ pub fn ___syscall41(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
||||
unsafe { dup(fd) }
|
||||
}
|
||||
|
||||
/// getgid
|
||||
/// getgid32
|
||||
pub fn ___syscall200(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
debug!("emscripten::___syscall200 (getgid)");
|
||||
debug!("emscripten::___syscall200 (getgid32)");
|
||||
unsafe { getgid() as i32 }
|
||||
}
|
||||
|
||||
// getgid
|
||||
// geteuid32
|
||||
pub fn ___syscall201(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
debug!("emscripten::___syscall201 (getgid)");
|
||||
debug!("emscripten::___syscall201 (geteuid32)");
|
||||
unsafe {
|
||||
// Maybe fix: Emscripten returns 0 always
|
||||
getgid() as i32
|
||||
geteuid() as i32
|
||||
}
|
||||
}
|
||||
|
||||
// getgid32
|
||||
// getegid32
|
||||
pub fn ___syscall202(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
// gid_t
|
||||
debug!("emscripten::___syscall202 (getgid32)");
|
||||
debug!("emscripten::___syscall202 (getegid32)");
|
||||
unsafe {
|
||||
// Maybe fix: Emscripten returns 0 always
|
||||
getgid() as _
|
||||
getegid() as _
|
||||
}
|
||||
}
|
||||
|
||||
@ -418,45 +450,29 @@ pub fn ___syscall330(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> pid_
|
||||
/// ioctl
|
||||
pub fn ___syscall54(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||
debug!("emscripten::___syscall54 (ioctl) {}", _which);
|
||||
|
||||
let fd: i32 = varargs.get(ctx);
|
||||
let request: u32 = varargs.get(ctx);
|
||||
debug!("=> fd: {}, op: {}", fd, request);
|
||||
|
||||
// Got the equivalents here: https://code.woboq.org/linux/linux/include/uapi/asm-generic/ioctls.h.html
|
||||
// let argp: u32 = varargs.get(ctx);
|
||||
// let argp_ptr = emscripten_memory_pointer!(ctx.memory(0), argp) as *mut c_void;
|
||||
// let ret = unsafe { ioctl(fd, request as _, argp_ptr) };
|
||||
// debug!("=> {}", ret);
|
||||
// ret
|
||||
match request as _ {
|
||||
21537 => {
|
||||
// FIONBIO
|
||||
match request {
|
||||
WASM_FIOCLEX | WASM_FIONBIO | WASM_TIOCGWINSZ | WASM_TIOCSPGRP | WASM_TCGETS | WASM_TCSETSW => {
|
||||
let argp: u32 = varargs.get(ctx);
|
||||
let argp_ptr = emscripten_memory_pointer!(ctx.memory(0), argp) as *mut c_void;
|
||||
let ret = unsafe { ioctl(fd, FIONBIO, argp_ptr) };
|
||||
debug!("ret(FIONBIO): {}", ret);
|
||||
ret
|
||||
// 0
|
||||
}
|
||||
21523 => {
|
||||
// TIOCGWINSZ
|
||||
let argp: u32 = varargs.get(ctx);
|
||||
let argp_ptr = emscripten_memory_pointer!(ctx.memory(0), argp) as *mut c_void;
|
||||
let ret = unsafe { ioctl(fd, TIOCGWINSZ, argp_ptr) };
|
||||
debug!("ret(TIOCGWINSZ): {} (harcoded to 0)", ret);
|
||||
// ret
|
||||
let translated_request = translate_ioctl(request);
|
||||
let ret = unsafe { ioctl(fd, translated_request, argp_ptr) };
|
||||
debug!(" => request: {}, translated: {}, return: {}", request, translated_request, ret);
|
||||
|
||||
// TODO: We hardcode the value to have emscripten tests pass, as for some reason
|
||||
// when the capturer is active, ioctl returns -1 instead of 0
|
||||
if ret == -1 {
|
||||
0
|
||||
} else {
|
||||
ret
|
||||
if request == WASM_TIOCGWINSZ && ret == -1 {
|
||||
return 0
|
||||
}
|
||||
ret
|
||||
}
|
||||
_ => {
|
||||
debug!(
|
||||
"emscripten::___syscall54 -> non implemented case {}",
|
||||
request
|
||||
);
|
||||
debug!(" => not implemented case {} (noop, hardcoded to 0)", request);
|
||||
0
|
||||
}
|
||||
}
|
||||
@ -500,7 +516,7 @@ pub fn ___syscall102(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
||||
if ty_and_flags & SOCK_CLOEXC != 0 {
|
||||
// set_cloexec
|
||||
unsafe {
|
||||
ioctl(fd, FIOCLEX);
|
||||
ioctl(fd, translate_ioctl(WASM_FIOCLEX));
|
||||
};
|
||||
}
|
||||
|
||||
@ -607,7 +623,7 @@ pub fn ___syscall102(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
||||
// why is this here?
|
||||
// set_cloexec
|
||||
unsafe {
|
||||
ioctl(fd, FIOCLEX);
|
||||
ioctl(fd, translate_ioctl(WASM_FIOCLEX));
|
||||
};
|
||||
|
||||
debug!(
|
||||
@ -918,9 +934,16 @@ pub fn ___syscall148(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
||||
// setpgid
|
||||
pub fn ___syscall57(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
|
||||
debug!("emscripten::___syscall57 (setpgid) {}", _which);
|
||||
|
||||
let pid: i32 = varargs.get(ctx);
|
||||
let pgid: i32 = varargs.get(ctx);
|
||||
unsafe { setpgid(pid, pgid) }
|
||||
|
||||
let ret = unsafe { setpgid(pid, pgid) };
|
||||
debug!("=> pid: {}, pgid: {} = {}", pid, pgid, ret);
|
||||
if ret == -1 {
|
||||
debug!("=> last os error: {}", Error::last_os_error(),);
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
/// uname
|
||||
|
@ -140,23 +140,26 @@ pub fn ___syscall198(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
/// getgid
|
||||
/// getgid32
|
||||
pub fn ___syscall200(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
debug!("emscripten::___syscall200 (getgid)");
|
||||
unimplemented!()
|
||||
debug!("emscripten::___syscall200 (getgid32)");
|
||||
|
||||
getgid()
|
||||
}
|
||||
|
||||
// getgid
|
||||
// geteuid32
|
||||
pub fn ___syscall201(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
debug!("emscripten::___syscall201 (getgid)");
|
||||
-1
|
||||
debug!("emscripten::___syscall201 (geteuid32)");
|
||||
|
||||
geteuid()
|
||||
}
|
||||
|
||||
// getgid32
|
||||
// getegid32
|
||||
pub fn ___syscall202(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
|
||||
// gid_t
|
||||
debug!("emscripten::___syscall202 (getgid32)");
|
||||
-1
|
||||
debug!("emscripten::___syscall202 (getegid32)");
|
||||
|
||||
getegid()
|
||||
}
|
||||
|
||||
/// getgroups
|
||||
|
Reference in New Issue
Block a user