3 use crate::sys::cvt_wasi;
4 use crate::ffi::OsString;
5 use crate::marker::PhantomData;
6 use crate::os::wasi::ffi::OsStringExt;
9 pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
12 pub unsafe fn cleanup() {
16 iter: vec::IntoIter<OsString>,
17 _dont_send_or_sync_me: PhantomData<*mut ()>,
20 /// Returns the command line arguments
21 pub fn args() -> Args {
22 maybe_args().unwrap_or_else(|_| {
24 iter: Vec::new().into_iter(),
25 _dont_send_or_sync_me: PhantomData
30 fn maybe_args() -> io::Result<Args> {
32 let (mut argc, mut argv_buf_size) = (0, 0);
33 cvt_wasi(libc::__wasi_args_sizes_get(&mut argc, &mut argv_buf_size))?;
35 let mut argc = vec![core::ptr::null_mut::<libc::c_char>(); argc];
36 let mut argv_buf = vec![0; argv_buf_size];
37 cvt_wasi(libc::__wasi_args_get(argc.as_mut_ptr(), argv_buf.as_mut_ptr()))?;
39 let args = argc.into_iter()
40 .map(|ptr| CStr::from_ptr(ptr).to_bytes().to_vec())
41 .map(|bytes| OsString::from_vec(bytes))
44 iter: args.into_iter(),
45 _dont_send_or_sync_me: PhantomData,
51 pub fn inner_debug(&self) -> &[OsString] {
56 impl Iterator for Args {
58 fn next(&mut self) -> Option<OsString> {
61 fn size_hint(&self) -> (usize, Option<usize>) {
66 impl ExactSizeIterator for Args {
67 fn len(&self) -> usize {
72 impl DoubleEndedIterator for Args {
73 fn next_back(&mut self) -> Option<OsString> {