use super::*;
pub(crate) const DNS_SD_META_QUERY_NAME: &str = "_services._dns-sd._udp.local.";
pub(crate) fn is_meta_query_name(qname: &NameRef<'_>) -> bool {
names_match_str(DNS_SD_META_QUERY_NAME, qname)
}
pub(crate) fn names_match(stored: &Name, incoming: &NameRef<'_>) -> bool {
names_match_str(stored.as_str(), incoming)
}
pub(crate) fn names_match_str(stored_str: &str, incoming: &NameRef<'_>) -> bool {
let stored_trim = match stored_str.strip_suffix('.') {
Some(s) => s,
None => stored_str,
};
let mut sit = stored_trim.split('.');
let mut iit = incoming.labels();
loop {
match (sit.next(), iit.next()) {
(None, None) => return true,
(Some(s), Some(Ok(i))) => {
if s.len() != i.len() {
return false;
}
for (a, b) in s.bytes().zip(i.iter()) {
if !a.eq_ignore_ascii_case(b) {
return false;
}
}
}
_ => return false,
}
}
}
pub(crate) fn names_match_record(stored: &Name, r: &crate::wire::Ref<'_>) -> bool {
names_match(stored, r.name())
}
pub(crate) fn is_host_conflict_rtype(rt: ResourceType) -> bool {
matches!(rt, ResourceType::A | ResourceType::AAAA)
}
pub(crate) fn is_instance_conflict_rtype(rt: ResourceType) -> bool {
matches!(rt, ResourceType::Srv | ResourceType::Txt)
}
pub(crate) fn qry_query_accepts<I, AN, EvQ>(q: &Query<I, AN, EvQ>, r: &crate::wire::Ref<'_>) -> bool
where
I: Instant,
AN: Pool<CollectedAnswer>,
EvQ: Pool<QueryUpdate>,
{
let qt = q.qtype();
let qc = q.qclass();
let rt_ok = qt == ResourceType::Any || qt == r.rtype();
let rc_ok = qc == ResourceClass::Any || qc == r.rclass();
rt_ok && rc_ok
}