@@ -75,45 +75,33 @@ pub fn current_exe() -> io::Result<PathBuf> {
75
75
}
76
76
77
77
pub struct Env {
78
- iter : vec :: IntoIter < ( OsString , OsString ) > ,
78
+ iter : Vec < Vec < u8 > > ,
79
79
_dont_send_or_sync_me : PhantomData < * mut ( ) > ,
80
80
}
81
81
82
82
impl Iterator for Env {
83
83
type Item = ( OsString , OsString ) ;
84
- fn next ( & mut self ) -> Option < ( OsString , OsString ) > { self . iter . next ( ) }
84
+ fn next ( & mut self ) -> Option < ( OsString , OsString ) > {
85
+ self . iter . next ( ) . and_then ( |input| {
86
+ // See src/libstd/sys/unix/os.rs, same as that
87
+ if input. is_empty ( ) {
88
+ return None ;
89
+ }
90
+ let pos = memchr:: memchr ( b'=' , & input[ 1 ..] ) . map ( |p| p + 1 ) ;
91
+ pos. map ( |p| (
92
+ OsStringExt :: from_vec ( input[ ..p] . to_vec ( ) ) ,
93
+ OsStringExt :: from_vec ( input[ p+1 ..] . to_vec ( ) ) ,
94
+ ) )
95
+ } )
96
+ }
85
97
fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . iter . size_hint ( ) }
86
98
}
87
99
88
100
89
101
pub fn env ( ) -> Env {
90
- unsafe {
91
- let _guard = env_lock ( ) ;
92
- // FIXME: replace with wasi::environ_get
93
- let mut environ = libc:: environ;
94
- let mut result = Vec :: new ( ) ;
95
- while environ != ptr:: null_mut ( ) && * environ != ptr:: null_mut ( ) {
96
- if let Some ( key_value) = parse ( CStr :: from_ptr ( * environ) . to_bytes ( ) ) {
97
- result. push ( key_value) ;
98
- }
99
- environ = environ. offset ( 1 ) ;
100
- }
101
- return Env {
102
- iter : result. into_iter ( ) ,
103
- _dont_send_or_sync_me : PhantomData ,
104
- }
105
- }
106
-
107
- // See src/libstd/sys/unix/os.rs, same as that
108
- fn parse ( input : & [ u8 ] ) -> Option < ( OsString , OsString ) > {
109
- if input. is_empty ( ) {
110
- return None ;
111
- }
112
- let pos = memchr:: memchr ( b'=' , & input[ 1 ..] ) . map ( |p| p + 1 ) ;
113
- pos. map ( |p| (
114
- OsStringExt :: from_vec ( input[ ..p] . to_vec ( ) ) ,
115
- OsStringExt :: from_vec ( input[ p+1 ..] . to_vec ( ) ) ,
116
- ) )
102
+ Env {
103
+ iter : wasi:: get_environ ( ) . unwrap_or ( Vec :: new ( ) ) ,
104
+ _dont_send_or_sync_me : PhantomData ,
117
105
}
118
106
}
119
107
0 commit comments