about summary refs log tree commit diff
diff options
context:
space:
mode:
authornewpavlov <newpavlov@gmail.com>2019-08-19 15:18:02 +0300
committernewpavlov <newpavlov@gmail.com>2019-08-19 15:18:02 +0300
commit52d2871e10202279b7039f4ad6d4485093fb99cc (patch)
tree54832aeb79e44737c3f20e7cbb2431fbae93ecbc
parent7a4f0aece871f9850f83db4760a6fea4f595dc8d (diff)
downloadrust-52d2871e10202279b7039f4ad6d4485093fb99cc.tar.gz
rust-52d2871e10202279b7039f4ad6d4485093fb99cc.zip
use wasi::get_environ
-rw-r--r--src/libstd/sys/wasi/args.rs1
-rw-r--r--src/libstd/sys/wasi/os.rs46
2 files changed, 17 insertions, 30 deletions
diff --git a/src/libstd/sys/wasi/args.rs b/src/libstd/sys/wasi/args.rs
index e2fe0548f12..23ab2051bf6 100644
--- a/src/libstd/sys/wasi/args.rs
+++ b/src/libstd/sys/wasi/args.rs
@@ -1,6 +1,5 @@
 use crate::ffi::CStr;
 use crate::io;
-use crate::sys::cvt_wasi;
 use crate::ffi::OsString;
 use crate::marker::PhantomData;
 use crate::os::wasi::ffi::OsStringExt;
diff --git a/src/libstd/sys/wasi/os.rs b/src/libstd/sys/wasi/os.rs
index 091ff3480bf..65c80c838dc 100644
--- a/src/libstd/sys/wasi/os.rs
+++ b/src/libstd/sys/wasi/os.rs
@@ -75,45 +75,33 @@ pub fn current_exe() -> io::Result<PathBuf> {
 }
 
 pub struct Env {
-    iter: vec::IntoIter<(OsString, OsString)>,
+    iter: Vec<Vec<u8>>,
     _dont_send_or_sync_me: PhantomData<*mut ()>,
 }
 
 impl Iterator for Env {
     type Item = (OsString, OsString);
-    fn next(&mut self) -> Option<(OsString, OsString)> { self.iter.next() }
+    fn next(&mut self) -> Option<(OsString, OsString)> {
+        self.iter.next().and_then(|input| {
+            // See src/libstd/sys/unix/os.rs, same as that
+            if input.is_empty() {
+                return None;
+            }
+            let pos = memchr::memchr(b'=', &input[1..]).map(|p| p + 1);
+            pos.map(|p| (
+                OsStringExt::from_vec(input[..p].to_vec()),
+                OsStringExt::from_vec(input[p+1..].to_vec()),
+            ))
+        })
+    }
     fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
 }
 
 
 pub fn env() -> Env {
-    unsafe {
-        let _guard = env_lock();
-        // FIXME: replace with wasi::environ_get
-        let mut environ = libc::environ;
-        let mut result = Vec::new();
-        while environ != ptr::null_mut() && *environ != ptr::null_mut() {
-            if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) {
-                result.push(key_value);
-            }
-            environ = environ.offset(1);
-        }
-        return Env {
-            iter: result.into_iter(),
-            _dont_send_or_sync_me: PhantomData,
-        }
-    }
-
-    // See src/libstd/sys/unix/os.rs, same as that
-    fn parse(input: &[u8]) -> Option<(OsString, OsString)> {
-        if input.is_empty() {
-            return None;
-        }
-        let pos = memchr::memchr(b'=', &input[1..]).map(|p| p + 1);
-        pos.map(|p| (
-            OsStringExt::from_vec(input[..p].to_vec()),
-            OsStringExt::from_vec(input[p+1..].to_vec()),
-        ))
+    Env {
+        iter: wasi::get_environ().unwrap_or(Vec::new()),
+        _dont_send_or_sync_me: PhantomData,
     }
 }