(
memptr: *mut u8,
homedir: &str,
mut arg_buffer: Vec<u8>,
argc: usize,
mut env_buffer: Vec<u8>,
envc: usize,
netlist: Netlist,
)
| 31 | trace::init_depth_var!(); |
| 32 | |
| 33 | pub fn create_ctx( |
| 34 | memptr: *mut u8, |
| 35 | homedir: &str, |
| 36 | mut arg_buffer: Vec<u8>, |
| 37 | argc: usize, |
| 38 | mut env_buffer: Vec<u8>, |
| 39 | envc: usize, |
| 40 | netlist: Netlist, |
| 41 | ) -> VmCtx { |
| 42 | let memlen = LINEAR_MEM_SIZE; |
| 43 | let mut fdmap = FdMap::new(); |
| 44 | fdmap.init_std_fds(); |
| 45 | let homedir_file = std::fs::File::open(homedir).unwrap(); |
| 46 | let homedir_host_fd = homedir_file.as_raw_fd() as usize; |
| 47 | if homedir_host_fd >= 0 { |
| 48 | fdmap.create(HostFd::from_raw(homedir_host_fd)); |
| 49 | } |
| 50 | // Need to forget file to make sure it does not get auto-closed |
| 51 | // when it gets out of scope |
| 52 | std::mem::forget(homedir_file); |
| 53 | // replace all space with null. |
| 54 | // This makes it easy to return the arg_buffer later |
| 55 | for i in 0..arg_buffer.len() { |
| 56 | if arg_buffer[i] == b' ' { |
| 57 | arg_buffer[i] = b'\0'; |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | // replace all space with null. |
| 62 | // This makes it easy to return the env_buffer later |
| 63 | for i in 0..env_buffer.len() { |
| 64 | if env_buffer[i] == b' ' { |
| 65 | env_buffer[i] = b'\0'; |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | let mem = ffi_load_vec(memptr, memlen); |
| 70 | |
| 71 | VmCtx { |
| 72 | mem, |
| 73 | memlen, |
| 74 | fdmap, |
| 75 | homedir: homedir.to_owned(), |
| 76 | homedir_host_fd: HostFd::from_raw(homedir_host_fd), |
| 77 | arg_buffer, |
| 78 | argc, |
| 79 | env_buffer, |
| 80 | envc, |
| 81 | netlist, |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | /// Used for FFI. (wasm2c frontend) |
| 86 | /// Initialize a vmctx with a memory that points to memptr |
no test coverage detected