wasmer_emscripten/syscalls/
mod.rs

1#[cfg(unix)]
2mod unix;
3
4#[cfg(windows)]
5mod windows;
6
7#[cfg(unix)]
8pub use self::unix::*;
9
10#[cfg(windows)]
11pub use self::windows::*;
12
13use crate::{
14    utils::{copy_stat_into_wasm, get_cstr_path, get_current_directory},
15    EmEnv,
16};
17
18use super::varargs::VarArgs;
19use byteorder::{ByteOrder, LittleEndian};
20/// NOTE: TODO: These syscalls only support wasm_32 for now because they assume offsets are u32
21/// Syscall list: https://www.cs.utexas.edu/~bismith/test/syscalls/syscalls32.html
22use libc::{
23    c_int,
24    c_void,
25    chdir,
26    // setsockopt, getppid
27    close,
28    dup2,
29    exit,
30    fstat,
31    getpid,
32    // readlink,
33    // iovec,
34    lseek,
35    //    open,
36    read,
37    rename,
38    // sockaddr_in,
39    // readv,
40    rmdir,
41    // writev,
42    stat,
43    write,
44    // ENOTTY,
45};
46
47use super::env;
48#[allow(unused_imports)]
49use std::io::Error;
50use std::slice;
51use wasmer::{FunctionEnvMut, WasmPtr};
52
53/// exit
54pub fn ___syscall1(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) {
55    debug!("emscripten::___syscall1 (exit) {}", _which);
56    let status: i32 = varargs.get(&ctx);
57    unsafe {
58        exit(status);
59    }
60}
61
62/// read
63pub fn ___syscall3(ctx: FunctionEnvMut<EmEnv>, _which: i32, mut varargs: VarArgs) -> i32 {
64    // -> ssize_t
65    debug!("emscripten::___syscall3 (read) {}", _which);
66    let fd: i32 = varargs.get(&ctx);
67    let buf: u32 = varargs.get(&ctx);
68    let count: i32 = varargs.get(&ctx);
69    debug!("=> fd: {}, buf_offset: {}, count: {}", fd, buf, count);
70    let memory = ctx.data().memory(0);
71    let buf_addr = emscripten_memory_pointer!(memory.view(&ctx), buf) as *mut c_void;
72    let ret = unsafe { read(fd, buf_addr, count as _) };
73    debug!("=> ret: {}", ret);
74    ret as _
75}
76
77/// write
78pub fn ___syscall4(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
79    debug!("emscripten::___syscall4 (write) {}", _which);
80    let fd: i32 = varargs.get(&ctx);
81    let buf: i32 = varargs.get(&ctx);
82    let count: i32 = varargs.get(&ctx);
83    debug!("=> fd: {}, buf: {}, count: {}", fd, buf, count);
84    let memory = ctx.data().memory(0);
85    let buf_addr = emscripten_memory_pointer!(memory.view(&ctx), buf) as *const c_void;
86    unsafe { write(fd, buf_addr, count as _) as i32 }
87}
88
89/// close
90pub fn ___syscall6(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
91    debug!("emscripten::___syscall6 (close) {}", _which);
92    let fd: i32 = varargs.get(&ctx);
93    debug!("fd: {}", fd);
94    unsafe { close(fd) }
95}
96
97// chdir
98pub fn ___syscall12(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
99    debug!("emscripten::___syscall12 (chdir) {}", _which);
100    let path_ptr = varargs.get_str(&ctx);
101    let real_path_owned = get_cstr_path(ctx, path_ptr as *const _);
102    let real_path = if let Some(ref rp) = real_path_owned {
103        rp.as_c_str().as_ptr()
104    } else {
105        path_ptr
106    };
107    let ret = unsafe { chdir(real_path) };
108    debug!(
109        "=> path: {:?}, ret: {}",
110        unsafe { std::ffi::CStr::from_ptr(real_path) },
111        ret
112    );
113    ret
114}
115
116pub fn ___syscall10(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
117    debug!("emscripten::___syscall10");
118    -1
119}
120
121pub fn ___syscall14(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
122    debug!("emscripten::___syscall14");
123    -1
124}
125
126pub fn ___syscall15(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
127    debug!("emscripten::___syscall15");
128    -1
129}
130
131// getpid
132pub fn ___syscall20(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
133    debug!("emscripten::___syscall20 (getpid)");
134    unsafe { getpid() }
135}
136
137pub fn ___syscall21(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
138    debug!("emscripten::___syscall21");
139    -1
140}
141
142pub fn ___syscall25(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
143    debug!("emscripten::___syscall25");
144    -1
145}
146
147pub fn ___syscall29(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
148    debug!("emscripten::___syscall29");
149    -1
150}
151
152pub fn ___syscall32(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
153    debug!("emscripten::___syscall32");
154    -1
155}
156
157pub fn ___syscall33(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
158    debug!("emscripten::___syscall33");
159    -1
160}
161
162pub fn ___syscall36(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
163    debug!("emscripten::___syscall36");
164    -1
165}
166
167// rename
168pub fn ___syscall38(mut ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> i32 {
169    debug!("emscripten::___syscall38 (rename)");
170    let old_path = varargs.get_str(&ctx);
171    let new_path = varargs.get_str(&ctx);
172    let real_old_path_owned = get_cstr_path(ctx.as_mut(), old_path as *const _);
173    let real_old_path = if let Some(ref rp) = real_old_path_owned {
174        rp.as_c_str().as_ptr()
175    } else {
176        old_path
177    };
178    let real_new_path_owned = get_cstr_path(ctx, new_path as *const _);
179    let real_new_path = if let Some(ref rp) = real_new_path_owned {
180        rp.as_c_str().as_ptr()
181    } else {
182        new_path
183    };
184    let result = unsafe { rename(real_old_path, real_new_path) };
185    debug!(
186        "=> old_path: {}, new_path: {}, result: {}",
187        unsafe { std::ffi::CStr::from_ptr(real_old_path).to_str().unwrap() },
188        unsafe { std::ffi::CStr::from_ptr(real_new_path).to_str().unwrap() },
189        result
190    );
191    result
192}
193
194// rmdir
195pub fn ___syscall40(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
196    debug!("emscripten::___syscall40 (rmdir)");
197    let pathname_addr = varargs.get_str(&ctx);
198    let real_path_owned = get_cstr_path(ctx, pathname_addr as *const _);
199    let real_path = if let Some(ref rp) = real_path_owned {
200        rp.as_c_str().as_ptr()
201    } else {
202        pathname_addr
203    };
204    unsafe { rmdir(real_path) }
205}
206
207// pipe
208pub fn ___syscall42(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
209    debug!("emscripten::___syscall42 (pipe)");
210    // offset to a file descriptor, which contains a read end and write end, 2 integers
211    let fd_offset: u32 = varargs.get(&ctx);
212
213    let memory = ctx.data().memory(0);
214    let emscripten_memory = memory.view(&ctx);
215
216    // convert the file descriptor into a vec with two slots
217    let mut fd_vec: [c_int; 2] = WasmPtr::<[c_int; 2]>::new(fd_offset)
218        .deref(&emscripten_memory)
219        .read()
220        .unwrap();
221
222    // get it as a mutable pointer
223    let fd_ptr = fd_vec.as_mut_ptr();
224
225    // call pipe and store the pointers in this array
226    #[cfg(target_os = "windows")]
227    let result: c_int = unsafe { libc::pipe(fd_ptr, 2048, 0) };
228    #[cfg(not(target_os = "windows"))]
229    let result: c_int = unsafe { libc::pipe(fd_ptr) };
230    if result == -1 {
231        debug!("=> os error: {}", Error::last_os_error());
232    }
233    result
234}
235
236pub fn ___syscall51(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
237    debug!("emscripten::___syscall51");
238    -1
239}
240
241pub fn ___syscall52(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
242    debug!("emscripten::___syscall52");
243    -1
244}
245
246pub fn ___syscall53(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
247    debug!("emscripten::___syscall53");
248    -1
249}
250
251pub fn ___syscall60(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
252    debug!("emscripten::___syscall60");
253    -1
254}
255
256// dup2
257pub fn ___syscall63(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
258    debug!("emscripten::___syscall63 (dup2) {}", _which);
259
260    let src: i32 = varargs.get(&ctx);
261    let dst: i32 = varargs.get(&ctx);
262
263    unsafe { dup2(src, dst) }
264}
265
266// getppid
267pub fn ___syscall64(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
268    debug!("emscripten::___syscall64 (getppid)");
269    unsafe { getpid() }
270}
271
272pub fn ___syscall66(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
273    debug!("emscripten::___syscall66");
274    -1
275}
276
277pub fn ___syscall75(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
278    debug!("emscripten::___syscall75");
279    -1
280}
281
282pub fn ___syscall91(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
283    debug!("emscripten::___syscall91 - stub");
284    0
285}
286
287pub fn ___syscall96(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
288    debug!("emscripten::___syscall96");
289    -1
290}
291
292pub fn ___syscall97(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
293    debug!("emscripten::___syscall97");
294    -1
295}
296
297pub fn ___syscall110(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
298    debug!("emscripten::___syscall110");
299    -1
300}
301
302pub fn ___syscall121(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
303    debug!("emscripten::___syscall121");
304    -1
305}
306
307pub fn ___syscall125(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
308    debug!("emscripten::___syscall125");
309    -1
310}
311
312pub fn ___syscall133(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
313    debug!("emscripten::___syscall133");
314    -1
315}
316
317pub fn ___syscall144(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
318    debug!("emscripten::___syscall144");
319    -1
320}
321
322pub fn ___syscall147(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
323    debug!("emscripten::___syscall147");
324    -1
325}
326
327pub fn ___syscall150(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
328    debug!("emscripten::___syscall150");
329    -1
330}
331
332pub fn ___syscall151(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
333    debug!("emscripten::___syscall151");
334    -1
335}
336
337pub fn ___syscall152(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
338    debug!("emscripten::___syscall152");
339    -1
340}
341
342pub fn ___syscall153(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
343    debug!("emscripten::___syscall153");
344    -1
345}
346
347pub fn ___syscall163(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
348    debug!("emscripten::___syscall163");
349    -1
350}
351
352// getcwd
353pub fn ___syscall183(mut ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> i32 {
354    debug!("emscripten::___syscall183");
355    let buf_offset: WasmPtr<libc::c_char> = varargs.get(&ctx);
356    let _size: c_int = varargs.get(&ctx);
357    let path = get_current_directory(ctx.as_mut());
358    let path_string = path.unwrap().display().to_string();
359    let len = path_string.len();
360    let memory = ctx.data().memory(0);
361    let memory = memory.view(&ctx);
362
363    let buf_writer = buf_offset.slice(&memory, len as u32 + 1).unwrap();
364    for (i, byte) in path_string.bytes().enumerate() {
365        buf_writer.index(i as u64).write(byte as _).unwrap();
366    }
367    buf_writer.index(len as u64).write(0).unwrap();
368    buf_offset.offset() as i32
369}
370
371// mmap2
372pub fn ___syscall192(mut ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
373    debug!("emscripten::___syscall192 (mmap2) {}", _which);
374    let _addr: i32 = varargs.get(&ctx);
375    let len: u32 = varargs.get(&ctx);
376    let _prot: i32 = varargs.get(&ctx);
377    let _flags: i32 = varargs.get(&ctx);
378    let fd: i32 = varargs.get(&ctx);
379    let _off: i32 = varargs.get(&ctx);
380    debug!(
381        "=> addr: {}, len: {}, prot: {}, flags: {}, fd: {}, off: {}",
382        _addr, len, _prot, _flags, fd, _off
383    );
384
385    if fd == -1 {
386        let ptr = env::call_memalign(&mut ctx, 16384, len);
387        if ptr == 0 {
388            // ENOMEM
389            return -12;
390        }
391        let memory = ctx.data().memory(0);
392        let real_ptr = emscripten_memory_pointer!(memory.view(&ctx), ptr) as *const u8;
393        env::call_memset(&mut ctx, ptr, 0, len);
394        for i in 0..(len as usize) {
395            unsafe {
396                assert_eq!(*real_ptr.add(i), 0);
397            }
398        }
399        debug!("=> ptr: {}", ptr);
400        ptr as i32
401    } else {
402        // return ENODEV
403        -19
404    }
405}
406
407/// lseek
408pub fn ___syscall140(ctx: FunctionEnvMut<EmEnv>, _which: i32, mut varargs: VarArgs) -> i32 {
409    // -> c_int
410    debug!("emscripten::___syscall140 (lseek) {}", _which);
411    let fd: i32 = varargs.get(&ctx);
412    let _offset_high: u32 = varargs.get(&ctx); // We don't use the offset high as emscripten skips it
413    let offset_low: u32 = varargs.get(&ctx);
414    let result_ptr_value: WasmPtr<i64> = varargs.get(&ctx);
415    let whence: i32 = varargs.get(&ctx);
416    let offset = offset_low;
417    let ret = unsafe { lseek(fd, offset as _, whence) as i64 };
418    let memory = ctx.data().memory(0);
419    let memory = memory.view(&ctx);
420
421    let result_ptr = result_ptr_value.deref(&memory);
422    result_ptr.write(ret).unwrap();
423
424    debug!(
425        "=> fd: {}, offset: {}, result: {}, whence: {} = {}\nlast os error: {}",
426        fd,
427        offset,
428        ret,
429        whence,
430        0,
431        Error::last_os_error(),
432    );
433    0
434}
435
436/// readv
437#[allow(clippy::cast_ptr_alignment)]
438pub fn ___syscall145(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> i32 {
439    // -> ssize_t
440    debug!("emscripten::___syscall145 (readv) {}", _which);
441
442    let fd: i32 = varargs.get(&ctx);
443    let iov: i32 = varargs.get(&ctx);
444    let iovcnt: i32 = varargs.get(&ctx);
445
446    #[repr(C)]
447    struct GuestIovec {
448        iov_base: i32,
449        iov_len: i32,
450    }
451
452    debug!("=> fd: {}, iov: {}, iovcnt = {}", fd, iov, iovcnt);
453    let mut ret = 0;
454    unsafe {
455        for i in 0..iovcnt {
456            let memory = ctx.data().memory(0);
457            let guest_iov_addr =
458                emscripten_memory_pointer!(memory.view(&ctx), (iov + i * 8)) as *mut GuestIovec;
459            let iov_base = emscripten_memory_pointer!(memory.view(&ctx), (*guest_iov_addr).iov_base)
460                as *mut c_void;
461            let iov_len = (*guest_iov_addr).iov_len as _;
462            // debug!("=> iov_addr: {:?}, {:?}", iov_base, iov_len);
463            let curr = read(fd, iov_base, iov_len);
464            if curr < 0 {
465                return -1;
466            }
467            ret += curr;
468        }
469        // debug!(" => ret: {}", ret);
470        ret as _
471    }
472}
473
474// writev
475#[allow(clippy::cast_ptr_alignment)]
476pub fn ___syscall146(ctx: FunctionEnvMut<EmEnv>, _which: i32, mut varargs: VarArgs) -> i32 {
477    // -> ssize_t
478    debug!("emscripten::___syscall146 (writev) {}", _which);
479    let fd: i32 = varargs.get(&ctx);
480    let iov: i32 = varargs.get(&ctx);
481    let iovcnt: i32 = varargs.get(&ctx);
482
483    #[repr(C)]
484    struct GuestIovec {
485        iov_base: i32,
486        iov_len: i32,
487    }
488
489    debug!("=> fd: {}, iov: {}, iovcnt = {}", fd, iov, iovcnt);
490    let mut ret = 0;
491    for i in 0..iovcnt {
492        unsafe {
493            let memory = ctx.data().memory(0);
494            let guest_iov_addr =
495                emscripten_memory_pointer!(memory.view(&ctx), (iov + i * 8)) as *mut GuestIovec;
496            let iov_base = emscripten_memory_pointer!(memory.view(&ctx), (*guest_iov_addr).iov_base)
497                as *const c_void;
498            let iov_len = (*guest_iov_addr).iov_len as _;
499            // debug!("=> iov_addr: {:?}, {:?}", iov_base, iov_len);
500            let curr = write(fd, iov_base, iov_len);
501            debug!(
502                "=> iov_base: {}, iov_len: {}, curr = {}",
503                (*guest_iov_addr).iov_base,
504                iov_len,
505                curr
506            );
507            if curr < 0 {
508                debug!("=> os error: {}", Error::last_os_error());
509                return -1;
510            }
511            ret += curr;
512        }
513    }
514    debug!(" => ret: {}", ret);
515    ret as _
516}
517
518pub fn ___syscall191(ctx: FunctionEnvMut<EmEnv>, _which: i32, mut varargs: VarArgs) -> i32 {
519    let _resource: i32 = varargs.get(&ctx);
520    debug!(
521        "emscripten::___syscall191 - mostly stub, resource: {}",
522        _resource
523    );
524    let rlim_emptr: i32 = varargs.get(&ctx);
525    let memory = ctx.data().memory(0);
526    let rlim_ptr = emscripten_memory_pointer!(memory.view(&ctx), rlim_emptr) as *mut u8;
527    let rlim = unsafe { slice::from_raw_parts_mut(rlim_ptr, 16) };
528
529    // set all to RLIM_INIFINTY
530    LittleEndian::write_i64(&mut *rlim, -1);
531    LittleEndian::write_i64(&mut rlim[8..], -1);
532
533    0
534}
535
536pub fn ___syscall193(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
537    debug!("emscripten::___syscall193");
538    -1
539}
540
541// stat64
542pub fn ___syscall195(mut ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
543    debug!("emscripten::___syscall195 (stat64) {}", _which);
544    let pathname_addr = varargs.get_str(&ctx);
545    let buf: u32 = varargs.get(&ctx);
546
547    let real_path_owned = get_cstr_path(ctx.as_mut(), pathname_addr as *const _);
548    let real_path = if let Some(ref rp) = real_path_owned {
549        rp.as_c_str().as_ptr()
550    } else {
551        pathname_addr
552    };
553
554    unsafe {
555        let mut _stat: stat = std::mem::zeroed();
556        let ret = stat(real_path, &mut _stat);
557        debug!(
558            "=> pathname: {}, buf: {} = {}",
559            std::ffi::CStr::from_ptr(real_path).to_str().unwrap(),
560            buf,
561            ret
562        );
563        if ret != 0 {
564            debug!("=> os error: {}", Error::last_os_error());
565            return ret;
566        }
567        copy_stat_into_wasm(ctx, buf, &_stat);
568    }
569    0
570}
571
572// fstat64
573pub fn ___syscall197(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
574    debug!("emscripten::___syscall197 (fstat64) {}", _which);
575
576    let fd: c_int = varargs.get(&ctx);
577    let buf: u32 = varargs.get(&ctx);
578
579    unsafe {
580        let mut stat = std::mem::zeroed();
581        let ret = fstat(fd, &mut stat);
582        debug!("=> fd: {}, buf: {} = {}", fd, buf, ret);
583        if ret != 0 {
584            debug!("=> os error: {}", Error::last_os_error());
585            return ret;
586        }
587        copy_stat_into_wasm(ctx, buf, &stat);
588    }
589    0
590}
591
592pub fn ___syscall209(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
593    debug!("emscripten::___syscall209");
594    -1
595}
596
597pub fn ___syscall211(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
598    debug!("emscripten::___syscall211");
599    -1
600}
601
602pub fn ___syscall218(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
603    debug!("emscripten::___syscall218");
604    -1
605}
606
607pub fn ___syscall268(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
608    debug!("emscripten::___syscall268");
609    -1
610}
611
612pub fn ___syscall269(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
613    debug!("emscripten::___syscall269");
614    -1
615}
616
617pub fn ___syscall272(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
618    debug!("emscripten::___syscall272");
619    -1
620}
621
622pub fn ___syscall295(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
623    debug!("emscripten::___syscall295");
624    -1
625}
626
627pub fn ___syscall296(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
628    debug!("emscripten::___syscall296");
629    -1
630}
631
632pub fn ___syscall297(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
633    debug!("emscripten::___syscall297");
634    -1
635}
636
637pub fn ___syscall298(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
638    debug!("emscripten::___syscall298");
639    -1
640}
641
642pub fn ___syscall300(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
643    debug!("emscripten::___syscall300");
644    -1
645}
646
647pub fn ___syscall301(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
648    debug!("emscripten::___syscall301");
649    -1
650}
651
652pub fn ___syscall302(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
653    debug!("emscripten::___syscall302");
654    -1
655}
656
657pub fn ___syscall303(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
658    debug!("emscripten::___syscall303");
659    -1
660}
661
662pub fn ___syscall304(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
663    debug!("emscripten::___syscall304");
664    -1
665}
666
667pub fn ___syscall305(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
668    debug!("emscripten::___syscall305");
669    -1
670}
671
672pub fn ___syscall306(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
673    debug!("emscripten::___syscall306");
674    -1
675}
676
677pub fn ___syscall307(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
678    debug!("emscripten::___syscall307");
679    -1
680}
681
682pub fn ___syscall308(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
683    debug!("emscripten::___syscall308");
684    -1
685}
686
687// utimensat
688pub fn ___syscall320(_ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut _varargs: VarArgs) -> c_int {
689    debug!("emscripten::___syscall320 (utimensat), {}", _which);
690    0
691}
692
693pub fn ___syscall331(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
694    debug!("emscripten::___syscall331");
695    -1
696}
697
698pub fn ___syscall333(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
699    debug!("emscripten::___syscall333");
700    -1
701}
702
703pub fn ___syscall334(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
704    debug!("emscripten::___syscall334");
705    -1
706}
707
708pub fn ___syscall337(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
709    debug!("emscripten::___syscall337");
710    -1
711}
712
713// prlimit64
714pub fn ___syscall340(ctx: FunctionEnvMut<EmEnv>, _which: c_int, mut varargs: VarArgs) -> c_int {
715    debug!("emscripten::___syscall340 (prlimit64), {}", _which);
716    // NOTE: Doesn't really matter. Wasm modules cannot exceed WASM_PAGE_SIZE anyway.
717    let _pid: i32 = varargs.get(&ctx);
718    let resource: i32 = varargs.get(&ctx);
719    let _new_limit: u32 = varargs.get(&ctx);
720    let old_limit: u32 = varargs.get(&ctx);
721
722    let val = match resource {
723        // RLIMIT_NOFILE
724        7 => 1024,
725        _ => -1, // RLIM_INFINITY
726    };
727
728    if old_limit != 0 {
729        // just report no limits
730        let memory = ctx.data().memory(0);
731        let buf_ptr = emscripten_memory_pointer!(memory.view(&ctx), old_limit) as *mut u8;
732        let buf = unsafe { slice::from_raw_parts_mut(buf_ptr, 16) };
733
734        LittleEndian::write_i64(&mut *buf, val);
735        LittleEndian::write_i64(&mut buf[8..], val);
736    }
737
738    0
739}
740
741pub fn ___syscall345(_ctx: FunctionEnvMut<EmEnv>, _one: i32, _two: i32) -> i32 {
742    debug!("emscripten::___syscall345");
743    -1
744}