mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-27 14:03:43 +03:00
Merge pull request #2608 from poettering/resolved-prop-fix
bus property name fix in resolved
This commit is contained in:
commit
63408cb4f3
3
TODO
3
TODO
@ -33,6 +33,9 @@ Janitorial Clean-ups:
|
||||
|
||||
Features:
|
||||
|
||||
* resolved: maybe, after all, implement local listening for DNS packets on port
|
||||
53.
|
||||
|
||||
* delay activation of logind until somebody logs in, or when /dev/tty0 pulls it
|
||||
in or lingering is on (so that containers don't bother with it until PAM is used). also exit-on-idle
|
||||
|
||||
|
@ -68,10 +68,8 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_NO_NAME_SERVERS, ESRCH),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_INVALID_REPLY, EINVAL),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_RR, ENOENT),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_NO_RESOURCES, ENOMEM),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_CNAME_LOOP, EDEADLK),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_ABORTED, ECANCELED),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_CONNECTION_FAILURE, ECONNREFUSED),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_SERVICE, EUNATCH),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_DNSSEC_FAILED, EHOSTUNREACH),
|
||||
SD_BUS_ERROR_MAP(BUS_ERROR_NO_TRUST_ANCHOR, EHOSTUNREACH),
|
||||
|
@ -67,10 +67,8 @@
|
||||
#define BUS_ERROR_NO_NAME_SERVERS "org.freedesktop.resolve1.NoNameServers"
|
||||
#define BUS_ERROR_INVALID_REPLY "org.freedesktop.resolve1.InvalidReply"
|
||||
#define BUS_ERROR_NO_SUCH_RR "org.freedesktop.resolve1.NoSuchRR"
|
||||
#define BUS_ERROR_NO_RESOURCES "org.freedesktop.resolve1.NoResources"
|
||||
#define BUS_ERROR_CNAME_LOOP "org.freedesktop.resolve1.CNameLoop"
|
||||
#define BUS_ERROR_ABORTED "org.freedesktop.resolve1.Aborted"
|
||||
#define BUS_ERROR_CONNECTION_FAILURE "org.freedesktop.resolve1.ConnectionFailure"
|
||||
#define BUS_ERROR_NO_SUCH_SERVICE "org.freedesktop.resolve1.NoSuchService"
|
||||
#define BUS_ERROR_DNSSEC_FAILED "org.freedesktop.resolve1.DnssecFailed"
|
||||
#define BUS_ERROR_NO_TRUST_ANCHOR "org.freedesktop.resolve1.NoTrustAnchor"
|
||||
|
@ -501,8 +501,10 @@ static int format_cmdline(sd_bus_message *m, FILE *f, bool needs_space) {
|
||||
} basic;
|
||||
|
||||
r = sd_bus_message_peek_type(m, &type, &contents);
|
||||
if (r <= 0)
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
return needs_space;
|
||||
|
||||
if (bus_type_is_container(type) > 0) {
|
||||
|
||||
@ -533,18 +535,23 @@ static int format_cmdline(sd_bus_message *m, FILE *f, bool needs_space) {
|
||||
fputc(' ', f);
|
||||
|
||||
fprintf(f, "%u", n);
|
||||
needs_space = true;
|
||||
|
||||
} else if (type == SD_BUS_TYPE_VARIANT) {
|
||||
|
||||
if (needs_space)
|
||||
fputc(' ', f);
|
||||
|
||||
fprintf(f, "%s", contents);
|
||||
needs_space = true;
|
||||
}
|
||||
|
||||
r = format_cmdline(m, f, needs_space || IN_SET(type, SD_BUS_TYPE_ARRAY, SD_BUS_TYPE_VARIANT));
|
||||
r = format_cmdline(m, f, needs_space);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
needs_space = r > 0;
|
||||
|
||||
r = sd_bus_message_exit_container(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "dns-domain.h"
|
||||
#include "resolved-bus.h"
|
||||
#include "resolved-def.h"
|
||||
#include "resolved-dns-synthesize.h"
|
||||
#include "resolved-link-bus.h"
|
||||
|
||||
static int reply_query_state(DnsQuery *q) {
|
||||
@ -233,6 +234,65 @@ static int check_ifindex_flags(int ifindex, uint64_t *flags, uint64_t ok, sd_bus
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_as_address(sd_bus_message *m, int ifindex, const char *hostname, int family, uint64_t flags) {
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
_cleanup_free_ char *canonical = NULL;
|
||||
union in_addr_union parsed;
|
||||
int r, ff;
|
||||
|
||||
/* Check if the hostname is actually already an IP address formatted as string. In that case just parse it,
|
||||
* let's not attempt to look it up. */
|
||||
|
||||
r = in_addr_from_string_auto(hostname, &ff, &parsed);
|
||||
if (r < 0) /* not an address */
|
||||
return 0;
|
||||
|
||||
if (family != AF_UNSPEC && ff != family)
|
||||
return sd_bus_reply_method_errorf(m, BUS_ERROR_NO_SUCH_RR, "The specified address is not of the requested family.");
|
||||
|
||||
r = sd_bus_message_new_method_return(m, &reply);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_open_container(reply, 'a', "(iiay)");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_open_container(reply, 'r', "iiay");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_append(reply, "ii", ifindex, ff);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_append_array(reply, 'y', &parsed, FAMILY_ADDRESS_SIZE(ff));
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_close_container(reply);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_close_container(reply);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* When an IP address is specified we just return it as canonical name, in order to avoid a DNS
|
||||
* look-up. However, we reformat it to make sure it's in a truly canonical form (i.e. on IPv6 the inner
|
||||
* omissions are always done the same way). */
|
||||
r = in_addr_to_string(ff, &parsed, &canonical);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_append(reply, "st", canonical,
|
||||
SD_RESOLVED_FLAGS_MAKE(dns_synthesize_protocol(flags), ff, true));
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return sd_bus_send(sd_bus_message_get_bus(m), reply, NULL);
|
||||
}
|
||||
|
||||
static int bus_method_resolve_hostname(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
_cleanup_(dns_question_unrefp) DnsQuestion *question_idna = NULL, *question_utf8 = NULL;
|
||||
Manager *m = userdata;
|
||||
@ -254,16 +314,20 @@ static int bus_method_resolve_hostname(sd_bus_message *message, void *userdata,
|
||||
if (!IN_SET(family, AF_INET, AF_INET6, AF_UNSPEC))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown address family %i", family);
|
||||
|
||||
r = check_ifindex_flags(ifindex, &flags, SD_RESOLVED_NO_SEARCH, error);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = parse_as_address(message, ifindex, hostname, family, flags);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
r = dns_name_is_valid(hostname);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid hostname '%s'", hostname);
|
||||
|
||||
r = check_ifindex_flags(ifindex, &flags, SD_RESOLVED_NO_SEARCH, error);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dns_question_new_address(&question_utf8, family, hostname, false);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -1198,7 +1262,7 @@ static int bus_property_get_dns_servers(
|
||||
return sd_bus_message_close_container(reply);
|
||||
}
|
||||
|
||||
static int bus_property_get_search_domains(
|
||||
static int bus_property_get_domains(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
@ -1396,8 +1460,8 @@ static int bus_method_set_link_dns_servers(sd_bus_message *message, void *userda
|
||||
return call_link_method(userdata, message, bus_link_method_set_dns_servers, error);
|
||||
}
|
||||
|
||||
static int bus_method_set_link_search_domains(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
return call_link_method(userdata, message, bus_link_method_set_search_domains, error);
|
||||
static int bus_method_set_link_domains(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
return call_link_method(userdata, message, bus_link_method_set_domains, error);
|
||||
}
|
||||
|
||||
static int bus_method_set_link_llmnr(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
@ -1449,7 +1513,7 @@ static const sd_bus_vtable resolve_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_PROPERTY("LLMNRHostname", "s", NULL, offsetof(Manager, llmnr_hostname), 0),
|
||||
SD_BUS_PROPERTY("DNS", "a(iiay)", bus_property_get_dns_servers, 0, 0),
|
||||
SD_BUS_PROPERTY("SearchDomains", "a(isb)", bus_property_get_search_domains, 0, 0),
|
||||
SD_BUS_PROPERTY("Domains", "a(isb)", bus_property_get_domains, 0, 0),
|
||||
SD_BUS_PROPERTY("TransactionStatistics", "(tt)", bus_property_get_transaction_statistics, 0, 0),
|
||||
SD_BUS_PROPERTY("CacheStatistics", "(ttt)", bus_property_get_cache_statistics, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSSECStatistics", "(tttt)", bus_property_get_dnssec_statistics, 0, 0),
|
||||
@ -1462,7 +1526,7 @@ static const sd_bus_vtable resolve_vtable[] = {
|
||||
SD_BUS_METHOD("ResetStatistics", NULL, NULL, bus_method_reset_statistics, 0),
|
||||
SD_BUS_METHOD("GetLink", "i", "o", bus_method_get_link, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("SetLinkDNS", "ia(iay)", NULL, bus_method_set_link_dns_servers, 0),
|
||||
SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL, bus_method_set_link_search_domains, 0),
|
||||
SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL, bus_method_set_link_domains, 0),
|
||||
SD_BUS_METHOD("SetLinkLLMNR", "is", NULL, bus_method_set_link_llmnr, 0),
|
||||
SD_BUS_METHOD("SetLinkMulticastDNS", "is", NULL, bus_method_set_link_mdns, 0),
|
||||
SD_BUS_METHOD("SetLinkDNSSEC", "is", NULL, bus_method_set_link_dnssec, 0),
|
||||
|
@ -262,11 +262,9 @@ static inline uint64_t SD_RESOLVED_FLAGS_MAKE(DnsProtocol protocol, int family,
|
||||
return f|(family == AF_INET6 ? SD_RESOLVED_LLMNR_IPV6 : SD_RESOLVED_LLMNR_IPV4);
|
||||
|
||||
case DNS_PROTOCOL_MDNS:
|
||||
return family == AF_INET6 ? SD_RESOLVED_MDNS_IPV6 : SD_RESOLVED_MDNS_IPV4;
|
||||
return f|(family == AF_INET6 ? SD_RESOLVED_MDNS_IPV6 : SD_RESOLVED_MDNS_IPV4);
|
||||
|
||||
default:
|
||||
break;
|
||||
return f;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ clear:
|
||||
return r;
|
||||
}
|
||||
|
||||
int bus_link_method_set_search_domains(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
int bus_link_method_set_domains(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
Link *l = userdata;
|
||||
int r;
|
||||
|
||||
@ -457,10 +457,10 @@ const sd_bus_vtable link_vtable[] = {
|
||||
SD_BUS_PROPERTY("MulticastDNS", "s", property_get_resolve_support, offsetof(Link, mdns_support), 0),
|
||||
SD_BUS_PROPERTY("DNSSEC", "s", property_get_dnssec_mode, offsetof(Link, dnssec_mode), 0),
|
||||
SD_BUS_PROPERTY("DNSSECNegativeTrustAnchors", "as", property_get_ntas, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSSECSupport", "b", property_get_dnssec_supported, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSSECSupported", "b", property_get_dnssec_supported, 0, 0),
|
||||
|
||||
SD_BUS_METHOD("SetDNS", "a(iay)", NULL, bus_link_method_set_dns_servers, 0),
|
||||
SD_BUS_METHOD("SetDomains", "a(sb)", NULL, bus_link_method_set_search_domains, 0),
|
||||
SD_BUS_METHOD("SetDomains", "a(sb)", NULL, bus_link_method_set_domains, 0),
|
||||
SD_BUS_METHOD("SetLLMNR", "s", NULL, bus_link_method_set_llmnr, 0),
|
||||
SD_BUS_METHOD("SetMulticastDNS", "s", NULL, bus_link_method_set_mdns, 0),
|
||||
SD_BUS_METHOD("SetDNSSEC", "s", NULL, bus_link_method_set_dnssec, 0),
|
||||
|
@ -30,7 +30,7 @@ char *link_bus_path(Link *link);
|
||||
int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
|
||||
|
||||
int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_link_method_set_search_domains(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_link_method_set_domains(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_link_method_set_llmnr(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_link_method_set_mdns(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_link_method_set_dnssec(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
Loading…
x
Reference in New Issue
Block a user