From 0a6c0745681f544508177f9abb93f9d637b2d002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 24 Oct 2019 15:14:09 +0200 Subject: resolved: avoid allocation While at it, constify the argument. --- src/resolve/resolved-bus.c | 3 ++- src/resolve/resolved-link-bus.c | 9 ++++----- src/resolve/resolved-link-bus.h | 2 +- src/resolve/resolved-resolv-conf.c | 1 - 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index db0f8381ef..920cb92a58 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -12,6 +12,7 @@ #include "resolved-dnssd-bus.h" #include "resolved-dnssd.h" #include "resolved-link-bus.h" +#include "stdio-util.h" #include "user-util.h" #include "utf8.h" @@ -68,7 +69,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; } diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c index b6c1476f5c..fe997cd1e1 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" @@ -735,15 +736,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-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; -- cgit v1.2.1 From b2c1554625b5f6efe80b93f5b7f3262a2e5b3343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 24 Oct 2019 15:24:00 +0200 Subject: resolved: one less {} --- src/resolve/resolved-bus.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 920cb92a58..6179bd8f99 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -1274,13 +1274,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); } -- cgit v1.2.1 From 8e97dc676fba15410d6b327bd89e6c9e7a24882f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 25 Oct 2019 07:54:58 +0200 Subject: resolved: make two functions static --- src/resolve/resolved-conf.c | 4 ++-- src/resolve/resolved-conf.h | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) 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); -- cgit v1.2.1 From 5f3340ca5b27899b6ab16bb48522a7911dcfb867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 25 Oct 2019 15:19:36 +0200 Subject: 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. --- src/resolve/resolved-bus.c | 18 +++++++++++++++++- src/resolve/resolved-bus.h | 2 ++ src/resolve/resolved-link-bus.c | 2 ++ src/resolve/resolved-manager.c | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) 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; } -- cgit v1.2.1 From 86c0411ee570ce01f73da819affec7ce75b8c0f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 25 Oct 2019 16:29:42 +0200 Subject: resolved: emit change for LLMNRHostname --- src/resolve/resolved-bus.c | 2 +- src/resolve/resolved-manager.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 2adf612e3b..4c18cb1597 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -1835,7 +1835,7 @@ 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), diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 6ebc020359..95f698ab06 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -438,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); @@ -446,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; @@ -458,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; } @@ -1173,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; } -- cgit v1.2.1 From 4a6f996c01db3375a6fd0eb69f7792f1149449bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 25 Oct 2019 16:36:19 +0200 Subject: resolved: emit change for CurrentDNSServer --- src/resolve/resolved-bus.c | 2 +- src/resolve/resolved-dns-server.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 4c18cb1597..2c1aba911a 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -1841,7 +1841,7 @@ static const sd_bus_vtable resolve_vtable[] = { 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, 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), 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; } -- cgit v1.2.1