From: Zbigniew Jędrzejewski-Szmek Date: Fri, 25 Oct 2019 13:19:36 +0000 (+0200) Subject: resolved: send out notifications about DNS property X-Git-Tag: v244-rc1~148^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f3340ca5b27899b6ab16bb48522a7911dcfb867;p=thirdparty%2Fsystemd.git resolved: send out notifications about DNS property Notifications are only sent for the top object, and not for individual links. This should be enough for the most obvious cases where somebody just cares about the effective set of servers. Fixes #13721. --- diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 6179bd8f998..2adf612e3b2 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -13,6 +13,7 @@ #include "resolved-dnssd.h" #include "resolved-link-bus.h" #include "stdio-util.h" +#include "strv.h" #include "user-util.h" #include "utf8.h" @@ -1838,7 +1839,7 @@ static const sd_bus_vtable resolve_vtable[] = { 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("Domains", "a(isb)", bus_property_get_domains, 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 a52bb0fa695..a499f76ad57 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-link-bus.c b/src/resolve/resolved-link-bus.c index fe997cd1e1f..8a2768b1e2c 100644 --- a/src/resolve/resolved-link-bus.c +++ b/src/resolve/resolved-link-bus.c @@ -296,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); @@ -675,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); } diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 486b7a87bec..6ebc0203591 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; }