@@ -20,7 +20,13 @@ use tokio::net::lookup_host;
20
20
#[ cfg( feature = "trust-dns" ) ]
21
21
use tokio:: task:: JoinHandle ;
22
22
#[ cfg( feature = "trust-dns" ) ]
23
- use trust_dns_resolver:: { config:: ResolverConfig , TokioAsyncResolver } ;
23
+ use trust_dns_resolver:: config:: ResolverConfig ;
24
+
25
+ #[ cfg( feature = "trust-dns" ) ]
26
+ use crate :: net:: ConnectOpts ;
27
+
28
+ #[ cfg( feature = "trust-dns" ) ]
29
+ use super :: trust_dns_resolver:: DnsResolver as TrustDnsResolver ;
24
30
25
31
/// Abstract DNS resolver
26
32
#[ async_trait]
@@ -31,8 +37,8 @@ pub trait DnsResolve {
31
37
32
38
#[ cfg( feature = "trust-dns" ) ]
33
39
pub struct TrustDnsSystemResolver {
34
- resolver : ArcSwap < TokioAsyncResolver > ,
35
- ipv6_first : bool ,
40
+ resolver : ArcSwap < TrustDnsResolver > ,
41
+ connect_opts : ConnectOpts ,
36
42
}
37
43
38
44
/// Collections of DNS resolver
@@ -44,11 +50,12 @@ pub enum DnsResolver {
44
50
#[ cfg( feature = "trust-dns" ) ]
45
51
TrustDnsSystem {
46
52
inner : Arc < TrustDnsSystemResolver > ,
53
+ #[ cfg( all( feature = "trust-dns" , unix, not( target_os = "android" ) ) ) ]
47
54
abortable : JoinHandle < ( ) > ,
48
55
} ,
49
56
/// Trust-DNS resolver
50
57
#[ cfg( feature = "trust-dns" ) ]
51
- TrustDns ( TokioAsyncResolver ) ,
58
+ TrustDns ( TrustDnsResolver ) ,
52
59
/// Customized Resolver
53
60
Custom ( Box < dyn DnsResolve + Send + Sync > ) ,
54
61
}
@@ -75,6 +82,7 @@ impl Debug for DnsResolver {
75
82
#[ cfg( feature = "trust-dns" ) ]
76
83
impl Drop for DnsResolver {
77
84
fn drop ( & mut self ) {
85
+ #[ cfg( all( feature = "trust-dns" , unix, not( target_os = "android" ) ) ) ]
78
86
if let DnsResolver :: TrustDnsSystem { ref abortable, .. } = * self {
79
87
abortable. abort ( ) ;
80
88
}
@@ -187,7 +195,7 @@ async fn trust_dns_notify_update_dns(resolver: Arc<TrustDnsSystemResolver>) -> n
187
195
// Update once for all those Modify events
188
196
time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
189
197
190
- match create_resolver ( None , resolver. ipv6_first ) . await {
198
+ match create_resolver ( None , resolver. connect_opts . clone ( ) ) . await {
191
199
Ok ( r) => {
192
200
debug ! ( "auto-reload {DNS_RESOLV_FILE_PATH}" ) ;
193
201
@@ -208,12 +216,6 @@ async fn trust_dns_notify_update_dns(resolver: Arc<TrustDnsSystemResolver>) -> n
208
216
Ok ( ( ) )
209
217
}
210
218
211
- #[ cfg( all( feature = "trust-dns" , any( not( unix) , target_os = "android" ) ) ) ]
212
- async fn trust_dns_notify_update_dns ( resolver : Arc < TrustDnsSystemResolver > ) -> notify:: Result < ( ) > {
213
- let _ = resolver. ipv6_first ; // use it for supressing warning
214
- futures:: future:: pending ( ) . await
215
- }
216
-
217
219
impl DnsResolver {
218
220
/// Use system DNS resolver. Tokio will call `getaddrinfo` in blocking pool.
219
221
pub fn system_resolver ( ) -> DnsResolver {
@@ -224,33 +226,39 @@ impl DnsResolver {
224
226
///
225
227
/// On *nix system, it will try to read configurations from `/etc/resolv.conf`.
226
228
#[ cfg( feature = "trust-dns" ) ]
227
- pub async fn trust_dns_system_resolver ( ipv6_first : bool ) -> io:: Result < DnsResolver > {
229
+ pub async fn trust_dns_system_resolver ( connect_opts : ConnectOpts ) -> io:: Result < DnsResolver > {
228
230
use super :: trust_dns_resolver:: create_resolver;
229
231
230
- let resolver = create_resolver ( None , ipv6_first ) . await ?;
232
+ let resolver = create_resolver ( None , connect_opts . clone ( ) ) . await ?;
231
233
232
234
let inner = Arc :: new ( TrustDnsSystemResolver {
233
235
resolver : ArcSwap :: from ( Arc :: new ( resolver) ) ,
234
- ipv6_first ,
236
+ connect_opts ,
235
237
} ) ;
236
238
237
- let abortable = {
238
- let inner = inner. clone ( ) ;
239
- tokio:: spawn ( async {
240
- if let Err ( err) = trust_dns_notify_update_dns ( inner) . await {
241
- error ! ( "failed to watch DNS system configuration changes, error: {}" , err) ;
242
- }
243
- } )
244
- } ;
239
+ cfg_if ! {
240
+ if #[ cfg( all( feature = "trust-dns" , unix, not( target_os = "android" ) ) ) ] {
241
+ let abortable = {
242
+ let inner = inner. clone( ) ;
243
+ tokio:: spawn( async {
244
+ if let Err ( err) = trust_dns_notify_update_dns( inner) . await {
245
+ error!( "failed to watch DNS system configuration changes, error: {}" , err) ;
246
+ }
247
+ } )
248
+ } ;
245
249
246
- Ok ( DnsResolver :: TrustDnsSystem { inner, abortable } )
250
+ Ok ( DnsResolver :: TrustDnsSystem { inner, abortable } )
251
+ } else {
252
+ Ok ( DnsResolver :: TrustDnsSystem { inner } )
253
+ }
254
+ }
247
255
}
248
256
249
257
/// Use trust-dns DNS resolver (with DNS cache)
250
258
#[ cfg( feature = "trust-dns" ) ]
251
- pub async fn trust_dns_resolver ( dns : ResolverConfig , ipv6_first : bool ) -> io:: Result < DnsResolver > {
259
+ pub async fn trust_dns_resolver ( dns : ResolverConfig , connect_opts : ConnectOpts ) -> io:: Result < DnsResolver > {
252
260
use super :: trust_dns_resolver:: create_resolver;
253
- Ok ( DnsResolver :: TrustDns ( create_resolver ( Some ( dns) , ipv6_first ) . await ?) )
261
+ Ok ( DnsResolver :: TrustDns ( create_resolver ( Some ( dns) , connect_opts ) . await ?) )
254
262
}
255
263
256
264
/// Custom DNS resolver
0 commit comments