resolve: set DNS_STUB_LISTENER_YES if no protocol is specified in DNSStubListenExtra=

This commit is contained in:
Yu Watanabe
2020-09-04 20:05:58 +09:00
parent dce65cd40f
commit 7314b39746
3 changed files with 53 additions and 86 deletions
+29 -68
View File
@@ -444,10 +444,8 @@ int config_parse_dns_stub_listener_extra(
void *data,
void *userdata) {
_cleanup_free_ DNSStubListenerExtra *udp = NULL, *tcp = NULL;
_cleanup_free_ char *word = NULL;
_cleanup_free_ DNSStubListenerExtra *stub = NULL;
Manager *m = userdata;
bool both = false;
const char *p;
int r;
@@ -461,78 +459,41 @@ int config_parse_dns_stub_listener_extra(
return 0;
}
p = rvalue;
r = extract_first_word(&p, &word, ":", 0);
if (r == -ENOMEM)
r = dns_stub_extra_new(&stub);
if (r < 0)
return log_oom();
if (r <= 0) {
p = startswith(rvalue, "udp:");
if (p)
stub->mode = DNS_STUB_LISTENER_UDP;
else {
p = startswith(rvalue, "tcp:");
if (p)
stub->mode = DNS_STUB_LISTENER_TCP;
else {
stub->mode = DNS_STUB_LISTENER_YES;
p = rvalue;
}
}
r = socket_addr_port_from_string_auto(p, 53, &stub->address);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Invalid DNSStubListenExtra='%s', ignoring assignment", rvalue);
"Failed to parse address in %s=%s, ignoring assignment: %m",
lvalue, rvalue);
return 0;
}
/* First look for udp/tcp. If not specified then turn both TCP and UDP */
if (!STR_IN_SET(word, "tcp", "udp")) {
both = true;
p = rvalue;
r = ordered_set_ensure_put(&m->dns_extra_stub_listeners, &dns_stub_listener_extra_hash_ops, stub);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to store %s=%s, ignoring assignment: %m", lvalue, rvalue);
return 0;
}
if (streq(word, "tcp") || both) {
r = dns_stub_extra_new(&tcp);
if (r < 0)
return log_oom();
tcp->mode = DNS_STUB_LISTENER_TCP;
}
if (streq(word, "udp") || both) {
r = dns_stub_extra_new(&udp);
if (r < 0)
return log_oom();
udp->mode = DNS_STUB_LISTENER_UDP;
}
if (tcp) {
r = socket_addr_port_from_string_auto(p, 53, &tcp->address);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address in DNSStubListenExtra='%s', ignoring", rvalue);
return 0;
}
}
if (udp) {
r = socket_addr_port_from_string_auto(p, 53, &udp->address);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address in DNSStubListenExtra='%s', ignoring", rvalue);
return 0;
}
}
if (tcp) {
r = ordered_set_ensure_put(&m->dns_extra_stub_listeners, &dns_stub_listener_extra_hash_ops, tcp);
if (r < 0) {
if (r == -ENOMEM)
return log_oom();
log_warning_errno(r, "Failed to store TCP DNSStubListenExtra='%s', ignoring assignment: %m", rvalue);
return 0;
}
}
if (udp) {
r = ordered_set_ensure_put(&m->dns_extra_stub_listeners, &dns_stub_listener_extra_hash_ops, udp);
if (r < 0) {
if (r == -ENOMEM)
return log_oom();
log_warning_errno(r, "Failed to store UDP DNSStubListenExtra='%s', ignoring assignment: %m", rvalue);
return 0;
}
}
TAKE_PTR(tcp);
TAKE_PTR(udp);
TAKE_PTR(stub);
return 0;
}
+20 -16
View File
@@ -22,7 +22,8 @@ int dns_stub_extra_new(DNSStubListenerExtra **ret) {
return -ENOMEM;
*l = (DNSStubListenerExtra) {
.fd = -1,
.udp_fd = -1,
.tcp_fd = -1,
};
*ret = TAKE_PTR(l);
@@ -461,7 +462,7 @@ static int manager_dns_stub_udp_fd_extra(Manager *m, DNSStubListenerExtra *l) {
_cleanup_close_ int fd = -1;
int r;
if (l->fd >= 0)
if (l->udp_fd >= 0)
return 0;
fd = socket(socket_address_family(&l->address), SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
@@ -483,19 +484,19 @@ static int manager_dns_stub_udp_fd_extra(Manager *m, DNSStubListenerExtra *l) {
goto fail;
}
r = sd_event_add_io(m->event, &l->event_source, fd, EPOLLIN, on_dns_stub_packet, m);
r = sd_event_add_io(m->event, &l->udp_event_source, fd, EPOLLIN, on_dns_stub_packet, m);
if (r < 0)
goto fail;
(void) sd_event_source_set_description(l->event_source, "dns-stub-udp-extra");
l->fd = TAKE_FD(fd);
(void) sd_event_source_set_description(l->udp_event_source, "dns-stub-udp-extra");
if (DEBUG_LOGGING) {
(void) sockaddr_pretty(&l->address.sockaddr.sa, FAMILY_ADDRESS_SIZE(l->address.sockaddr.sa.sa_family), true, true, &pretty);
log_debug("Listening on UDP socket %s.", strnull(pretty));
}
l->udp_fd = TAKE_FD(fd);
return 0;
fail:
@@ -608,7 +609,7 @@ static int manager_dns_stub_tcp_fd_extra(Manager *m, DNSStubListenerExtra *l) {
_cleanup_close_ int fd = -1;
int r;
if (l->fd >= 0)
if (l->tcp_fd >= 0)
return 0;
fd = socket(socket_address_family(&l->address), SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
@@ -639,19 +640,19 @@ static int manager_dns_stub_tcp_fd_extra(Manager *m, DNSStubListenerExtra *l) {
goto fail;
}
r = sd_event_add_io(m->event, &l->event_source, fd, EPOLLIN, on_dns_stub_packet, m);
r = sd_event_add_io(m->event, &l->tcp_event_source, fd, EPOLLIN, on_dns_stub_packet, m);
if (r < 0)
goto fail;
(void) sd_event_source_set_description(l->event_source, "dns-stub-tcp-extra");
l->fd = TAKE_FD(fd);
(void) sd_event_source_set_description(l->tcp_event_source, "dns-stub-tcp-extra");
if (DEBUG_LOGGING) {
(void) sockaddr_pretty(&l->address.sockaddr.sa, FAMILY_ADDRESS_SIZE(l->address.sockaddr.sa.sa_family), true, true, &pretty);
log_debug("Listening on TCP socket %s.", strnull(pretty));
}
l->tcp_fd = TAKE_FD(fd);
return 0;
fail:
@@ -712,11 +713,12 @@ int manager_dns_stub_start(Manager *m) {
log_debug("Creating extra stub listeners.");
ORDERED_SET_FOREACH(l, m->dns_extra_stub_listeners, i)
if (l->mode == DNS_STUB_LISTENER_UDP)
ORDERED_SET_FOREACH(l, m->dns_extra_stub_listeners, i) {
if (FLAGS_SET(l->mode, DNS_STUB_LISTENER_UDP))
(void) manager_dns_stub_udp_fd_extra(m, l);
else
if (FLAGS_SET(l->mode, DNS_STUB_LISTENER_TCP))
(void) manager_dns_stub_tcp_fd_extra(m, l);
}
}
return 0;
@@ -739,7 +741,9 @@ void manager_dns_stub_stop_extra(Manager *m) {
assert(m);
ORDERED_SET_FOREACH(l, m->dns_extra_stub_listeners, i) {
l->event_source = sd_event_source_unref(l->event_source);
l->fd = safe_close(l->fd);
l->udp_event_source = sd_event_source_unref(l->udp_event_source);
l->tcp_event_source = sd_event_source_unref(l->tcp_event_source);
l->udp_fd = safe_close(l->udp_fd);
l->tcp_fd = safe_close(l->tcp_fd);
}
}
+4 -2
View File
@@ -32,11 +32,13 @@ typedef struct EtcHosts {
} EtcHosts;
typedef struct DNSStubListenerExtra {
int fd;
int udp_fd;
int tcp_fd;
DnsStubListenerMode mode;
SocketAddress address;
sd_event_source *event_source;
sd_event_source *udp_event_source;
sd_event_source *tcp_event_source;
} DNSStubListenerExtra;
struct Manager {