@@ -41,7 +41,6 @@ export walk_dir;
41
41
export as_c_charp, fill_charp_buf;
42
42
43
43
extern mod rustrt {
44
- fn rust_env_pairs ( ) -> ~[ ~str ] ;
45
44
fn rust_getcwd ( ) -> ~str ;
46
45
fn rust_path_is_dir ( path : * libc:: c_char ) -> c_int ;
47
46
fn rust_path_exists ( path : * libc:: c_char ) -> c_int ;
@@ -52,16 +51,6 @@ extern mod rustrt {
52
51
}
53
52
54
53
55
- fn env ( ) -> ~[ ( ~str , ~str ) ] {
56
- let mut pairs = ~[ ] ;
57
- for vec:: each( rustrt:: rust_env_pairs( ) ) |p| {
58
- let vs = str:: splitn_char ( p, '=' , 1 u) ;
59
- assert vec:: len ( vs) == 2 u;
60
- vec:: push ( pairs, ( vs[ 0 ] , vs[ 1 ] ) ) ;
61
- }
62
- ret pairs;
63
- }
64
-
65
54
const tmpbuf_sz : uint = 1000 u;
66
55
67
56
fn as_c_charp < T > ( s : ~str , f : fn ( * c_char ) -> T ) -> T {
@@ -130,19 +119,25 @@ fn setenv(n: ~str, v: ~str) {
130
119
global_env:: setenv ( n, v)
131
120
}
132
121
122
+ fn env ( ) -> ~[ ( ~str , ~str ) ] {
123
+ global_env:: env ( )
124
+ }
125
+
133
126
mod global_env {
134
127
//! Internal module for serializing access to getenv/setenv
135
128
136
129
export getenv;
137
130
export setenv;
131
+ export env;
138
132
139
133
extern mod rustrt {
140
134
fn rust_global_env_chan_ptr ( ) -> * libc:: uintptr_t ;
141
135
}
142
136
143
137
enum msg {
144
138
msg_getenv( ~str , comm:: chan < option < ~str > > ) ,
145
- msg_setenv( ~str , ~str , comm:: chan < ( ) > )
139
+ msg_setenv( ~str , ~str , comm:: chan < ( ) > ) ,
140
+ msg_env( comm:: chan < ~[ ( ~str , ~str ) ] > )
146
141
}
147
142
148
143
fn getenv ( n : ~str ) -> option < ~str > {
@@ -159,6 +154,13 @@ mod global_env {
159
154
comm:: recv ( po)
160
155
}
161
156
157
+ fn env ( ) -> ~[ ( ~str , ~str ) ] {
158
+ let env_ch = get_global_env_chan ( ) ;
159
+ let po = comm:: port ( ) ;
160
+ comm:: send ( env_ch, msg_env ( comm:: chan ( po) ) ) ;
161
+ comm:: recv ( po)
162
+ }
163
+
162
164
fn get_global_env_chan ( ) -> comm:: chan < msg > {
163
165
let global_ptr = rustrt:: rust_global_env_chan_ptr ( ) ;
164
166
let task_build_fn = || {
@@ -183,6 +185,9 @@ mod global_env {
183
185
either:: left ( msg_setenv ( n, v, resp_ch) ) {
184
186
comm:: send ( resp_ch, impl:: setenv ( n, v) )
185
187
}
188
+ either:: left ( msg_env ( resp_ch) ) {
189
+ comm:: send ( resp_ch, impl:: env ( ) )
190
+ }
186
191
either:: right ( _) {
187
192
break ;
188
193
}
@@ -193,6 +198,19 @@ mod global_env {
193
198
}
194
199
195
200
mod impl {
201
+ extern mod rustrt {
202
+ fn rust_env_pairs ( ) -> ~[ ~str ] ;
203
+ }
204
+
205
+ fn env ( ) -> ~[ ( ~str , ~str ) ] {
206
+ let mut pairs = ~[ ] ;
207
+ for vec:: each( rustrt:: rust_env_pairs( ) ) |p| {
208
+ let vs = str:: splitn_char ( p, '=' , 1 u) ;
209
+ assert vec:: len ( vs) == 2 u;
210
+ vec:: push ( pairs, ( vs[ 0 ] , vs[ 1 ] ) ) ;
211
+ }
212
+ ret pairs;
213
+ }
196
214
197
215
#[ cfg( unix) ]
198
216
fn getenv ( n : ~str ) -> option < ~str > {
0 commit comments