From 88c1f6d78f963ab5d96985dd51540cc48bc7b340 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 26 Aug 2020 15:15:32 -0700 Subject: [PATCH 1/5] Add support for WASI opening Unix special files --- Cargo.lock | 13 +++++-- lib/wasi/src/state/mod.rs | 74 +++++++++++++++++++++++++++++++++------ 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e34200d2ce9..35c9a0cb907 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2456,7 +2456,7 @@ dependencies = [ "typetag", "wasmer", "wasmer-wasi", - "wast", + "wast 17.0.0", ] [[package]] @@ -2494,6 +2494,15 @@ version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6" +[[package]] +name = "wast" +version = "17.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0e1c36b928fca33dbaf96235188f5fad22ee87100e26cc606bd0fbabdf1932" +dependencies = [ + "leb128", +] + [[package]] name = "wast" version = "21.0.0" @@ -2509,7 +2518,7 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce85d72b74242c340e9e3492cfb602652d7bb324c3172dd441b5577e39a2e18c" dependencies = [ - "wast", + "wast 21.0.0", ] [[package]] diff --git a/lib/wasi/src/state/mod.rs b/lib/wasi/src/state/mod.rs index 86c0994eac6..4dba5cd1562 100644 --- a/lib/wasi/src/state/mod.rs +++ b/lib/wasi/src/state/mod.rs @@ -819,6 +819,56 @@ impl WasiFs { relative_path: link_value, } } else { + #[cfg(unix)] + { + use std::os::unix::fs::FileTypeExt; + let file_type: __wasi_filetype_t = if file_type.is_char_device() + { + __WASI_FILETYPE_CHARACTER_DEVICE + } else if file_type.is_block_device() { + __WASI_FILETYPE_BLOCK_DEVICE + } else if file_type.is_fifo() { + // FIFO doesn't seem to fit any other type, so unknown + __WASI_FILETYPE_UNKNOWN + } else if file_type.is_socket() { + // TODO: how do we know if it's a `__WASI_FILETYPE_SOCKET_STREAM` or + // a `__WASI_FILETYPE_SOCKET_DGRAM`? + __WASI_FILETYPE_SOCKET_STREAM + } else { + unimplemented!("state::get_inode_at_path unknown file type: not file, directory, symlink, char device, block device, fifo, or socket"); + }; + + let kind = Kind::File { + handle: None, + path: file.clone(), + fd: None, + }; + let new_inode = self.create_inode_with_stat( + kind, + false, + file.to_string_lossy().to_string(), + __wasi_filestat_t { + st_filetype: file_type, + ..__wasi_filestat_t::default() + }, + ); + if let Kind::Dir { + ref mut entries, .. + } = &mut self.inodes[cur_inode].kind + { + entries.insert( + component.as_os_str().to_string_lossy().to_string(), + new_inode, + ); + } else { + unreachable!( + "Attempted to insert special device into non-directory" + ); + } + // perhaps just continue with symlink resolution and return at the end + return Ok(new_inode); + } + #[cfg(not(unix))] unimplemented!("state::get_inode_at_path unknown file type: not file, directory, or symlink"); }; @@ -1178,15 +1228,8 @@ impl WasiFs { is_preopened: bool, name: String, ) -> Result { - let mut stat = self.get_stat_for_kind(&kind).ok_or(__WASI_EIO)?; - stat.st_ino = self.get_next_inode_index(); - - Ok(self.inodes.insert(InodeVal { - stat, - is_preopened, - name, - kind, - })) + let stat = self.get_stat_for_kind(&kind).ok_or(__WASI_EIO)?; + Ok(self.create_inode_with_stat(kind, is_preopened, name, stat)) } /// creates an inode and inserts it given a Kind, does not assume the file exists to @@ -1196,7 +1239,18 @@ impl WasiFs { is_preopened: bool, name: String, ) -> Inode { - let mut stat = __wasi_filestat_t::default(); + let stat = __wasi_filestat_t::default(); + self.create_inode_with_stat(kind, is_preopened, name, stat) + } + + /// creates an inode with the given filestat and insert it. + pub(crate) fn create_inode_with_stat( + &mut self, + kind: Kind, + is_preopened: bool, + name: String, + mut stat: __wasi_filestat_t, + ) -> Inode { stat.st_ino = self.get_next_inode_index(); self.inodes.insert(InodeVal { From 6327fa67c4e65762c24cbc93d8a8be9ef22b72a6 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 26 Aug 2020 15:33:45 -0700 Subject: [PATCH 2/5] Squashed 'tests/wasi-wast/' changes from e1fec5d97..230a0fb78 230a0fb78 Add test opening `/dev/null` on Unix git-subtree-dir: tests/wasi-wast git-subtree-split: 230a0fb78a0eb5252ab90cf2e7c064e3f0bfe2b1 --- README.md | 5 +++++ wasi/snapshot1/unix_open_special_files.wasm | Bin 0 -> 68082 bytes wasi/snapshot1/unix_open_special_files.wast | 5 +++++ wasi/tests/unix_open_special_files.rs | 14 ++++++++++++++ wasi/unstable/unix_open_special_files.wasm | Bin 0 -> 68344 bytes wasi/unstable/unix_open_special_files.wast | 5 +++++ 6 files changed, 29 insertions(+) create mode 100755 wasi/snapshot1/unix_open_special_files.wasm create mode 100644 wasi/snapshot1/unix_open_special_files.wast create mode 100644 wasi/tests/unix_open_special_files.rs create mode 100755 wasi/unstable/unix_open_special_files.wasm create mode 100644 wasi/unstable/unix_open_special_files.wast diff --git a/README.md b/README.md index d71abed2984..42a05578a40 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,8 @@ And here's an example of how to generate these tests: cargo run -- -as # set up the toolchains for all targets cargo run -- -ag # generate the WASI tests for all targets ``` + +## Updating in Wasmer + +Run +`git subtree pull --prefix tests/wasi-wast git@github.com:wasmerio/wasi-tests master --squash` diff --git a/wasi/snapshot1/unix_open_special_files.wasm b/wasi/snapshot1/unix_open_special_files.wasm new file mode 100755 index 0000000000000000000000000000000000000000..68382fe5ec6483d1862235967c1431dfea795e4f GIT binary patch literal 68082 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

0SDiI56FnD#2o&@+hUIy`!pM7fFh$ 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

Gpc(uXS55cCwoIL7 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 F{X06UXFC7@ literal 0 HcmV?d00001 diff --git a/wasi/unstable/unix_open_special_files.wast b/wasi/unstable/unix_open_special_files.wast new file mode 100644 index 00000000000..a26cb3bd70d --- /dev/null +++ b/wasi/unstable/unix_open_special_files.wast @@ -0,0 +1,5 @@ +(wasi_test "unix_open_special_files.wasm" + (map_dirs "/dev:/dev") + (assert_return (i64.const 0)) + (assert_stdout "13\n") +) \ No newline at end of file From ed0acc22beab81ebf168b5c1521726814b12632e Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 26 Aug 2020 15:37:20 -0700 Subject: [PATCH 3/5] Ignore Unix device WASI test on Windows --- tests/ignores.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ignores.txt b/tests/ignores.txt index 7cf7bd43a7b..6b74fdd479d 100644 --- a/tests/ignores.txt +++ b/tests/ignores.txt @@ -67,3 +67,4 @@ wasitests::unstable::file_metadata on windows wasitests::unstable::fseek on windows wasitests::unstable::path_link on windows wasitests::unstable::path_symlink on windows +wasitests::*::unix_open_special_files on windows From 0d1626765026d1ee4cde9db5584f58d6ebb8665d Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 26 Aug 2020 16:12:27 -0700 Subject: [PATCH 4/5] Fix syntax in ignores.txt --- tests/ignores.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/ignores.txt b/tests/ignores.txt index 6b74fdd479d..85b22ac4cfc 100644 --- a/tests/ignores.txt +++ b/tests/ignores.txt @@ -67,4 +67,7 @@ wasitests::unstable::file_metadata on windows wasitests::unstable::fseek on windows wasitests::unstable::path_link on windows wasitests::unstable::path_symlink on windows -wasitests::*::unix_open_special_files on windows + +# This test is meant to only run on Unix +wasitests::unstable::unix_open_special_files on windows +wasitests::snapshot1::unix_open_special_files on windows From e4e41f42e60670dfe3f57be8ae99c41951f81985 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Mon, 31 Aug 2020 13:31:48 -0700 Subject: [PATCH 5/5] Clean up from review --- CHANGELOG.md | 6 ++++++ lib/wasi/src/state/mod.rs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 950d207a918..231a01958a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog ## **[Unreleased]** +- [#1566](https://github.com/wasmerio/wasmer/pull/1566) Add support for opening special Unix files to the WASI FS + +## TODO: 1.0.0-alpha1.0 +- Wasmer refactor lands + +## TODO: 17... - [#1382](https://github.com/wasmerio/wasmer/pull/1382) Refactored test infranstructure (part 2) - [#1380](https://github.com/wasmerio/wasmer/pull/1380) Refactored test infranstructure (part 1) diff --git a/lib/wasi/src/state/mod.rs b/lib/wasi/src/state/mod.rs index 4dba5cd1562..15dca18d118 100644 --- a/lib/wasi/src/state/mod.rs +++ b/lib/wasi/src/state/mod.rs @@ -1232,7 +1232,7 @@ impl WasiFs { Ok(self.create_inode_with_stat(kind, is_preopened, name, stat)) } - /// creates an inode and inserts it given a Kind, does not assume the file exists to + /// Creates an inode and inserts it given a Kind, does not assume the file exists. pub(crate) fn create_inode_with_default_stat( &mut self, kind: Kind, @@ -1243,7 +1243,7 @@ impl WasiFs { self.create_inode_with_stat(kind, is_preopened, name, stat) } - /// creates an inode with the given filestat and insert it. + /// Creates an inode with the given filestat and inserts it. pub(crate) fn create_inode_with_stat( &mut self, kind: Kind,