diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 6179bd8f99..2adf612e3b 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 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-link-bus.c b/src/resolve/resolved-link-bus.c index fe997cd1e1..8a2768b1e2 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 486b7a87be..6ebc020359 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; }