changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate rust/lib/net/src/engine/dns/resolver.rs

changeset 698: 96958d3eb5b0
parent: 3d78bed56188
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
1
 use crate::Result;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
3
 use hickory_resolver::{
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
4
   config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts},
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
5
   error::ResolveErrorKind,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
6
   TokioAsyncResolver,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
7
 };
189
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
8
 use std::{
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
9
   future::Future,
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
10
   net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4},
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
11
 };
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
13
 pub trait Lookup: Send + 'static {
189
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
14
   fn lookup(
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
15
     &self,
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
16
     ip: IpAddr,
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
17
   ) -> impl Future<Output = Option<String>> + Send + '_;
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
18
 }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
19
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
20
 #[repr(transparent)]
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
21
 pub struct Resolver(pub TokioAsyncResolver);
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
22
 unsafe impl Send for Resolver {}
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
23
 impl Resolver {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
24
   pub async fn new(dns_server: &Option<Ipv4Addr>) -> Result<Self> {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
25
     let resolver = match dns_server {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
26
       Some(dns_server_address) => {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
27
         let mut config = ResolverConfig::new();
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
28
         let options = ResolverOpts::default();
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
29
         let socket = SocketAddr::V4(SocketAddrV4::new(*dns_server_address, 53));
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
30
         let nameserver_config = NameServerConfig {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
31
           socket_addr: socket,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
32
           protocol: Protocol::Udp,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
33
           tls_dns_name: None,
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
34
           trust_negative_responses: false,
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
35
           bind_addr: None,
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
36
         };
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
37
         config.add_name_server(nameserver_config);
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
38
         TokioAsyncResolver::tokio(config, options)
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
39
       }
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
40
       None => TokioAsyncResolver::tokio_from_system_conf().unwrap(),
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
41
     };
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
42
     Ok(Self(resolver))
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
43
   }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
44
 }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
45
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
46
 impl Lookup for Resolver {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
47
   async fn lookup(&self, ip: IpAddr) -> Option<String> {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
48
     let lookup_future = self.0.reverse_lookup(ip);
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
49
     match lookup_future.await {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
50
       Ok(names) => {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
51
         // Take the first result and convert it to a string
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents: 149
diff changeset
52
         names.into_iter().next().map(|x| x.to_string())
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
53
       }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
54
       Err(e) => match e.kind() {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
55
         // If the IP is not associated with a hostname, store the IP
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
56
         // so that we don't retry indefinitely
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
57
         ResolveErrorKind::NoRecordsFound { .. } => Some(ip.to_string()),
189
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
58
         _ => None,
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
59
       },
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
60
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
61
   }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
62
 }