diff options
-rw-r--r-- | src/resolve/resolved-bus.c | 28 | ||||
-rw-r--r-- | src/resolve/resolved-bus.h | 2 | ||||
-rw-r--r-- | src/resolve/resolved-conf.c | 4 | ||||
-rw-r--r-- | src/resolve/resolved-conf.h | 3 | ||||
-rw-r--r-- | src/resolve/resolved-dns-server.c | 3 | ||||
-rw-r--r-- | src/resolve/resolved-link-bus.c | 11 | ||||
-rw-r--r-- | src/resolve/resolved-link-bus.h | 2 | ||||
-rw-r--r-- | src/resolve/resolved-manager.c | 7 | ||||
-rw-r--r-- | src/resolve/resolved-resolv-conf.c | 1 |
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; |