@@ -29,7 +29,8 @@ use rt::tube::Tube;
2929use rt:: task:: SchedHome ;
3030use rt:: uv:: * ;
3131use rt:: uv:: idle:: IdleWatcher ;
32- use rt:: uv:: net:: { UvIpv4SocketAddr , UvIpv6SocketAddr } ;
32+ use rt:: uv:: net:: { UvIpv4SocketAddr , UvIpv6SocketAddr , accum_sockaddrs} ;
33+ use rt:: uv:: addrinfo:: GetAddrInfoRequest ;
3334use unstable:: sync:: Exclusive ;
3435use super :: super :: io:: support:: PathLike ;
3536use libc:: { lseek, off_t, O_CREAT , O_APPEND , O_TRUNC , O_RDWR , O_RDONLY , O_WRONLY ,
@@ -596,6 +597,37 @@ impl IoFactory for UvIoFactory {
596597 assert ! ( !result_cell. is_empty( ) ) ;
597598 return result_cell. take ( ) ;
598599 }
600+
601+ fn get_host_addresses ( & mut self , host : & str ) -> Result < ~[ IpAddr ] , IoError > {
602+ let result_cell = Cell :: new_empty ( ) ;
603+ let result_cell_ptr: * Cell < Result < ~[ IpAddr ] , IoError > > = & result_cell;
604+ let host_ptr: * & str = & host;
605+ let addrinfo_req = GetAddrInfoRequest :: new ( ) ;
606+ let addrinfo_req_cell = Cell :: new ( addrinfo_req) ;
607+ do task:: unkillable { // FIXME(#8674)
608+ let scheduler : ~Scheduler = Local :: take ( ) ;
609+ do scheduler. deschedule_running_task_and_then |_, task | {
610+ let task_cell = Cell :: new ( task) ;
611+ let mut addrinfo_req = addrinfo_req_cell. take ( ) ;
612+ unsafe {
613+ do addrinfo_req. getaddrinfo ( self . uv_loop ( ) ,
614+ Some ( * host_ptr) ,
615+ None , None ) |_, addrinfo, err| {
616+ let res = match err {
617+ None => Ok ( accum_sockaddrs ( addrinfo) . map ( |addr| addr. ip . clone ( ) ) ) ,
618+ Some ( err) => Err ( uv_error_to_io_error ( err) )
619+ } ;
620+ ( * result_cell_ptr) . put_back ( res) ;
621+ let scheduler: ~Scheduler = Local :: take ( ) ;
622+ scheduler. resume_blocked_task_immediately ( task_cell. take ( ) ) ;
623+ }
624+ }
625+ }
626+ }
627+ addrinfo_req. delete ( ) ;
628+ assert ! ( !result_cell. is_empty( ) ) ;
629+ return result_cell. take ( ) ;
630+ }
599631}
600632
601633pub struct UvTcpListener {
0 commit comments