Skip to content

Commit 26b88ca

Browse files
authored
wasi: remove dependency on wasi v0.11 (#502)
Having two `wasi` versions in dependencies causes some annoyances in downstream users, e.g. v0.11 gets show as an "outdated" dependency. The dependency is removed by directly linking `random_get` by following the `wasi` code.
1 parent fd2de2f commit 26b88ca

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ core = { version = "1.0", optional = true, package = "rustc-std-workspace-core"
2121
[target.'cfg(unix)'.dependencies]
2222
libc = { version = "0.2.154", default-features = false }
2323

24-
[target.'cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p1"))'.dependencies]
25-
wasi = { version = "0.11", default-features = false }
26-
2724
[target.'cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2"))'.dependencies]
2825
wasi = { version = "0.13", default-features = false }
2926

src/wasi.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,22 @@ compile_error!(
1313

1414
#[cfg(target_env = "p1")]
1515
pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
16-
unsafe { wasi::random_get(dest.as_mut_ptr().cast::<u8>(), dest.len()) }
17-
.map_err(|e| Error::from_os_error(e.raw().into()))
16+
// This linking is vendored from the wasi crate:
17+
// https://docs.rs/wasi/0.11.0+wasi-snapshot-preview1/src/wasi/lib_generated.rs.html#2344-2350
18+
#[link(wasm_import_module = "wasi_snapshot_preview1")]
19+
extern "C" {
20+
fn random_get(arg0: i32, arg1: i32) -> i32;
21+
}
22+
23+
// Based on the wasi code:
24+
// https://docs.rs/wasi/0.11.0+wasi-snapshot-preview1/src/wasi/lib_generated.rs.html#2046-2062
25+
// Note that size of an allocated object can not be bigger than isize::MAX bytes.
26+
// WASI 0.1 supports only 32-bit WASM, so casting length to `i32` is safe.
27+
let ret = unsafe { random_get(dest.as_mut_ptr() as i32, dest.len() as i32) };
28+
match ret {
29+
0 => Ok(()),
30+
_ => Err(Error::from_os_error(ret as u32)),
31+
}
1832
}
1933

2034
#[cfg(target_env = "p2")]

0 commit comments

Comments
 (0)