12
12
#[ forbid( deprecated_mode) ] ;
13
13
14
14
use core:: libc;
15
- use core:: oldcomm;
16
15
use core:: prelude:: * ;
16
+ use core:: pipes:: { stream, SharedChan } ;
17
17
use core:: ptr;
18
18
use core:: result;
19
19
use core:: str;
@@ -113,40 +113,40 @@ enum IpGetAddrErr {
113
113
* A `result<~[ip_addr], ip_get_addr_err>` instance that will contain
114
114
* a vector of `ip_addr` results, in the case of success, or an error
115
115
* object in the case of failure
116
- */
116
+ */
117
117
pub fn get_addr ( node : & str , iotask : & iotask )
118
- -> result:: Result < ~[ IpAddr ] , IpGetAddrErr > {
119
- do oldcomm:: listen |output_ch| {
120
- do str:: as_buf ( node) |node_ptr, len| {
121
- unsafe {
122
- log ( debug, fmt ! ( "slice len %?" , len) ) ;
123
- let handle = create_uv_getaddrinfo_t ( ) ;
124
- let handle_ptr = ptr:: addr_of ( & handle) ;
125
- let handle_data = GetAddrData {
126
- output_ch : output_ch
127
- } ;
128
- let handle_data_ptr = ptr:: addr_of ( & handle_data) ;
129
- do interact( iotask) |loop_ptr| {
130
- unsafe {
131
- let result = uv_getaddrinfo (
132
- loop_ptr,
133
- handle_ptr,
134
- get_addr_cb,
135
- node_ptr,
136
- ptr:: null ( ) ,
137
- ptr:: null ( ) ) ;
138
- match result {
139
- 0i32 => {
118
+ -> result:: Result < ~[ IpAddr ] , IpGetAddrErr > {
119
+ let ( output_po, output_ch) = stream ( ) ;
120
+ let output_ch = SharedChan ( output_ch) ;
121
+ do str:: as_buf ( node) |node_ptr, len| {
122
+ unsafe {
123
+ log ( debug, fmt ! ( "slice len %?" , len) ) ;
124
+ let handle = create_uv_getaddrinfo_t ( ) ;
125
+ let handle_ptr = ptr:: addr_of ( & handle) ;
126
+ let handle_data = GetAddrData {
127
+ output_ch : output_ch. clone ( )
128
+ } ;
129
+ let handle_data_ptr = ptr:: addr_of ( & handle_data) ;
130
+ do interact( iotask) |loop_ptr| {
131
+ unsafe {
132
+ let result = uv_getaddrinfo (
133
+ loop_ptr,
134
+ handle_ptr,
135
+ get_addr_cb,
136
+ node_ptr,
137
+ ptr:: null ( ) ,
138
+ ptr:: null ( ) ) ;
139
+ match result {
140
+ 0i32 => {
140
141
set_data_for_req ( handle_ptr, handle_data_ptr) ;
141
- }
142
- _ => {
142
+ }
143
+ _ => {
143
144
output_ch. send ( result:: Err ( GetAddrUnknownError ) ) ;
144
- }
145
145
}
146
146
}
147
- } ;
148
- output_ch . recv ( )
149
- }
147
+ }
148
+ } ;
149
+ output_po . recv ( )
150
150
}
151
151
}
152
152
}
@@ -300,7 +300,7 @@ pub mod v6 {
300
300
}
301
301
302
302
struct GetAddrData {
303
- output_ch : oldcomm :: Chan < result:: Result < ~[ IpAddr ] , IpGetAddrErr > >
303
+ output_ch : SharedChan < result:: Result < ~[ IpAddr ] , IpGetAddrErr > >
304
304
}
305
305
306
306
extern fn get_addr_cb ( handle : * uv_getaddrinfo_t , status : libc:: c_int ,
@@ -309,6 +309,7 @@ extern fn get_addr_cb(handle: *uv_getaddrinfo_t, status: libc::c_int,
309
309
log ( debug, ~"in get_addr_cb") ;
310
310
let handle_data = get_data_for_req ( handle) as
311
311
* GetAddrData ;
312
+ let output_ch = ( * handle_data) . output_ch . clone ( ) ;
312
313
if status == 0i32 {
313
314
if res != ( ptr:: null :: < addrinfo > ( ) ) {
314
315
let mut out_vec = ~[ ] ;
@@ -326,7 +327,7 @@ extern fn get_addr_cb(handle: *uv_getaddrinfo_t, status: libc::c_int,
326
327
else {
327
328
log ( debug, ~"curr_addr is not of family AF_INET or "+
328
329
~" AF_INET6 . Error . ") ;
329
- ( * handle_data ) . output_ch . send (
330
+ output_ch. send (
330
331
result:: Err ( GetAddrUnknownError ) ) ;
331
332
break ;
332
333
} ;
@@ -344,17 +345,17 @@ extern fn get_addr_cb(handle: *uv_getaddrinfo_t, status: libc::c_int,
344
345
}
345
346
log ( debug, fmt ! ( "successful process addrinfo result, len: %?" ,
346
347
vec:: len( out_vec) ) ) ;
347
- ( * handle_data ) . output_ch . send ( result:: Ok ( move out_vec) ) ;
348
+ output_ch. send ( result:: Ok ( move out_vec) ) ;
348
349
}
349
350
else {
350
351
log ( debug, ~"addrinfo pointer is NULL ") ;
351
- ( * handle_data ) . output_ch . send (
352
+ output_ch. send (
352
353
result:: Err ( GetAddrUnknownError ) ) ;
353
354
}
354
355
}
355
356
else {
356
357
log ( debug, ~"status != 0 error in get_addr_cb") ;
357
- ( * handle_data ) . output_ch . send (
358
+ output_ch. send (
358
359
result:: Err ( GetAddrUnknownError ) ) ;
359
360
}
360
361
if res != ( ptr:: null :: < addrinfo > ( ) ) {
0 commit comments