X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-manager.c;h=05244499c0011aa1603861161a58a08963a8cc1f;hp=2dbf432df909b15d950283503e362d872bef96ba;hb=1a7baaa9e23251c7972779a42f82004d53d251a7;hpb=e3140015a71632f9fef699b38094ad3a75fa45ed diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 2dbf432df90..05244499c00 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -1,22 +1,4 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. - - Copyright 2014 Tom Gundersen - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see . - ***/ #include #include @@ -218,19 +200,19 @@ static int manager_rtnl_listen(Manager *m) { if (r < 0) return r; - r = sd_netlink_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m); + r = sd_netlink_add_match(m->rtnl, NULL, RTM_NEWLINK, manager_process_link, NULL, m); if (r < 0) return r; - r = sd_netlink_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m); + r = sd_netlink_add_match(m->rtnl, NULL, RTM_DELLINK, manager_process_link, NULL, m); if (r < 0) return r; - r = sd_netlink_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m); + r = sd_netlink_add_match(m->rtnl, NULL, RTM_NEWADDR, manager_process_address, NULL, m); if (r < 0) return r; - r = sd_netlink_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m); + r = sd_netlink_add_match(m->rtnl, NULL, RTM_DELADDR, manager_process_address, NULL, m); if (r < 0) return r; @@ -396,11 +378,8 @@ static int determine_hostname(char **full_hostname, char **llmnr_hostname, char if (r < 0) return log_error_errno(r, "Failed to determine mDNS hostname: %m"); - *llmnr_hostname = n; - n = NULL; - - *full_hostname = h; - h = NULL; + *llmnr_hostname = TAKE_PTR(n); + *full_hostname = TAKE_PTR(h); return 0; } @@ -445,11 +424,8 @@ static int make_fallback_hostnames(char **full_hostname, char **llmnr_hostname, if (!h) return log_oom(); - *llmnr_hostname = n; - n = NULL; - - *mdns_hostname = m; - m = NULL; + *llmnr_hostname = TAKE_PTR(n); + *mdns_hostname = TAKE_PTR(m); *full_hostname = h; @@ -488,7 +464,8 @@ static int manager_watch_hostname(Manager *m) { assert(m); - m->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY); + m->hostname_fd = open("/proc/sys/kernel/hostname", + O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (m->hostname_fd < 0) { log_warning_errno(errno, "Failed to watch hostname: %m"); return 0; @@ -585,24 +562,33 @@ int manager_new(Manager **ret) { assert(ret); - m = new0(Manager, 1); + m = new(Manager, 1); if (!m) return -ENOMEM; - m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1; - m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1; - m->mdns_ipv4_fd = m->mdns_ipv6_fd = -1; - m->dns_stub_udp_fd = m->dns_stub_tcp_fd = -1; - m->hostname_fd = -1; - - m->llmnr_support = RESOLVE_SUPPORT_YES; - m->mdns_support = RESOLVE_SUPPORT_YES; - m->dnssec_mode = DEFAULT_DNSSEC_MODE; - m->enable_cache = true; - m->dns_stub_listener_mode = DNS_STUB_LISTENER_UDP; - m->read_resolv_conf = true; - m->need_builtin_fallbacks = true; - m->etc_hosts_last = m->etc_hosts_mtime = USEC_INFINITY; + *m = (Manager) { + .llmnr_ipv4_udp_fd = -1, + .llmnr_ipv6_udp_fd = -1, + .llmnr_ipv4_tcp_fd = -1, + .llmnr_ipv6_tcp_fd = -1, + .mdns_ipv4_fd = -1, + .mdns_ipv6_fd = -1, + .dns_stub_udp_fd = -1, + .dns_stub_tcp_fd = -1, + .hostname_fd = -1, + + .llmnr_support = RESOLVE_SUPPORT_YES, + .mdns_support = RESOLVE_SUPPORT_YES, + .dnssec_mode = DEFAULT_DNSSEC_MODE, + .dns_over_tls_mode = DEFAULT_DNS_OVER_TLS_MODE, + .enable_cache = true, + .dns_stub_listener_mode = DNS_STUB_LISTENER_UDP, + .read_resolv_conf = true, + .need_builtin_fallbacks = true, + .etc_hosts_last = USEC_INFINITY, + .etc_hosts_mtime = USEC_INFINITY, + .read_etc_hosts = true, + }; r = dns_trust_anchor_load(&m->trust_anchor); if (r < 0) @@ -616,10 +602,10 @@ int manager_new(Manager **ret) { if (r < 0) return r; - sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + (void) sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); + (void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); - sd_event_set_watchdog(m->event, true); + (void) sd_event_set_watchdog(m->event, true); r = manager_watch_hostname(m); if (r < 0) @@ -651,8 +637,7 @@ int manager_new(Manager **ret) { manager_cleanup_saved_user(m); - *ret = m; - m = NULL; + *ret = TAKE_PTR(m); return 0; } @@ -706,8 +691,6 @@ Manager *manager_free(Manager *m) { manager_mdns_stop(m); manager_dns_stub_stop(m); - sd_bus_slot_unref(m->prepare_for_sleep_slot); - sd_event_source_unref(m->bus_retry_event_source); sd_bus_unref(m->bus); sd_event_source_unref(m->sigusr1_event_source); @@ -747,9 +730,16 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) { + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */]; } control; union sockaddr_union sa; - struct msghdr mh = {}; - struct cmsghdr *cmsg; struct iovec iov; + struct msghdr mh = { + .msg_name = &sa.sa, + .msg_namelen = sizeof(sa), + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_control = &control, + .msg_controllen = sizeof(control), + }; + struct cmsghdr *cmsg; ssize_t ms, l; int r; @@ -765,15 +755,10 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) { if (r < 0) return r; - iov.iov_base = DNS_PACKET_DATA(p); - iov.iov_len = p->allocated; - - mh.msg_name = &sa.sa; - mh.msg_namelen = sizeof(sa); - mh.msg_iov = &iov; - mh.msg_iovlen = 1; - mh.msg_control = &control; - mh.msg_controllen = sizeof(control); + iov = (struct iovec) { + .iov_base = DNS_PACKET_DATA(p), + iov.iov_len = p->allocated, + }; l = recvmsg(fd, &mh, 0); if (l == 0) @@ -860,8 +845,7 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) { p->ifindex = manager_find_ifindex(m, p->family, &p->destination); } - *ret = p; - p = NULL; + *ret = TAKE_PTR(p); return 1; } @@ -934,15 +918,18 @@ static int manager_ipv4_send( uint16_t port, const struct in_addr *source, DnsPacket *p) { - union sockaddr_union sa = { - .in.sin_family = AF_INET, - }; union { struct cmsghdr header; /* For alignment */ uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))]; - } control; - struct msghdr mh = {}; + } control = {}; + union sockaddr_union sa; struct iovec iov; + struct msghdr mh = { + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_name = &sa.sa, + .msg_namelen = sizeof(sa.in), + }; assert(m); assert(fd >= 0); @@ -950,23 +937,21 @@ static int manager_ipv4_send( assert(port > 0); assert(p); - iov.iov_base = DNS_PACKET_DATA(p); - iov.iov_len = p->size; - - sa.in.sin_addr = *destination; - sa.in.sin_port = htobe16(port), + iov = (struct iovec) { + .iov_base = DNS_PACKET_DATA(p), + .iov_len = p->size, + }; - mh.msg_iov = &iov; - mh.msg_iovlen = 1; - mh.msg_name = &sa.sa; - mh.msg_namelen = sizeof(sa.in); + sa = (union sockaddr_union) { + .in.sin_family = AF_INET, + .in.sin_addr = *destination, + .in.sin_port = htobe16(port), + }; if (ifindex > 0) { struct cmsghdr *cmsg; struct in_pktinfo *pi; - zero(control); - mh.msg_control = &control; mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo)); @@ -994,15 +979,18 @@ static int manager_ipv6_send( const struct in6_addr *source, DnsPacket *p) { - union sockaddr_union sa = { - .in6.sin6_family = AF_INET6, - }; union { struct cmsghdr header; /* For alignment */ uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))]; - } control; - struct msghdr mh = {}; + } control = {}; + union sockaddr_union sa; struct iovec iov; + struct msghdr mh = { + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_name = &sa.sa, + .msg_namelen = sizeof(sa.in6), + }; assert(m); assert(fd >= 0); @@ -1010,24 +998,22 @@ static int manager_ipv6_send( assert(port > 0); assert(p); - iov.iov_base = DNS_PACKET_DATA(p); - iov.iov_len = p->size; - - sa.in6.sin6_addr = *destination; - sa.in6.sin6_port = htobe16(port), - sa.in6.sin6_scope_id = ifindex; + iov = (struct iovec) { + .iov_base = DNS_PACKET_DATA(p), + .iov_len = p->size, + }; - mh.msg_iov = &iov; - mh.msg_iovlen = 1; - mh.msg_name = &sa.sa; - mh.msg_namelen = sizeof(sa.in6); + sa = (union sockaddr_union) { + .in6.sin6_family = AF_INET6, + .in6.sin6_addr = *destination, + .in6.sin6_port = htobe16(port), + .in6.sin6_scope_id = ifindex, + }; if (ifindex > 0) { struct cmsghdr *cmsg; struct in6_pktinfo *pi; - zero(control); - mh.msg_control = &control; mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo)); @@ -1065,9 +1051,9 @@ int manager_send( log_debug("Sending %s packet with id %" PRIu16 " on interface %i/%s.", DNS_PACKET_QR(p) ? "response" : "query", DNS_PACKET_ID(p), ifindex, af_to_name(family)); if (family == AF_INET) - return manager_ipv4_send(m, fd, ifindex, &destination->in, port, &source->in, p); + return manager_ipv4_send(m, fd, ifindex, &destination->in, port, source ? &source->in : NULL, p); if (family == AF_INET6) - return manager_ipv6_send(m, fd, ifindex, &destination->in6, port, &source->in6, p); + return manager_ipv6_send(m, fd, ifindex, &destination->in6, port, source ? &source->in6 : NULL, p); return -EAFNOSUPPORT; } @@ -1405,12 +1391,21 @@ bool manager_dnssec_supported(Manager *m) { return true; } +DnsOverTlsMode manager_get_dns_over_tls_mode(Manager *m) { + assert(m); + + if (m->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID) + return m->dns_over_tls_mode; + + return DNS_OVER_TLS_NO; +} + void manager_dnssec_verdict(Manager *m, DnssecVerdict verdict, const DnsResourceKey *key) { assert(verdict >= 0); assert(verdict < _DNSSEC_VERDICT_MAX); - if (log_get_max_level() >= LOG_DEBUG) { + if (DEBUG_LOGGING) { char s[DNS_RESOURCE_KEY_STRING_MAX]; log_debug("Found verdict for lookup %s: %s",