@@ -21,11 +21,24 @@ pub unsafe fn env_lock() -> impl Any {
21
21
}
22
22
23
23
pub fn errno ( ) -> i32 {
24
- 0
24
+ extern {
25
+ #[ thread_local]
26
+ static errno: libc:: c_int ;
27
+ }
28
+
29
+ unsafe { errno as i32 }
25
30
}
26
31
27
32
pub fn error_string ( errno : i32 ) -> String {
28
- wasi:: error_string ( errno)
33
+ let mut buf = [ 0 as libc:: c_char ; 1024 ] ;
34
+
35
+ let p = buf. as_mut_ptr ( ) ;
36
+ unsafe {
37
+ if libc:: strerror_r ( errno as libc:: c_int , p, buf. len ( ) ) < 0 {
38
+ panic ! ( "strerror_r failure" ) ;
39
+ }
40
+ str:: from_utf8 ( CStr :: from_ptr ( p) . to_bytes ( ) ) . unwrap ( ) . to_owned ( )
41
+ }
29
42
}
30
43
31
44
pub fn getcwd ( ) -> io:: Result < PathBuf > {
@@ -73,35 +86,45 @@ impl StdError for JoinPathsError {
73
86
pub fn current_exe ( ) -> io:: Result < PathBuf > {
74
87
unsupported ( )
75
88
}
76
-
77
89
pub struct Env {
78
- iter : vec:: IntoIter < Vec < u8 > > ,
90
+ iter : vec:: IntoIter < ( OsString , OsString ) > ,
79
91
_dont_send_or_sync_me : PhantomData < * mut ( ) > ,
80
92
}
81
93
82
94
impl Iterator for Env {
83
95
type Item = ( OsString , OsString ) ;
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
- }
96
+ fn next ( & mut self ) -> Option < ( OsString , OsString ) > { self . iter . next ( ) }
97
97
fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . iter . size_hint ( ) }
98
98
}
99
99
100
100
101
101
pub fn env ( ) -> Env {
102
- Env {
103
- iter : wasi:: get_environ ( ) . unwrap_or ( Vec :: new ( ) ) . into_iter ( ) ,
104
- _dont_send_or_sync_me : PhantomData ,
102
+ unsafe {
103
+ let _guard = env_lock ( ) ;
104
+ let mut environ = libc:: environ;
105
+ let mut result = Vec :: new ( ) ;
106
+ while environ != ptr:: null_mut ( ) && * environ != ptr:: null_mut ( ) {
107
+ if let Some ( key_value) = parse ( CStr :: from_ptr ( * environ) . to_bytes ( ) ) {
108
+ result. push ( key_value) ;
109
+ }
110
+ environ = environ. offset ( 1 ) ;
111
+ }
112
+ return Env {
113
+ iter : result. into_iter ( ) ,
114
+ _dont_send_or_sync_me : PhantomData ,
115
+ }
116
+ }
117
+
118
+ // See src/libstd/sys/unix/os.rs, same as that
119
+ fn parse ( input : & [ u8 ] ) -> Option < ( OsString , OsString ) > {
120
+ if input. is_empty ( ) {
121
+ return None ;
122
+ }
123
+ let pos = memchr:: memchr ( b'=' , & input[ 1 ..] ) . map ( |p| p + 1 ) ;
124
+ pos. map ( |p| (
125
+ OsStringExt :: from_vec ( input[ ..p] . to_vec ( ) ) ,
126
+ OsStringExt :: from_vec ( input[ p+1 ..] . to_vec ( ) ) ,
127
+ ) )
105
128
}
106
129
}
107
130
@@ -147,7 +170,9 @@ pub fn home_dir() -> Option<PathBuf> {
147
170
}
148
171
149
172
pub fn exit ( code : i32 ) -> ! {
150
- unsafe { wasi:: proc_exit ( code as u32 ) }
173
+ unsafe {
174
+ libc:: exit ( code)
175
+ }
151
176
}
152
177
153
178
pub fn getpid ( ) -> u32 {
0 commit comments