Skip to main content

c_ares/
types.rs

1/// The platform-specific file descriptor / socket type.  That is, either a `RawFd` or a
2/// `RawSocket`.
3pub type Socket = c_ares_sys::ares_socket_t;
4
5/// An invalid socket / file descriptor.  Use this to represent 'no action' when calling
6/// `process_fd()` on a channel.
7pub const SOCKET_BAD: Socket = c_ares_sys::ARES_SOCKET_BAD;
8
9/// Address families.
10#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash, PartialOrd, Ord)]
11pub enum AddressFamily {
12    /// IPv4.
13    INET = c_types::AF_INET as isize,
14
15    /// IPv6.
16    INET6 = c_types::AF_INET6 as isize,
17
18    /// Unspecified.
19    UNSPEC = c_types::AF_UNSPEC as isize,
20}
21
22// See arpa/nameser.h
23#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash, PartialOrd, Ord)]
24#[allow(clippy::upper_case_acronyms)]
25pub enum QueryType {
26    A = 1,
27    NS = 2,
28    CNAME = 5,
29    SOA = 6,
30    PTR = 12,
31    MX = 15,
32    TXT = 16,
33    AAAA = 28,
34    SRV = 33,
35    NAPTR = 35,
36    URI = 256,
37    CAA = 257,
38}
39
40// See arpa/nameser.h
41#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash, PartialOrd, Ord)]
42pub enum DnsClass {
43    IN = 1,
44}
45
46/// Event system to use for the c-ares built-in event thread.
47///
48/// Passed to [`Options::set_event_thread()`](crate::Options::set_event_thread) to select which I/O
49/// backend the internal event loop should use.  In most cases [`Default`](EventSys::Default) is the
50/// right choice.
51///
52/// Available since c-ares 1.26.0.
53#[cfg(cares1_26)]
54#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
55pub enum EventSys {
56    /// Let c-ares pick the best available backend.
57    Default,
58    /// Win32 IOCP / AFD_POLL.
59    Win32,
60    /// Linux `epoll`.
61    Epoll,
62    /// BSD / macOS `kqueue`.
63    Kqueue,
64    /// POSIX `poll()`.
65    Poll,
66    /// POSIX `select()` — last-resort fallback.
67    Select,
68}
69
70#[cfg(cares1_26)]
71impl From<EventSys> for c_ares_sys::ares_evsys_t {
72    fn from(val: EventSys) -> Self {
73        match val {
74            EventSys::Default => c_ares_sys::ares_evsys_t::ARES_EVSYS_DEFAULT,
75            EventSys::Win32 => c_ares_sys::ares_evsys_t::ARES_EVSYS_WIN32,
76            EventSys::Epoll => c_ares_sys::ares_evsys_t::ARES_EVSYS_EPOLL,
77            EventSys::Kqueue => c_ares_sys::ares_evsys_t::ARES_EVSYS_KQUEUE,
78            EventSys::Poll => c_ares_sys::ares_evsys_t::ARES_EVSYS_POLL,
79            EventSys::Select => c_ares_sys::ares_evsys_t::ARES_EVSYS_SELECT,
80        }
81    }
82}
83
84pub const MAX_ADDRTTLS: usize = 32;
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89    use std::collections::HashSet;
90
91    #[test]
92    fn socket_bad_is_defined() {
93        let bad = SOCKET_BAD;
94        // Confirm we can use it (avoids a no-op binding warning).
95        assert_eq!(bad, SOCKET_BAD);
96    }
97
98    #[test]
99    fn address_family_values() {
100        assert_ne!(AddressFamily::INET as isize, AddressFamily::INET6 as isize);
101        assert_ne!(AddressFamily::INET as isize, AddressFamily::UNSPEC as isize);
102        assert_ne!(
103            AddressFamily::INET6 as isize,
104            AddressFamily::UNSPEC as isize
105        );
106    }
107
108    #[test]
109    #[allow(clippy::clone_on_copy)]
110    fn address_family_clone_copy() {
111        let af = AddressFamily::INET;
112        let cloned = af.clone();
113        let copied = af;
114        assert_eq!(af, cloned);
115        assert_eq!(af, copied);
116    }
117
118    #[test]
119    fn address_family_debug() {
120        let af = AddressFamily::INET6;
121        let debug = format!("{af:?}");
122        assert!(debug.contains("INET6"));
123    }
124
125    #[test]
126    fn address_family_eq_hash() {
127        let mut set = HashSet::new();
128        set.insert(AddressFamily::INET);
129        set.insert(AddressFamily::INET6);
130        set.insert(AddressFamily::INET);
131        assert_eq!(set.len(), 2);
132    }
133
134    #[test]
135    #[allow(clippy::clone_on_copy)]
136    fn address_family_ord() {
137        let families = [
138            AddressFamily::INET,
139            AddressFamily::INET6,
140            AddressFamily::UNSPEC,
141        ];
142        let mut sorted = families.clone();
143        sorted.sort();
144        assert_eq!(sorted.len(), 3);
145    }
146
147    #[cfg(cares1_26)]
148    #[test]
149    fn event_sys_variants() {
150        // Exercise all variants through the From conversion.
151        let variants = [
152            EventSys::Default,
153            EventSys::Win32,
154            EventSys::Epoll,
155            EventSys::Kqueue,
156            EventSys::Poll,
157            EventSys::Select,
158        ];
159        for variant in variants {
160            let _: c_ares_sys::ares_evsys_t = variant.into();
161        }
162    }
163}