File tree 3 files changed +26
-17
lines changed
3 files changed +26
-17
lines changed Original file line number Diff line number Diff line change @@ -344,6 +344,9 @@ impl hash::Hash for SocketAddrV6 {
344
344
/// some other type (e.g. a string) just for it to be converted back to
345
345
/// `SocketAddr` in constructor methods is pointless.
346
346
///
347
+ /// Addresses returned by the operating system that are not IP addresses are
348
+ /// silently ignored.
349
+ ///
347
350
/// Some examples:
348
351
///
349
352
/// ```no_run
@@ -448,12 +451,7 @@ impl ToSocketAddrs for (Ipv6Addr, u16) {
448
451
449
452
fn resolve_socket_addr ( s : & str , p : u16 ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
450
453
let ips = lookup_host ( s) ?;
451
- let v: Vec < _ > = ips. map ( |a| {
452
- a. map ( |mut a| {
453
- a. set_port ( p) ;
454
- a
455
- } )
456
- } ) . collect ( ) ?;
454
+ let v: Vec < _ > = ips. map ( |mut a| { a. set_port ( p) ; a } ) . collect ( ) ;
457
455
Ok ( v. into_iter ( ) )
458
456
}
459
457
Original file line number Diff line number Diff line change @@ -98,15 +98,18 @@ pub struct LookupHost(net_imp::LookupHost);
98
98
addresses",
99
99
issue = "27705" ) ]
100
100
impl Iterator for LookupHost {
101
- type Item = io :: Result < SocketAddr > ;
102
- fn next ( & mut self ) -> Option < io :: Result < SocketAddr > > { self . 0 . next ( ) }
101
+ type Item = SocketAddr ;
102
+ fn next ( & mut self ) -> Option < SocketAddr > { self . 0 . next ( ) }
103
103
}
104
104
105
105
/// Resolve the host specified by `host` as a number of `SocketAddr` instances.
106
106
///
107
107
/// This method may perform a DNS query to resolve `host` and may also inspect
108
108
/// system configuration to resolve the specified hostname.
109
109
///
110
+ /// The returned iterator will skip over any unknown addresses returned by the
111
+ /// operating system.
112
+ ///
110
113
/// # Examples
111
114
///
112
115
/// ```no_run
@@ -116,7 +119,7 @@ impl Iterator for LookupHost {
116
119
///
117
120
/// # fn foo() -> std::io::Result<()> {
118
121
/// for host in try!(net::lookup_host("rust-lang.org")) {
119
- /// println!("found address: {}", try!( host) );
122
+ /// println!("found address: {}", host);
120
123
/// }
121
124
/// # Ok(())
122
125
/// # }
Original file line number Diff line number Diff line change @@ -119,14 +119,22 @@ pub struct LookupHost {
119
119
}
120
120
121
121
impl Iterator for LookupHost {
122
- type Item = io:: Result < SocketAddr > ;
123
- fn next ( & mut self ) -> Option < io:: Result < SocketAddr > > {
124
- unsafe {
125
- if self . cur . is_null ( ) { return None }
126
- let ret = sockaddr_to_addr ( mem:: transmute ( ( * self . cur ) . ai_addr ) ,
127
- ( * self . cur ) . ai_addrlen as usize ) ;
128
- self . cur = ( * self . cur ) . ai_next as * mut c:: addrinfo ;
129
- Some ( ret)
122
+ type Item = SocketAddr ;
123
+ fn next ( & mut self ) -> Option < SocketAddr > {
124
+ loop {
125
+ unsafe {
126
+ let cur = match self . cur . as_ref ( ) {
127
+ None => return None ,
128
+ Some ( c) => c,
129
+ } ;
130
+ self . cur = cur. ai_next ;
131
+ match sockaddr_to_addr ( mem:: transmute ( cur. ai_addr ) ,
132
+ cur. ai_addrlen as usize )
133
+ {
134
+ Ok ( addr) => return Some ( addr) ,
135
+ Err ( _) => continue ,
136
+ }
137
+ }
130
138
}
131
139
}
132
140
}
You can’t perform that action at this time.
0 commit comments