wasmer_emscripten/io/
unix.rs

1use super::super::env::call_malloc;
2use super::super::utils::copy_cstr_into_wasm;
3use libc::{chroot as _chroot, getpwuid as _getpwuid, printf as _printf};
4use std::mem;
5
6use crate::EmEnv;
7use wasmer::FunctionEnvMut;
8
9/// putchar
10pub fn putchar(_ctx: FunctionEnvMut<EmEnv>, chr: i32) {
11    unsafe { libc::putchar(chr) };
12}
13
14/// printf
15pub fn printf(ctx: FunctionEnvMut<EmEnv>, memory_offset: i32, extra: i32) -> i32 {
16    debug!("emscripten::printf {}, {}", memory_offset, extra);
17    unsafe {
18        let addr = emscripten_memory_pointer!(ctx.data().memory(0).view(&ctx), memory_offset) as _;
19        _printf(addr, extra)
20    }
21}
22
23/// chroot
24pub fn chroot(ctx: FunctionEnvMut<EmEnv>, name_ptr: i32) -> i32 {
25    debug!("emscripten::chroot");
26    let name = emscripten_memory_pointer!(ctx.data().memory(0).view(&ctx), name_ptr) as *const i8;
27    unsafe { _chroot(name as *const _) }
28}
29
30/// getpwuid
31#[allow(clippy::cast_ptr_alignment)]
32pub fn getpwuid(mut ctx: FunctionEnvMut<EmEnv>, uid: i32) -> i32 {
33    debug!("emscripten::getpwuid {}", uid);
34
35    #[repr(C)]
36    struct GuestPasswd {
37        pw_name: u32,
38        pw_passwd: u32,
39        pw_uid: u32,
40        pw_gid: u32,
41        pw_gecos: u32,
42        pw_dir: u32,
43        pw_shell: u32,
44    }
45
46    unsafe {
47        let passwd = &*_getpwuid(uid as _);
48        let passwd_struct_offset = call_malloc(&mut ctx, mem::size_of::<GuestPasswd>() as _);
49        let passwd_struct_ptr =
50            emscripten_memory_pointer!(ctx.data().memory(0).view(&ctx), passwd_struct_offset)
51                as *mut GuestPasswd;
52        assert_eq!(
53            passwd_struct_ptr as usize % std::mem::align_of::<GuestPasswd>(),
54            0
55        );
56        (*passwd_struct_ptr).pw_name = copy_cstr_into_wasm(&mut ctx, passwd.pw_name);
57        (*passwd_struct_ptr).pw_passwd = copy_cstr_into_wasm(&mut ctx, passwd.pw_passwd);
58        (*passwd_struct_ptr).pw_gecos = copy_cstr_into_wasm(&mut ctx, passwd.pw_gecos);
59        (*passwd_struct_ptr).pw_dir = copy_cstr_into_wasm(&mut ctx, passwd.pw_dir);
60        (*passwd_struct_ptr).pw_shell = copy_cstr_into_wasm(&mut ctx, passwd.pw_shell);
61        (*passwd_struct_ptr).pw_uid = passwd.pw_uid;
62        (*passwd_struct_ptr).pw_gid = passwd.pw_gid;
63
64        passwd_struct_offset as _
65    }
66    // unsafe { _getpwuid(uid as _) as _}
67    // 0
68}