about summary refs log tree commit diff
path: root/library/std/src/sys/args/wasip1.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/args/wasip1.rs')
-rw-r--r--library/std/src/sys/args/wasip1.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/library/std/src/sys/args/wasip1.rs b/library/std/src/sys/args/wasip1.rs
new file mode 100644
index 00000000000..72063a87dc9
--- /dev/null
+++ b/library/std/src/sys/args/wasip1.rs
@@ -0,0 +1,26 @@
+#![forbid(unsafe_op_in_unsafe_fn)]
+
+pub use super::common::Args;
+use crate::ffi::{CStr, OsStr, OsString};
+use crate::os::wasi::ffi::OsStrExt;
+
+/// Returns the command line arguments
+pub fn args() -> Args {
+    Args::new(maybe_args().unwrap_or(Vec::new()))
+}
+
+fn maybe_args() -> Option<Vec<OsString>> {
+    unsafe {
+        let (argc, buf_size) = wasi::args_sizes_get().ok()?;
+        let mut argv = Vec::with_capacity(argc);
+        let mut buf = Vec::with_capacity(buf_size);
+        wasi::args_get(argv.as_mut_ptr(), buf.as_mut_ptr()).ok()?;
+        argv.set_len(argc);
+        let mut ret = Vec::with_capacity(argc);
+        for ptr in argv {
+            let s = CStr::from_ptr(ptr.cast());
+            ret.push(OsStr::from_bytes(s.to_bytes()).to_owned());
+        }
+        Some(ret)
+    }
+}