mirror of
https://github.com/fluencelabs/wasmer
synced 2024-12-12 22:05:33 +00:00
Generic IOCTLs mapping
This commit is contained in:
parent
5a0dc0374c
commit
5cab816193
@ -8,6 +8,7 @@ use libc::{
|
|||||||
access,
|
access,
|
||||||
bind,
|
bind,
|
||||||
c_int,
|
c_int,
|
||||||
|
c_ulong,
|
||||||
c_void,
|
c_void,
|
||||||
chown,
|
chown,
|
||||||
// fcntl, setsockopt, getppid
|
// fcntl, setsockopt, getppid
|
||||||
@ -77,6 +78,23 @@ use libc::{
|
|||||||
TIOCSPGRP,
|
TIOCSPGRP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// `libc` constants as provided by `emscripten`. Maybe move to own file?
|
||||||
|
const WASM_FIOCLEX: u32 = 0x5451;
|
||||||
|
const WASM_TIOCSPGRP: u32 = 0x5410;
|
||||||
|
const WASM_TIOCGWINSZ: u32 = 0x5413;
|
||||||
|
|
||||||
|
// 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,
|
||||||
|
|
||||||
|
otherwise => otherwise as c_ulong,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use wasmer_runtime_core::{memory::ptr::WasmPtr, vm::Ctx};
|
use wasmer_runtime_core::{memory::ptr::WasmPtr, vm::Ctx};
|
||||||
@ -428,13 +446,13 @@ pub fn ___syscall54(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
// Got the equivalents here: https://code.woboq.org/linux/linux/include/uapi/asm-generic/ioctls.h.html
|
// 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: u32 = varargs.get(ctx);
|
||||||
let argp_ptr = emscripten_memory_pointer!(ctx.memory(0), argp) as *mut c_void;
|
let argp_ptr = emscripten_memory_pointer!(ctx.memory(0), argp) as *mut c_void;
|
||||||
// let ret = unsafe { ioctl(fd, request as _, argp_ptr) };
|
// let ret = unsafe { ioctl(fd, translate_ioctl(request) as _, argp_ptr) };
|
||||||
// debug!("=> {}", ret);
|
// debug!("=> {}", ret);
|
||||||
// ret
|
// ret
|
||||||
|
|
||||||
match request as _ {
|
match request as _ {
|
||||||
TIOCGWINSZ => {
|
TIOCGWINSZ => {
|
||||||
let ret = unsafe { ioctl(fd, request as _, argp_ptr) };
|
let ret = unsafe { ioctl(fd, translate_ioctl(request) as _, argp_ptr) };
|
||||||
debug!("ret(TIOCGWINSZ): {} (harcoded to 0)", ret);
|
debug!("ret(TIOCGWINSZ): {} (harcoded to 0)", ret);
|
||||||
// ret
|
// ret
|
||||||
// TODO: We hardcode the value to have emscripten tests pass, as for some reason
|
// TODO: We hardcode the value to have emscripten tests pass, as for some reason
|
||||||
@ -450,7 +468,7 @@ pub fn ___syscall54(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let ret = unsafe { ioctl(fd, request as _, argp_ptr) };
|
let ret = unsafe { ioctl(fd, translate_ioctl(request) as _, argp_ptr) };
|
||||||
debug!("ret({}): {}", request, ret);
|
debug!("ret({}): {}", request, ret);
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
@ -495,7 +513,7 @@ pub fn ___syscall102(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
|||||||
if ty_and_flags & SOCK_CLOEXC != 0 {
|
if ty_and_flags & SOCK_CLOEXC != 0 {
|
||||||
// set_cloexec
|
// set_cloexec
|
||||||
unsafe {
|
unsafe {
|
||||||
ioctl(fd, FIOCLEX);
|
ioctl(fd, translate_ioctl(WASM_FIOCLEX));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,7 +620,7 @@ pub fn ___syscall102(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
|
|||||||
// why is this here?
|
// why is this here?
|
||||||
// set_cloexec
|
// set_cloexec
|
||||||
unsafe {
|
unsafe {
|
||||||
ioctl(fd, FIOCLEX);
|
ioctl(fd, translate_ioctl(WASM_FIOCLEX));
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
|
Loading…
Reference in New Issue
Block a user