]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: send out notifications about DNS property
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 25 Oct 2019 13:19:36 +0000 (15:19 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 25 Oct 2019 14:40:54 +0000 (16:40 +0200)
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.

src/resolve/resolved-bus.c
src/resolve/resolved-bus.h
src/resolve/resolved-link-bus.c
src/resolve/resolved-manager.c

index 6179bd8f998b0a1aeaa7215acbb680d338ebc917..2adf612e3b26ae293b1bb3cad9fc5ea2f24092fa 100644 (file)
@@ -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;
+}
index a52bb0fa6959ad123f65c9b837cdfe77b1902285..a499f76ad573ecce82d9475dba97152eb6a9fd8d 100644 (file)
@@ -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,
index fe997cd1e1ff7b6dbd370c189d784addf6747a33..8a2768b1e2c8e60bf6e92a6d24cab0152ceffddc 100644 (file)
@@ -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);
 }
index 486b7a87bec02b49c2a7e9d960ed5200f38e2b6a..6ebc020359120445f02d0e8ab4dcc5fab1316614 100644 (file)
@@ -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;
 }