wasmer_emscripten/io/
unix.rs1use 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
9pub fn putchar(_ctx: FunctionEnvMut<EmEnv>, chr: i32) {
11 unsafe { libc::putchar(chr) };
12}
13
14pub 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
23pub 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#[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 }