Skip to main content

c_ares/
flags.rs

1use bitflags::bitflags;
2bitflags!(
3    /// Flags that may be passed when initializing a `Channel`.
4    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
5    pub struct Flags: i32 {
6        /// Always use TCP queries (the "virtual circuit") instead of UDP queries.  Normally, TCP
7        /// is only used if a UDP query yields a truncated result.
8        const USEVC = c_ares_sys::ARES_FLAG_USEVC;
9
10        /// Only query the first server in the list of servers to query.
11        const PRIMARY = c_ares_sys::ARES_FLAG_PRIMARY;
12
13        /// If a truncated response to a UDP query is received, do not fall back to TCP; simply
14        /// continue on with the truncated response.
15        const IGNTC = c_ares_sys::ARES_FLAG_IGNTC;
16
17        /// Do not set the "recursion desired" bit on outgoing queries, so that the name server
18        /// being contacted will not try to fetch the answer from other servers if it doesn't know
19        /// the answer locally.
20        const NORECURSE = c_ares_sys::ARES_FLAG_NORECURSE;
21
22        /// Do not close communications sockets when the number of active queries drops to zero.
23        const STAYOPEN = c_ares_sys::ARES_FLAG_STAYOPEN;
24
25        /// Do not use the default search domains; only query hostnames as-is or as aliases.
26        const NOSEARCH = c_ares_sys::ARES_FLAG_NOSEARCH;
27
28        /// Do not honor the HOSTALIASES environment variable, which normally specifies a file of
29        /// hostname translations.
30        const NOALIASES = c_ares_sys::ARES_FLAG_NOALIASES;
31
32        /// Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED response code or
33        /// responses whose questions don't match the questions in the request. Primarily useful
34        /// for writing clients which might be used to test or debug name servers.
35        const NOCHECKRESP = c_ares_sys::ARES_FLAG_NOCHECKRESP;
36
37        /// Include an EDNS pseudo-resource record (RFC 2671) in generated requests.  As of c-ares
38        /// v1.22, this is on by default if flags are otherwise not set.
39        const EDNS = c_ares_sys::ARES_FLAG_EDNS;
40
41        /// Do not attempt to add a default local named server if there are no other servers
42        /// available.  Instead, fail initialization with ARES_ENOSERVER.
43        const NO_DFLT_SVR = c_ares_sys::ARES_FLAG_NO_DFLT_SVR;
44
45        /// Enable support for DNS 0x20 as per
46        /// https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 which adds
47        /// additional entropy to the request by randomizing the case of the query name.
48        const DNS_0X20 = c_ares_sys::ARES_FLAG_DNS0x20;
49    }
50);
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55    use std::collections::HashSet;
56
57    #[test]
58    fn empty() {
59        let flags = Flags::empty();
60        assert!(flags.is_empty());
61    }
62
63    #[test]
64    fn single() {
65        let flags = Flags::USEVC;
66        assert!(flags.contains(Flags::USEVC));
67        assert!(!flags.contains(Flags::PRIMARY));
68    }
69
70    #[test]
71    fn combine() {
72        let flags = Flags::USEVC | Flags::PRIMARY;
73        assert!(flags.contains(Flags::USEVC));
74        assert!(flags.contains(Flags::PRIMARY));
75        assert!(!flags.contains(Flags::IGNTC));
76    }
77
78    #[test]
79    fn all() {
80        let flags = Flags::all();
81        assert!(flags.contains(Flags::USEVC));
82        assert!(flags.contains(Flags::PRIMARY));
83        assert!(flags.contains(Flags::IGNTC));
84        assert!(flags.contains(Flags::NORECURSE));
85        assert!(flags.contains(Flags::STAYOPEN));
86        assert!(flags.contains(Flags::NOSEARCH));
87        assert!(flags.contains(Flags::NOALIASES));
88        assert!(flags.contains(Flags::NOCHECKRESP));
89        assert!(flags.contains(Flags::EDNS));
90        assert!(flags.contains(Flags::NO_DFLT_SVR));
91        assert!(flags.contains(Flags::DNS_0X20));
92    }
93
94    #[test]
95    fn remove() {
96        let mut flags = Flags::USEVC | Flags::PRIMARY;
97        flags.remove(Flags::USEVC);
98        assert!(!flags.contains(Flags::USEVC));
99        assert!(flags.contains(Flags::PRIMARY));
100    }
101
102    #[test]
103    fn insert() {
104        let mut flags = Flags::empty();
105        flags.insert(Flags::STAYOPEN);
106        assert!(flags.contains(Flags::STAYOPEN));
107    }
108
109    #[test]
110    fn toggle() {
111        let mut flags = Flags::USEVC;
112        flags.toggle(Flags::USEVC);
113        assert!(!flags.contains(Flags::USEVC));
114        flags.toggle(Flags::USEVC);
115        assert!(flags.contains(Flags::USEVC));
116    }
117
118    #[test]
119    fn debug() {
120        let flags = Flags::USEVC | Flags::PRIMARY;
121        let debug = format!("{flags:?}");
122        assert!(debug.contains("USEVC"));
123        assert!(debug.contains("PRIMARY"));
124    }
125
126    #[test]
127    #[allow(clippy::clone_on_copy)]
128    fn clone_eq_hash() {
129        let flags = Flags::USEVC | Flags::PRIMARY;
130        let cloned = flags.clone();
131        assert_eq!(flags, cloned);
132
133        let mut set = HashSet::new();
134        set.insert(flags);
135        set.insert(cloned);
136        assert_eq!(set.len(), 1);
137    }
138}