@@ -20,7 +20,13 @@ use tokio::net::lookup_host;
2020#[ cfg( feature = "trust-dns" ) ]
2121use tokio:: task:: JoinHandle ;
2222#[ 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 ;
2430
2531/// Abstract DNS resolver
2632#[ async_trait]
@@ -31,8 +37,8 @@ pub trait DnsResolve {
3137
3238#[ cfg( feature = "trust-dns" ) ]
3339pub struct TrustDnsSystemResolver {
34- resolver : ArcSwap < TokioAsyncResolver > ,
35- ipv6_first : bool ,
40+ resolver : ArcSwap < TrustDnsResolver > ,
41+ connect_opts : ConnectOpts ,
3642}
3743
3844/// Collections of DNS resolver
@@ -44,11 +50,12 @@ pub enum DnsResolver {
4450 #[ cfg( feature = "trust-dns" ) ]
4551 TrustDnsSystem {
4652 inner : Arc < TrustDnsSystemResolver > ,
53+ #[ cfg( all( feature = "trust-dns" , unix, not( target_os = "android" ) ) ) ]
4754 abortable : JoinHandle < ( ) > ,
4855 } ,
4956 /// Trust-DNS resolver
5057 #[ cfg( feature = "trust-dns" ) ]
51- TrustDns ( TokioAsyncResolver ) ,
58+ TrustDns ( TrustDnsResolver ) ,
5259 /// Customized Resolver
5360 Custom ( Box < dyn DnsResolve + Send + Sync > ) ,
5461}
@@ -75,6 +82,7 @@ impl Debug for DnsResolver {
7582#[ cfg( feature = "trust-dns" ) ]
7683impl Drop for DnsResolver {
7784 fn drop ( & mut self ) {
85+ #[ cfg( all( feature = "trust-dns" , unix, not( target_os = "android" ) ) ) ]
7886 if let DnsResolver :: TrustDnsSystem { ref abortable, .. } = * self {
7987 abortable. abort ( ) ;
8088 }
@@ -187,7 +195,7 @@ async fn trust_dns_notify_update_dns(resolver: Arc<TrustDnsSystemResolver>) -> n
187195 // Update once for all those Modify events
188196 time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
189197
190- match create_resolver ( None , resolver. ipv6_first ) . await {
198+ match create_resolver ( None , resolver. connect_opts . clone ( ) ) . await {
191199 Ok ( r) => {
192200 debug ! ( "auto-reload {DNS_RESOLV_FILE_PATH}" ) ;
193201
@@ -208,12 +216,6 @@ async fn trust_dns_notify_update_dns(resolver: Arc<TrustDnsSystemResolver>) -> n
208216 Ok ( ( ) )
209217}
210218
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-
217219impl DnsResolver {
218220 /// Use system DNS resolver. Tokio will call `getaddrinfo` in blocking pool.
219221 pub fn system_resolver ( ) -> DnsResolver {
@@ -224,33 +226,39 @@ impl DnsResolver {
224226 ///
225227 /// On *nix system, it will try to read configurations from `/etc/resolv.conf`.
226228 #[ 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 > {
228230 use super :: trust_dns_resolver:: create_resolver;
229231
230- let resolver = create_resolver ( None , ipv6_first ) . await ?;
232+ let resolver = create_resolver ( None , connect_opts . clone ( ) ) . await ?;
231233
232234 let inner = Arc :: new ( TrustDnsSystemResolver {
233235 resolver : ArcSwap :: from ( Arc :: new ( resolver) ) ,
234- ipv6_first ,
236+ connect_opts ,
235237 } ) ;
236238
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+ } ;
245249
246- Ok ( DnsResolver :: TrustDnsSystem { inner, abortable } )
250+ Ok ( DnsResolver :: TrustDnsSystem { inner, abortable } )
251+ } else {
252+ Ok ( DnsResolver :: TrustDnsSystem { inner } )
253+ }
254+ }
247255 }
248256
249257 /// Use trust-dns DNS resolver (with DNS cache)
250258 #[ 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 > {
252260 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 ?) )
254262 }
255263
256264 /// Custom DNS resolver
0 commit comments