summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-10-28 22:52:16 +0900
committerGitHub <noreply@github.com>2019-10-28 22:52:16 +0900
commit1c507a6db52a25566f3f267b0685c80802219c8c (patch)
tree54bf583cd2070477909621000a7dce7de9caad80
parent9432f882a53e7152a75007fd7f001f9a74f2a0d7 (diff)
parent4a6f996c01db3375a6fd0eb69f7792f1149449bb (diff)
downloadsystemd-1c507a6db52a25566f3f267b0685c80802219c8c.tar.gz
Merge pull request #13844 from keszybz/resolved-proprties
Emit dbus PropertyChanged notifications for systemd-resolved
-rw-r--r--src/resolve/resolved-bus.c28
-rw-r--r--src/resolve/resolved-bus.h2
-rw-r--r--src/resolve/resolved-conf.c4
-rw-r--r--src/resolve/resolved-conf.h3
-rw-r--r--src/resolve/resolved-dns-server.c3
-rw-r--r--src/resolve/resolved-link-bus.c11
-rw-r--r--src/resolve/resolved-link-bus.h2
-rw-r--r--src/resolve/resolved-manager.c7
-rw-r--r--src/resolve/resolved-resolv-conf.c1
9 files changed, 42 insertions, 19 deletions
diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c
index db0f8381ef..2c1aba911a 100644
--- a/src/resolve/resolved-bus.c
+++ b/src/resolve/resolved-bus.c
@@ -12,6 +12,8 @@
#include "resolved-dnssd-bus.h"
#include "resolved-dnssd.h"
#include "resolved-link-bus.h"
+#include "stdio-util.h"
+#include "strv.h"
#include "user-util.h"
#include "utf8.h"
@@ -68,7 +70,7 @@ static int reply_query_state(DnsQuery *q) {
rc = dns_rcode_to_string(q->answer_rcode);
if (!rc) {
- sprintf(p, "%i", q->answer_rcode);
+ xsprintf(p, "%i", q->answer_rcode);
rc = p;
}
@@ -1273,13 +1275,12 @@ static int bus_property_get_dns_servers(
return r;
}
- HASHMAP_FOREACH(l, m->links, i) {
+ HASHMAP_FOREACH(l, m->links, i)
LIST_FOREACH(servers, s, l->dns_servers) {
r = bus_dns_server_append(reply, s, true);
if (r < 0)
return r;
}
- }
return sd_bus_message_close_container(reply);
}
@@ -1834,13 +1835,13 @@ static int bus_method_unregister_service(sd_bus_message *message, void *userdata
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("LLMNRHostname", "s", NULL, offsetof(Manager, llmnr_hostname), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("LLMNR", "s", bus_property_get_resolve_support, offsetof(Manager, llmnr_support), 0),
SD_BUS_PROPERTY("MulticastDNS", "s", bus_property_get_resolve_support, offsetof(Manager, mdns_support), 0),
SD_BUS_PROPERTY("DNSOverTLS", "s", bus_property_get_dns_over_tls_mode, 0, 0),
- SD_BUS_PROPERTY("DNS", "a(iiay)", bus_property_get_dns_servers, 0, 0),
+ SD_BUS_PROPERTY("DNS", "a(iiay)", bus_property_get_dns_servers, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("FallbackDNS", "a(iiay)", bus_property_get_fallback_dns_servers, offsetof(Manager, fallback_dns_servers), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("CurrentDNSServer", "(iiay)", bus_property_get_current_dns_server, offsetof(Manager, current_dns_server), 0),
+ SD_BUS_PROPERTY("CurrentDNSServer", "(iiay)", bus_property_get_current_dns_server, offsetof(Manager, current_dns_server), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
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),
@@ -1950,3 +1951,18 @@ int manager_connect_bus(Manager *m) {
return 0;
}
+
+int _manager_send_changed(Manager *manager, const char *property, ...) {
+ assert(manager);
+
+ char **l = strv_from_stdarg_alloca(property);
+
+ int r = sd_bus_emit_properties_changed_strv(
+ manager->bus,
+ "/org/freedesktop/resolve1",
+ "org.freedesktop.resolve1.Manager",
+ l);
+ if (r < 0)
+ log_notice_errno(r, "Failed to emit notification about changed property %s: %m", property);
+ return r;
+}
diff --git a/src/resolve/resolved-bus.h b/src/resolve/resolved-bus.h
index a52bb0fa69..a499f76ad5 100644
--- a/src/resolve/resolved-bus.h
+++ b/src/resolve/resolved-bus.h
@@ -4,6 +4,8 @@
#include "resolved-manager.h"
int manager_connect_bus(Manager *m);
+int _manager_send_changed(Manager *manager, const char *property, ...) _sentinel_;
+#define manager_send_changed(manager, ...) _manager_send_changed(manager, __VA_ARGS__, NULL)
int bus_dns_server_append(sd_bus_message *reply, DnsServer *s, bool with_ifindex);
int bus_property_get_resolve_support(sd_bus *bus, const char *path, const char *interface,
const char *property, sd_bus_message *reply,
diff --git a/src/resolve/resolved-conf.c b/src/resolve/resolved-conf.c
index 0c8d2a679c..a46c45385b 100644
--- a/src/resolve/resolved-conf.c
+++ b/src/resolve/resolved-conf.c
@@ -23,7 +23,7 @@ static const char* const dns_stub_listener_mode_table[_DNS_STUB_LISTENER_MODE_MA
};
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dns_stub_listener_mode, DnsStubListenerMode, DNS_STUB_LISTENER_YES);
-int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) {
+static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) {
union in_addr_union address;
int family, r, ifindex = 0;
DnsServer *s;
@@ -78,7 +78,7 @@ int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, con
return 0;
}
-int manager_add_search_domain_by_string(Manager *m, const char *domain) {
+static int manager_add_search_domain_by_string(Manager *m, const char *domain) {
DnsSearchDomain *d;
bool route_only;
int r;
diff --git a/src/resolve/resolved-conf.h b/src/resolve/resolved-conf.h
index f6efa175fc..4713df587b 100644
--- a/src/resolve/resolved-conf.h
+++ b/src/resolve/resolved-conf.h
@@ -19,10 +19,7 @@ enum DnsStubListenerMode {
int manager_parse_config_file(Manager *m);
-int manager_add_search_domain_by_string(Manager *m, const char *domain);
int manager_parse_search_domains_and_warn(Manager *m, const char *string);
-
-int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word);
int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string);
const struct ConfigPerfItem* resolved_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c
index cbb3d524b0..9f2c97314f 100644
--- a/src/resolve/resolved-dns-server.c
+++ b/src/resolve/resolved-dns-server.c
@@ -3,6 +3,7 @@
#include "sd-messages.h"
#include "alloc-util.h"
+#include "resolved-bus.h"
#include "resolved-dns-server.h"
#include "resolved-dns-stub.h"
#include "resolved-resolv-conf.h"
@@ -681,6 +682,8 @@ DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
if (m->unicast_scope)
dns_cache_flush(&m->unicast_scope->cache);
+ (void) manager_send_changed(m, "CurrentDNSServer");
+
return s;
}
diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c
index b6c1476f5c..8a2768b1e2 100644
--- a/src/resolve/resolved-link-bus.c
+++ b/src/resolve/resolved-link-bus.c
@@ -12,6 +12,7 @@
#include "resolved-bus.h"
#include "resolved-link-bus.h"
#include "resolved-resolv-conf.h"
+#include "stdio-util.h"
#include "strv.h"
#include "user-util.h"
@@ -295,6 +296,7 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
(void) link_save_user(l);
(void) manager_write_resolv_conf(l->manager);
+ (void) manager_send_changed(l->manager, "DNS");
return sd_bus_reply_method_return(message, NULL);
@@ -674,6 +676,7 @@ int bus_link_method_revert(sd_bus_message *message, void *userdata, sd_bus_error
(void) link_save_user(l);
(void) manager_write_resolv_conf(l->manager);
+ (void) manager_send_changed(l->manager, "DNS");
return sd_bus_reply_method_return(message, NULL);
}
@@ -735,15 +738,13 @@ int link_object_find(sd_bus *bus, const char *path, const char *interface, void
return 1;
}
-char *link_bus_path(Link *link) {
- _cleanup_free_ char *ifindex = NULL;
- char *p;
+char *link_bus_path(const Link *link) {
+ char *p, ifindex[DECIMAL_STR_MAX(link->ifindex)];
int r;
assert(link);
- if (asprintf(&ifindex, "%i", link->ifindex) < 0)
- return NULL;
+ xsprintf(ifindex, "%i", link->ifindex);
r = sd_bus_path_encode("/org/freedesktop/resolve1/link", ifindex, &p);
if (r < 0)
diff --git a/src/resolve/resolved-link-bus.h b/src/resolve/resolved-link-bus.h
index 671725101e..74068a4777 100644
--- a/src/resolve/resolved-link-bus.h
+++ b/src/resolve/resolved-link-bus.h
@@ -8,7 +8,7 @@
extern const sd_bus_vtable link_vtable[];
int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
-char *link_bus_path(Link *link);
+char *link_bus_path(const 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);
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 486b7a87be..95f698ab06 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -282,6 +282,7 @@ static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *
}
(void) manager_write_resolv_conf(m);
+ (void) manager_send_changed(m, "DNS");
return 0;
}
@@ -437,6 +438,7 @@ static int make_fallback_hostnames(char **full_hostname, char **llmnr_hostname,
static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
_cleanup_free_ char *full_hostname = NULL, *llmnr_hostname = NULL, *mdns_hostname = NULL;
Manager *m = userdata;
+ bool llmnr_hostname_changed;
int r;
assert(m);
@@ -445,8 +447,9 @@ static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, voi
if (r < 0)
return 0; /* ignore invalid hostnames */
+ llmnr_hostname_changed = !streq(llmnr_hostname, m->llmnr_hostname);
if (streq(full_hostname, m->full_hostname) &&
- streq(llmnr_hostname, m->llmnr_hostname) &&
+ !llmnr_hostname_changed &&
streq(mdns_hostname, m->mdns_hostname))
return 0;
@@ -457,6 +460,7 @@ static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, voi
free_and_replace(m->mdns_hostname, mdns_hostname);
manager_refresh_rrs(m);
+ (void) manager_send_changed(m, "LLMNRHostname");
return 0;
}
@@ -1172,6 +1176,7 @@ int manager_next_hostname(Manager *m) {
free_and_replace(m->mdns_hostname, k);
manager_refresh_rrs(m);
+ (void) manager_send_changed(m, "LLMNRHostname");
return 0;
}
diff --git a/src/resolve/resolved-resolv-conf.c b/src/resolve/resolved-resolv-conf.c
index dfc9a948e3..7b487d50c6 100644
--- a/src/resolve/resolved-resolv-conf.c
+++ b/src/resolve/resolved-resolv-conf.c
@@ -334,7 +334,6 @@ static int write_stub_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSet
}
int manager_write_resolv_conf(Manager *m) {
-
_cleanup_ordered_set_free_ OrderedSet *dns = NULL, *domains = NULL;
_cleanup_free_ char *temp_path_uplink = NULL, *temp_path_stub = NULL;
_cleanup_fclose_ FILE *f_uplink = NULL, *f_stub = NULL;