diff --git a/lib/wasi-tests/build/wasitests.rs b/lib/wasi-tests/build/wasitests.rs index 97a5ce30b8f..0144da92056 100644 --- a/lib/wasi-tests/build/wasitests.rs +++ b/lib/wasi-tests/build/wasitests.rs @@ -145,7 +145,7 @@ pub fn compile(file: &str, ignores: &HashSet) -> Option { out_str.push_str("vec!["); for entry in args.po_dirs { - out_str.push_str(&format!("\"{}\".to_string(),", entry)); + out_str.push_str(&format!("std::path::PathBuf::from(\"{}\"),", entry)); } out_str.push_str("]"); diff --git a/lib/wasi-tests/tests/wasitests/close_preopen_fd.rs b/lib/wasi-tests/tests/wasitests/close_preopen_fd.rs index 38089722d96..bae1c8ad817 100644 --- a/lib/wasi-tests/tests/wasitests/close_preopen_fd.rs +++ b/lib/wasi-tests/tests/wasitests/close_preopen_fd.rs @@ -2,16 +2,14 @@ // ANY MANUAL EDITS MAY BE OVERWRITTEN AT ANY TIME // Files autogenerated with cargo build (build/wasitests.rs). + #[test] fn test_close_preopen_fd() { assert_wasi_output!( "../../wasitests/close_preopen_fd.wasm", "close_preopen_fd", vec![], - vec![( - "hamlet".to_string(), - ::std::path::PathBuf::from("wasitests/test_fs/hamlet") - ),], + vec![("hamlet".to_string(), ::std::path::PathBuf::from("wasitests/test_fs/hamlet")),], vec![], "../../wasitests/close_preopen_fd.out" ); diff --git a/lib/wasi-tests/tests/wasitests/create_dir.rs b/lib/wasi-tests/tests/wasitests/create_dir.rs index 99a9fdd27dc..598131507da 100644 --- a/lib/wasi-tests/tests/wasitests/create_dir.rs +++ b/lib/wasi-tests/tests/wasitests/create_dir.rs @@ -2,12 +2,13 @@ // ANY MANUAL EDITS MAY BE OVERWRITTEN AT ANY TIME // Files autogenerated with cargo build (build/wasitests.rs). + #[test] fn test_create_dir() { assert_wasi_output!( "../../wasitests/create_dir.wasm", "create_dir", - vec![".".to_string(),], + vec![std::path::PathBuf::from("."),], vec![], vec![], "../../wasitests/create_dir.out" diff --git a/lib/wasi-tests/tests/wasitests/file_metadata.rs b/lib/wasi-tests/tests/wasitests/file_metadata.rs index 21680120701..c05595beaae 100644 --- a/lib/wasi-tests/tests/wasitests/file_metadata.rs +++ b/lib/wasi-tests/tests/wasitests/file_metadata.rs @@ -7,7 +7,7 @@ fn test_file_metadata() { assert_wasi_output!( "../../wasitests/file_metadata.wasm", "file_metadata", - vec![".".to_string(),], + vec![std::path::PathBuf::from("."),], vec![], vec![], "../../wasitests/file_metadata.out" diff --git a/lib/wasi-tests/tests/wasitests/quine.rs b/lib/wasi-tests/tests/wasitests/quine.rs index 37cbdbbcfee..c4139d95920 100644 --- a/lib/wasi-tests/tests/wasitests/quine.rs +++ b/lib/wasi-tests/tests/wasitests/quine.rs @@ -7,7 +7,7 @@ fn test_quine() { assert_wasi_output!( "../../wasitests/quine.wasm", "quine", - vec![".".to_string(),], + vec![std::path::PathBuf::from("."),], vec![], vec![], "../../wasitests/quine.out" diff --git a/lib/wasi-tests/wasitests/close_preopen_fd.wasm b/lib/wasi-tests/wasitests/close_preopen_fd.wasm index 7b69083506e..56d37f64630 100755 Binary files a/lib/wasi-tests/wasitests/close_preopen_fd.wasm and b/lib/wasi-tests/wasitests/close_preopen_fd.wasm differ diff --git a/lib/wasi-tests/wasitests/create_dir.wasm b/lib/wasi-tests/wasitests/create_dir.wasm index 2fa02379276..f4a9898f0c7 100755 Binary files a/lib/wasi-tests/wasitests/create_dir.wasm and b/lib/wasi-tests/wasitests/create_dir.wasm differ diff --git a/lib/wasi-tests/wasitests/envvar.wasm b/lib/wasi-tests/wasitests/envvar.wasm index ef539e6a5ae..1e394c49f97 100755 Binary files a/lib/wasi-tests/wasitests/envvar.wasm and b/lib/wasi-tests/wasitests/envvar.wasm differ diff --git a/lib/wasi-tests/wasitests/fd_allocate.wasm b/lib/wasi-tests/wasitests/fd_allocate.wasm index b3b8a46bda1..ee688bf93ad 100755 Binary files a/lib/wasi-tests/wasitests/fd_allocate.wasm and b/lib/wasi-tests/wasitests/fd_allocate.wasm differ diff --git a/lib/wasi-tests/wasitests/fd_pread.wasm b/lib/wasi-tests/wasitests/fd_pread.wasm index a6fdb0c33a4..11031b32ef0 100755 Binary files a/lib/wasi-tests/wasitests/fd_pread.wasm and b/lib/wasi-tests/wasitests/fd_pread.wasm differ diff --git a/lib/wasi-tests/wasitests/fd_read.wasm b/lib/wasi-tests/wasitests/fd_read.wasm index 7cd2891ceab..227157f989d 100755 Binary files a/lib/wasi-tests/wasitests/fd_read.wasm and b/lib/wasi-tests/wasitests/fd_read.wasm differ diff --git a/lib/wasi-tests/wasitests/fd_sync.wasm b/lib/wasi-tests/wasitests/fd_sync.wasm index b5a3243ffc2..497b63c9bc8 100755 Binary files a/lib/wasi-tests/wasitests/fd_sync.wasm and b/lib/wasi-tests/wasitests/fd_sync.wasm differ diff --git a/lib/wasi-tests/wasitests/file_metadata.wasm b/lib/wasi-tests/wasitests/file_metadata.wasm index 986362c588c..938fdc1f256 100755 Binary files a/lib/wasi-tests/wasitests/file_metadata.wasm and b/lib/wasi-tests/wasitests/file_metadata.wasm differ diff --git a/lib/wasi-tests/wasitests/fs_sandbox_test.wasm b/lib/wasi-tests/wasitests/fs_sandbox_test.wasm index 255287806fe..3f088985069 100755 Binary files a/lib/wasi-tests/wasitests/fs_sandbox_test.wasm and b/lib/wasi-tests/wasitests/fs_sandbox_test.wasm differ diff --git a/lib/wasi-tests/wasitests/fseek.wasm b/lib/wasi-tests/wasitests/fseek.wasm index f50045437df..ce68b75f05a 100755 Binary files a/lib/wasi-tests/wasitests/fseek.wasm and b/lib/wasi-tests/wasitests/fseek.wasm differ diff --git a/lib/wasi-tests/wasitests/hello.wasm b/lib/wasi-tests/wasitests/hello.wasm index 758a14bd1a8..1175a7f7236 100755 Binary files a/lib/wasi-tests/wasitests/hello.wasm and b/lib/wasi-tests/wasitests/hello.wasm differ diff --git a/lib/wasi-tests/wasitests/mapdir.wasm b/lib/wasi-tests/wasitests/mapdir.wasm index c6e5949912f..849a3a6ae2f 100755 Binary files a/lib/wasi-tests/wasitests/mapdir.wasm and b/lib/wasi-tests/wasitests/mapdir.wasm differ diff --git a/lib/wasi-tests/wasitests/path_link.wasm b/lib/wasi-tests/wasitests/path_link.wasm index 822c78ab3bb..306a911e651 100755 Binary files a/lib/wasi-tests/wasitests/path_link.wasm and b/lib/wasi-tests/wasitests/path_link.wasm differ diff --git a/lib/wasi-tests/wasitests/path_rename.wasm b/lib/wasi-tests/wasitests/path_rename.wasm index 40197b5319b..f76120ab85a 100755 Binary files a/lib/wasi-tests/wasitests/path_rename.wasm and b/lib/wasi-tests/wasitests/path_rename.wasm differ diff --git a/lib/wasi-tests/wasitests/path_symlink.wasm b/lib/wasi-tests/wasitests/path_symlink.wasm index 3a773eaedd8..61bb0a0224b 100755 Binary files a/lib/wasi-tests/wasitests/path_symlink.wasm and b/lib/wasi-tests/wasitests/path_symlink.wasm differ diff --git a/lib/wasi-tests/wasitests/poll_oneoff.wasm b/lib/wasi-tests/wasitests/poll_oneoff.wasm index 950345d0bde..9510f5b83ee 100755 Binary files a/lib/wasi-tests/wasitests/poll_oneoff.wasm and b/lib/wasi-tests/wasitests/poll_oneoff.wasm differ diff --git a/lib/wasi-tests/wasitests/quine.wasm b/lib/wasi-tests/wasitests/quine.wasm index fc6361b5c23..8cf55c4aca2 100755 Binary files a/lib/wasi-tests/wasitests/quine.wasm and b/lib/wasi-tests/wasitests/quine.wasm differ diff --git a/lib/wasi-tests/wasitests/readlink.wasm b/lib/wasi-tests/wasitests/readlink.wasm index 67ada4404d9..26480cf84aa 100755 Binary files a/lib/wasi-tests/wasitests/readlink.wasm and b/lib/wasi-tests/wasitests/readlink.wasm differ diff --git a/lib/wasi-tests/wasitests/wasi_sees_virtual_root.wasm b/lib/wasi-tests/wasitests/wasi_sees_virtual_root.wasm index 4c819b4cc9f..7f6d3125374 100755 Binary files a/lib/wasi-tests/wasitests/wasi_sees_virtual_root.wasm and b/lib/wasi-tests/wasitests/wasi_sees_virtual_root.wasm differ diff --git a/lib/wasi-tests/wasitests/writing.wasm b/lib/wasi-tests/wasitests/writing.wasm index 148add04d7d..ce7e0180a7d 100755 Binary files a/lib/wasi-tests/wasitests/writing.wasm and b/lib/wasi-tests/wasitests/writing.wasm differ diff --git a/lib/wasi/src/state/builder.rs b/lib/wasi/src/state/builder.rs index 2d422d1e4d4..2435fbb133e 100644 --- a/lib/wasi/src/state/builder.rs +++ b/lib/wasi/src/state/builder.rs @@ -4,30 +4,14 @@ use crate::state::{WasiFs, WasiState}; use std::path::{Path, PathBuf}; /// Creates an empty [`WasiStateBuilder`]. -pub fn create_wasi_state() -> WasiStateBuilder { - WasiStateBuilder::default() +pub(crate) fn create_wasi_state(program_name: &str) -> WasiStateBuilder { + WasiStateBuilder { + args: vec![program_name.bytes().collect()], + ..WasiStateBuilder::default() + } } /// Type for building an instance of [`WasiState`] -/// -/// Usage: -/// -/// ``` -/// # use wasmer_wasi::state::create_wasi_state; -/// create_wasi_state() -/// .env(b"HOME", "/home/home".to_string()) -/// .arg("--help") -/// .envs({ let mut hm = std::collections::HashMap::new(); -/// hm.insert("COLOR_OUTPUT", "TRUE"); -/// hm.insert("PATH", "/usr/bin"); -/// hm -/// }) -/// .args(&["--verbose", "list"]) -/// .preopen_dir("src") -/// .map_dir("dot", ".") -/// .build() -/// .unwrap(); -/// ``` #[derive(Debug, Default, Clone, PartialEq)] pub struct WasiStateBuilder { args: Vec>, @@ -66,6 +50,8 @@ fn validate_mapped_dir_alias(alias: &str) -> Result<(), WasiStateCreationError> Ok(()) } +// TODO add other WasiFS APIs here like swapping out stdout, for example (though we need to +// return stdout somehow, it's unclear what that API should look like) impl WasiStateBuilder { /// Add an environment variable pair. /// Environment variable keys and values must not contain the byte `=` (0x3d) @@ -192,12 +178,16 @@ impl WasiStateBuilder { /// /// Returns the error from `WasiFs::new` if there's an error pub fn build(&mut self) -> Result { - for arg in self.args.iter() { + for (i, arg) in self.args.iter().enumerate() { for b in arg.iter() { if *b == 0 { return Err(WasiStateCreationError::ArgumentContainsNulByte( std::str::from_utf8(arg) - .unwrap_or("Inner error: arg is invalid_utf8!") + .unwrap_or(if i == 0 { + "Inner error: program name is invalid utf8!" + } else { + "Inner error: arg is invalid utf8!" + }) .to_string(), )); } @@ -264,13 +254,17 @@ mod test { #[test] fn env_var_errors() { - let output = create_wasi_state().env("HOM=E", "/home/home").build(); + let output = create_wasi_state("test_prog") + .env("HOM=E", "/home/home") + .build(); match output { Err(WasiStateCreationError::EnvironmentVariableFormatError(_)) => assert!(true), _ => assert!(false), } - let output = create_wasi_state().env("HOME\0", "/home/home").build(); + let output = create_wasi_state("test_prog") + .env("HOME\0", "/home/home") + .build(); match output { Err(WasiStateCreationError::EnvironmentVariableFormatError(_)) => assert!(true), _ => assert!(false), @@ -279,12 +273,14 @@ mod test { #[test] fn nul_character_in_args() { - let output = create_wasi_state().arg("--h\0elp").build(); + let output = create_wasi_state("test_prog").arg("--h\0elp").build(); match output { Err(WasiStateCreationError::ArgumentContainsNulByte(_)) => assert!(true), _ => assert!(false), } - let output = create_wasi_state().args(&["--help", "--wat\0"]).build(); + let output = create_wasi_state("test_prog") + .args(&["--help", "--wat\0"]) + .build(); match output { Err(WasiStateCreationError::ArgumentContainsNulByte(_)) => assert!(true), _ => assert!(false), diff --git a/lib/wasi/src/state/mod.rs b/lib/wasi/src/state/mod.rs index 97746f8ff5f..50c06b20e62 100644 --- a/lib/wasi/src/state/mod.rs +++ b/lib/wasi/src/state/mod.rs @@ -1028,6 +1028,31 @@ pub struct WasiState { } impl WasiState { + /// Create a [`WasiStateBuilder`] to construct a validated instance of + /// [`WasiState`]. + /// + /// Usage: + /// + /// ``` + /// # use wasmer_wasi::state::WasiState; + /// WasiState::new("program_name") + /// .env(b"HOME", "/home/home".to_string()) + /// .arg("--help") + /// .envs({ let mut hm = std::collections::HashMap::new(); + /// hm.insert("COLOR_OUTPUT", "TRUE"); + /// hm.insert("PATH", "/usr/bin"); + /// hm + /// }) + /// .args(&["--verbose", "list"]) + /// .preopen_dir("src") + /// .map_dir("dot", ".") + /// .build() + /// .unwrap(); + /// ``` + pub fn new(program_name: &str) -> WasiStateBuilder { + create_wasi_state(program_name) + } + /// Turn the WasiState into bytes pub fn freeze(&self) -> Option> { bincode::serialize(self).ok()