Fix all the imports to run nginx

This commit is contained in:
Brandon Fish
2019-01-24 23:58:54 -06:00
parent 25439b4df3
commit 5209b5a558
6 changed files with 695 additions and 48 deletions

View File

@ -11,6 +11,11 @@ use super::utils::{allocate_on_stack, copy_cstr_into_wasm, copy_terminated_array
use super::EmscriptenData;
use wasmer_runtime_core::vm::Ctx;
pub extern "C" fn _getaddrinfo(one: i32, two: i32, three: i32, four: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_getaddrinfo");
-1
}
// #[no_mangle]
/// emscripten: _getenv // (name: *const char) -> *const c_char;
pub extern "C" fn _getenv(name: c_int, ctx: &mut Ctx) -> u32 {

View File

@ -338,6 +338,7 @@ macro_rules! global {
}
pub struct EmscriptenGlobalsData {
abort: u64,
// Env namespace
stacktop: u64,
stack_max: u64,
@ -385,6 +386,7 @@ impl EmscriptenGlobals {
let table_base = 0 as u64;
let temp_double_ptr = 0 as u64;
let data = EmscriptenGlobalsData {
abort: 0, // TODO review usage
// env
stacktop: stacktop(STATIC_BUMP) as _,
stack_max: stack_max(STATIC_BUMP) as _,
@ -448,8 +450,8 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
ctx: null_ctx,
table: Table {
ty: ElementType::Anyfunc,
min: 10,
max: Some(10),
min: 8192,
max: Some(8192),
},
},
);
@ -509,6 +511,17 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
},
);
env_namespace.insert(
"ABORT".to_string(),
Export::Global {
local: global!(globals.data.abort),
global: GlobalDesc {
mutable: false,
ty: I32,
},
},
);
env_namespace.insert(
"memoryBase".to_string(),
Export::Global {
@ -826,7 +839,19 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
func: func!(syscalls, ___syscall20),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall220",
Export::Function {
func: func!(syscalls, ___syscall220),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
@ -856,6 +881,18 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
},
);
env_namespace.insert(
"___syscall10",
Export::Function {
func: func!(syscalls, ___syscall10),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall54",
Export::Function {
@ -892,13 +929,25 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
},
);
env_namespace.insert(
"___syscall85",
Export::Function {
func: func!(syscalls, ___syscall85),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall64",
Export::Function {
func: func!(syscalls, ___syscall64),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
params: vec![I32, I32],
returns: vec![I32],
},
},
@ -1054,7 +1103,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
func: func!(syscalls, ___syscall201),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
params: vec![I32, I32],
returns: vec![I32],
},
},
@ -1246,7 +1295,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
func: func!(signal, _sigprocmask),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
@ -1746,71 +1795,479 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
},
);
mock_external!(env_namespace, _waitpid);
mock_external!(env_namespace, _utimes);
mock_external!(env_namespace, _usleep);
env_namespace.insert(
"___syscall110",
Export::Function {
func: func!(syscalls, ___syscall110),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall15",
Export::Function {
func: func!(syscalls, ___syscall15),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall168",
Export::Function {
func: func!(syscalls, ___syscall168),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall191",
Export::Function {
func: func!(syscalls, ___syscall191),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall194",
Export::Function {
func: func!(syscalls, ___syscall194),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall196",
Export::Function {
func: func!(syscalls, ___syscall196),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall199",
Export::Function {
func: func!(syscalls, ___syscall199),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall268",
Export::Function {
func: func!(syscalls, ___syscall268),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall272",
Export::Function {
func: func!(syscalls, ___syscall272),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall295",
Export::Function {
func: func!(syscalls, ___syscall295),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall300",
Export::Function {
func: func!(syscalls, ___syscall300),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall334",
Export::Function {
func: func!(syscalls, ___syscall334),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall38",
Export::Function {
func: func!(syscalls, ___syscall38),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall60",
Export::Function {
func: func!(syscalls, ___syscall60),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall66",
Export::Function {
func: func!(syscalls, ___syscall66),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall75",
Export::Function {
func: func!(syscalls, ___syscall75),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall91",
Export::Function {
func: func!(syscalls, ___syscall91),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"___syscall97",
Export::Function {
func: func!(syscalls, ___syscall97),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_endgrent",
Export::Function {
func: func!(process, _endgrent),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
returns: vec![],
},
},
);
env_namespace.insert(
"_execve",
Export::Function {
func: func!(process, _execve),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_getaddrinfo",
Export::Function {
func: func!(env, _getaddrinfo),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_gmtime_r",
Export::Function {
func: func!(time, _gmtime_r),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_kill",
Export::Function {
func: func!(process, _kill),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_llvm_stackrestore",
Export::Function {
func: func!(process, _llvm_stackrestore),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![],
},
},
);
env_namespace.insert(
"_mktime",
Export::Function {
func: func!(time, _mktime),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_raise",
Export::Function {
func: func!(process, _raise),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_sem_init",
Export::Function {
func: func!(process, _sem_init),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_sem_post",
Export::Function {
func: func!(process, _sem_post),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_sem_wait",
Export::Function {
func: func!(process, _sem_wait),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_setgrent",
Export::Function {
func: func!(process, _setgrent),
ctx: Context::Internal,
signature: FuncSig {
params: vec![],
returns: vec![],
},
},
);
env_namespace.insert(
"_setgroups",
Export::Function {
func: func!(process, _setgroups),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_setitimer",
Export::Function {
func: func!(process, _setitimer),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
);
//
env_namespace.insert(
"_sigsuspend",
Export::Function {
func: func!(signal, _sigsuspend),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_setitimer",
Export::Function {
func: func!(process, _setitimer),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_usleep",
Export::Function {
func: func!(process, _usleep),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_utimes",
Export::Function {
func: func!(process, _utimes),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32],
returns: vec![I32],
},
},
);
env_namespace.insert(
"_waitpid",
Export::Function {
func: func!(process, _waitpid),
ctx: Context::Internal,
signature: FuncSig {
params: vec![I32, I32, I32],
returns: vec![I32],
},
},
);
// mock_external!(env_namespace, _time);
// mock_external!(env_namespace, _sysconf);
// mock_external!(env_namespace, _strftime);
mock_external!(env_namespace, _sigsuspend);
// mock_external!(env_namespace, _sigprocmask);
// mock_external!(env_namespace, _sigemptyset);
// mock_external!(env_namespace, _sigaddset);
// mock_external!(env_namespace, _sigaction);
mock_external!(env_namespace, _setitimer);
mock_external!(env_namespace, _setgroups);
mock_external!(env_namespace, _setgrent);
mock_external!(env_namespace, _sem_wait);
mock_external!(env_namespace, _sem_post);
mock_external!(env_namespace, _sem_init);
mock_external!(env_namespace, _sched_yield);
mock_external!(env_namespace, _raise);
mock_external!(env_namespace, _mktime);
// mock_external!(env_namespace, _localtime_r);
// mock_external!(env_namespace, _localtime);
mock_external!(env_namespace, _llvm_stacksave);
mock_external!(env_namespace, _llvm_stackrestore);
mock_external!(env_namespace, _kill);
mock_external!(env_namespace, _gmtime_r);
// mock_external!(env_namespace, _gettimeofday);
// mock_external!(env_namespace, _getpagesize);
mock_external!(env_namespace, _getgrent);
mock_external!(env_namespace, _getaddrinfo);
// mock_external!(env_namespace, _fork);
// mock_external!(env_namespace, _exit);
mock_external!(env_namespace, _execve);
mock_external!(env_namespace, _endgrent);
// mock_external!(env_namespace, _clock_gettime);
mock_external!(env_namespace, ___syscall97);
mock_external!(env_namespace, ___syscall91);
mock_external!(env_namespace, ___syscall85);
mock_external!(env_namespace, ___syscall75);
mock_external!(env_namespace, ___syscall66);
// mock_external!(env_namespace, ___syscall64);
// mock_external!(env_namespace, ___syscall63);
// mock_external!(env_namespace, ___syscall60);
// mock_external!(env_namespace, ___syscall54);
// mock_external!(env_namespace, ___syscall39);
mock_external!(env_namespace, ___syscall38);
// mock_external!(env_namespace, ___syscall340);
mock_external!(env_namespace, ___syscall334);
mock_external!(env_namespace, ___syscall300);
mock_external!(env_namespace, ___syscall295);
mock_external!(env_namespace, ___syscall272);
mock_external!(env_namespace, ___syscall268);
// mock_external!(env_namespace, ___syscall221);
mock_external!(env_namespace, ___syscall220);
// mock_external!(env_namespace, ___syscall212);
// mock_external!(env_namespace, ___syscall201);
mock_external!(env_namespace, ___syscall199);
// mock_external!(env_namespace, ___syscall197);
mock_external!(env_namespace, ___syscall196);
// mock_external!(env_namespace, ___syscall195);
mock_external!(env_namespace, ___syscall194);
mock_external!(env_namespace, ___syscall191);
// mock_external!(env_namespace, ___syscall181);
// mock_external!(env_namespace, ___syscall180);
mock_external!(env_namespace, ___syscall168);
// mock_external!(env_namespace, ___syscall146);
// mock_external!(env_namespace, ___syscall145);
// mock_external!(env_namespace, ___syscall142);
@ -1818,8 +2275,6 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
// mock_external!(env_namespace, ___syscall122);
// mock_external!(env_namespace, ___syscall102);
// mock_external!(env_namespace, ___syscall20);
mock_external!(env_namespace, ___syscall15);
mock_external!(env_namespace, ___syscall10);
mock_external!(env_namespace, _dlopen);
mock_external!(env_namespace, _dlclose);
mock_external!(env_namespace, _dlsym);

View File

@ -24,6 +24,15 @@ pub extern "C" fn _fork(_ctx: &mut Ctx) -> pid_t {
-1
}
pub extern "C" fn _endgrent(_ctx: &mut Ctx) {
debug!("emscripten::_endgrent");
}
pub extern "C" fn _execve(one: i32, two: i32, three: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_execve");
-1
}
pub extern "C" fn _exit(status: c_int, _ctx: &mut Ctx) -> ! {
debug!("emscripten::_exit {}", status);
unsafe { exit(status) }
@ -41,6 +50,64 @@ pub extern "C" fn em_abort(message: u32, ctx: &mut Ctx) {
}
}
pub extern "C" fn _kill(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_kill");
-1
}
pub extern "C" fn _llvm_stackrestore(one: i32, ctx: &mut Ctx) {
debug!("emscripten::_llvm_stackrestore");
}
pub extern "C" fn _raise(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_raise");
-1
}
pub extern "C" fn _sem_init(one: i32, two: i32, three: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_sem_init");
-1
}
pub extern "C" fn _sem_post(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_sem_post");
-1
}
pub extern "C" fn _sem_wait(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_sem_post");
-1
}
pub extern "C" fn _setgrent(ctx: &mut Ctx) {
debug!("emscripten::_setgrent");
}
pub extern "C" fn _setgroups(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_setgroups");
-1
}
pub extern "C" fn _setitimer(one: i32, two: i32, three: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_setitimer");
-1
}
pub extern "C" fn _usleep(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_usleep");
-1
}
pub extern "C" fn _utimes(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_utimes");
-1
}
pub extern "C" fn _waitpid(one: i32, two: i32, three: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_waitpid");
-1
}
pub extern "C" fn abort_stack_overflow(_what: c_int, _ctx: &mut Ctx) {
debug!("emscripten::abort_stack_overflow");
// TODO: Message incomplete. Need to finish em runtime data first

View File

@ -26,7 +26,12 @@ pub extern "C" fn _sigaddset(set: u32, signum: u32, ctx: &mut Ctx) -> i32 {
0
}
pub extern "C" fn _sigprocmask() -> i32 {
pub extern "C" fn _sigsuspend(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_sigsuspend");
-1
}
pub extern "C" fn _sigprocmask(one: i32, two: i32, three: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_sigprocmask");
0
}

View File

@ -165,12 +165,27 @@ pub extern "C" fn ___syscall12(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx
}
}
pub extern "C" fn ___syscall10(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall10");
-1
}
pub extern "C" fn ___syscall15(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall15");
-1
}
// getpid
pub extern "C" fn ___syscall20() -> pid_t {
pub extern "C" fn ___syscall20(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall20 (getpid)");
unsafe { getpid() }
}
pub extern "C" fn ___syscall38(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall38");
-1
}
// mkdir
pub extern "C" fn ___syscall39(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
debug!("emscripten::___syscall39 (mkdir) {}", which);
@ -238,6 +253,11 @@ pub extern "C" fn ___syscall57(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx
unsafe { setpgid(pid, pgid) }
}
pub extern "C" fn ___syscall60(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall60");
-1
}
// dup2
pub extern "C" fn ___syscall63(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
debug!("emscripten::___syscall63 (dup2) {}", which);
@ -249,11 +269,36 @@ pub extern "C" fn ___syscall63(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx
}
// getppid
pub extern "C" fn ___syscall64() -> pid_t {
pub extern "C" fn ___syscall64(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall64 (getppid)");
unsafe { getpid() }
}
pub extern "C" fn ___syscall66(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall66");
-1
}
pub extern "C" fn ___syscall75(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall75");
-1
}
pub extern "C" fn ___syscall85(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall85");
-1
}
pub extern "C" fn ___syscall91(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall91");
-1
}
pub extern "C" fn ___syscall97(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall97");
-1
}
// socketcall
#[allow(clippy::cast_ptr_alignment)]
pub extern "C" fn ___syscall102(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
@ -507,6 +552,11 @@ pub extern "C" fn ___syscall102(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
}
}
pub extern "C" fn ___syscall110(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall110");
-1
}
/// wait4
#[allow(clippy::cast_ptr_alignment)]
pub extern "C" fn ___syscall114(_which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> pid_t {
@ -668,6 +718,11 @@ pub extern "C" fn ___syscall146(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
}
}
pub extern "C" fn ___syscall168(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall168");
-1
}
// pread
pub extern "C" fn ___syscall180(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
debug!("emscripten::___syscall180 (pread) {}", which);
@ -706,6 +761,26 @@ pub extern "C" fn ___syscall181(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
status
}
pub extern "C" fn ___syscall191(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall191 - stub");
-1
}
pub extern "C" fn ___syscall194(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall194 - stub");
-1
}
pub extern "C" fn ___syscall196(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall194 - stub");
-1
}
pub extern "C" fn ___syscall199(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall199 - stub");
-1
}
// stat64
pub extern "C" fn ___syscall195(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
debug!("emscripten::___syscall195 (stat64) {}", which);
@ -746,11 +821,11 @@ pub extern "C" fn ___syscall197(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
}
// getgid
pub extern "C" fn ___syscall201() -> gid_t {
pub extern "C" fn ___syscall201(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall201 (getgid)");
unsafe {
// Maybe fix: Emscripten returns 0 always
getgid()
getgid() as i32
}
}
@ -776,6 +851,11 @@ pub extern "C" fn ___syscall212(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
unsafe { chown(pathname_addr, owner, group) }
}
pub extern "C" fn ___syscall220(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall220");
-1
}
// fcntl64
pub extern "C" fn ___syscall221(which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> c_int {
debug!("emscripten::___syscall221 (fcntl64) {}", which);
@ -788,6 +868,31 @@ pub extern "C" fn ___syscall221(which: c_int, mut varargs: VarArgs, ctx: &mut Ct
}
}
pub extern "C" fn ___syscall268(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall268");
-1
}
pub extern "C" fn ___syscall272(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall272");
-1
}
pub extern "C" fn ___syscall295(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall295");
-1
}
pub extern "C" fn ___syscall300(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall300");
-1
}
pub extern "C" fn ___syscall334(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::___syscall334");
-1
}
/// dup3
pub extern "C" fn ___syscall330(_which: c_int, mut varargs: VarArgs, ctx: &mut Ctx) -> pid_t {
// Implementation based on description at https://linux.die.net/man/2/dup3

View File

@ -99,6 +99,16 @@ pub extern "C" fn _difftime(t0: u32, t1: u32) -> c_int {
(t0 - t1) as _
}
pub extern "C" fn _gmtime_r(one: i32, two: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_gmtime_r");
-1
}
pub extern "C" fn _mktime(one: i32, ctx: &mut Ctx) -> i32 {
debug!("emscripten::_mktime");
-1
}
#[repr(C)]
struct guest_tm {
pub tm_sec: c_int, // 0