dns_transaction_free(t);
}
- while ((rr = hashmap_steal_first(s->conflict_queue)))
+ while ((rr = ordered_hashmap_steal_first(s->conflict_queue)))
dns_resource_record_unref(rr);
- hashmap_free(s->conflict_queue);
+ ordered_hashmap_free(s->conflict_queue);
sd_event_source_unref(s->conflict_event_source);
dns_cache_flush(&s->cache);
if (s->protocol == DNS_PROTOCOL_LLMNR) {
if (dns_name_endswith(domain, "in-addr.arpa") > 0 ||
dns_name_endswith(domain, "ip6.arpa") > 0 ||
- dns_name_single_label(domain) > 0)
+ (dns_name_single_label(domain) > 0 &&
+ dns_name_equal(domain, "gateway") <= 0)) /* don't resolve "gateway" with LLMNR, let nss-myhostname handle this */
return DNS_SCOPE_MAYBE;
return DNS_SCOPE_NO;
* one. This is necessary on some devices, such as
* veth. */
if (b)
- setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn));
+ (void)setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn));
if (setsockopt(fd, IPPROTO_IP, b ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0)
return -errno;
return fd;
if (b)
- setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
+ (void)setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
if (setsockopt(fd, IPPROTO_IPV6, b ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
return -errno;
r = dns_packet_extract(p);
if (r < 0) {
- log_debug("Failed to extract resources from incoming packet: %s", strerror(-r));
+ log_debug_errno(r, "Failed to extract resources from incoming packet: %m");
return;
}
r = dns_zone_lookup(&s->zone, p->question, &answer, &soa, &tentative);
if (r < 0) {
- log_debug("Failed to lookup key: %s", strerror(-r));
+ log_debug_errno(r, "Failed to lookup key: %m");
return;
}
if (r == 0)
r = dns_scope_make_reply_packet(s, DNS_PACKET_ID(p), DNS_RCODE_SUCCESS, p->question, answer, soa, tentative, &reply);
if (r < 0) {
- log_debug("Failed to build reply packet: %s", strerror(-r));
+ log_debug_errno(r, "Failed to build reply packet: %m");
return;
}
return;
}
if (fd < 0) {
- log_debug("Failed to get reply socket: %s", strerror(-fd));
+ log_debug_errno(fd, "Failed to get reply socket: %m");
return;
}
}
if (r < 0) {
- log_debug("Failed to send reply packet: %s", strerror(-r));
+ log_debug_errno(r, "Failed to send reply packet: %m");
return;
}
}
_cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
_cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
- rr = hashmap_steal_first(scope->conflict_queue);
+ rr = ordered_hashmap_steal_first(scope->conflict_queue);
if (!rr)
break;
r = dns_scope_make_conflict_packet(scope, rr, &p);
if (r < 0) {
- log_error("Failed to make conflict packet: %s", strerror(-r));
+ log_error_errno(r, "Failed to make conflict packet: %m");
return 0;
}
r = dns_scope_emit(scope, p);
if (r < 0)
- log_debug("Failed to send conflict packet: %s", strerror(-r));
+ log_debug_errno(r, "Failed to send conflict packet: %m");
}
return 0;
/* We don't send these queries immediately. Instead, we queue
* them, and send them after some jitter delay. */
- r = hashmap_ensure_allocated(&scope->conflict_queue, dns_resource_key_hash_func, dns_resource_key_compare_func);
+ r = ordered_hashmap_ensure_allocated(&scope->conflict_queue, &dns_resource_key_hash_ops);
if (r < 0) {
log_oom();
return r;
/* We only place one RR per key in the conflict
* messages, not all of them. That should be enough to
* indicate where there might be a conflict */
- r = hashmap_put(scope->conflict_queue, rr->key, rr);
+ r = ordered_hashmap_put(scope->conflict_queue, rr->key, rr);
if (r == -EEXIST || r == 0)
return 0;
- if (r < 0) {
- log_debug("Failed to queue conflicting RR: %s", strerror(-r));
- return r;
- }
+ if (r < 0)
+ return log_debug_errno(r, "Failed to queue conflicting RR: %m");
dns_resource_record_ref(rr);
now(clock_boottime_or_monotonic()) + jitter,
LLMNR_JITTER_INTERVAL_USEC,
on_conflict_dispatch, scope);
- if (r < 0) {
- log_debug("Failed to add conflict dispatch event: %s", strerror(-r));
- return r;
- }
+ if (r < 0)
+ return log_debug_errno(r, "Failed to add conflict dispatch event: %m");
return 0;
}
r = dns_packet_extract(p);
if (r < 0) {
- log_debug("Failed to extract packet: %s", strerror(-r));
+ log_debug_errno(r, "Failed to extract packet: %m");
return;
}