Merge pull request #19542 from yuwata/unit-after-socket
network, timesync, resolve: check bus is ready before emitting property change or signal
This commit is contained in:
@@ -81,6 +81,9 @@ static int dhcp_server_emit_changed(Link *link, const char *property, ...) {
|
||||
|
||||
assert(link);
|
||||
|
||||
if (sd_bus_is_ready(link->manager->bus) <= 0)
|
||||
return 0;
|
||||
|
||||
path = link_bus_path(link);
|
||||
if (!path)
|
||||
return log_oom();
|
||||
|
||||
@@ -2272,6 +2272,9 @@ int manager_connect_bus(Manager *m) {
|
||||
int _manager_send_changed(Manager *manager, const char *property, ...) {
|
||||
assert(manager);
|
||||
|
||||
if (sd_bus_is_ready(manager->bus) <= 0)
|
||||
return 0;
|
||||
|
||||
char **l = strv_from_stdarg_alloca(property);
|
||||
|
||||
int r = sd_bus_emit_properties_changed_strv(
|
||||
|
||||
@@ -500,7 +500,7 @@ void dns_zone_item_conflict(DnsZoneItem *i) {
|
||||
/* Withdraw the conflict item */
|
||||
i->state = DNS_ZONE_ITEM_WITHDRAWN;
|
||||
|
||||
dnssd_signal_conflict(i->scope->manager, dns_resource_key_name(i->rr->key));
|
||||
(void) dnssd_signal_conflict(i->scope->manager, dns_resource_key_name(i->rr->key));
|
||||
|
||||
/* Maybe change the hostname */
|
||||
if (manager_is_own_hostname(i->scope->manager, dns_resource_key_name(i->rr->key)) > 0)
|
||||
|
||||
@@ -329,10 +329,13 @@ int dnssd_txt_item_new_from_data(const char *key, const void *data, const size_t
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dnssd_signal_conflict(Manager *manager, const char *name) {
|
||||
int dnssd_signal_conflict(Manager *manager, const char *name) {
|
||||
DnssdService *s;
|
||||
int r;
|
||||
|
||||
if (sd_bus_is_ready(manager->bus) <= 0)
|
||||
return 0;
|
||||
|
||||
HASHMAP_FOREACH(s, manager->dnssd_services) {
|
||||
if (s->withdrawn)
|
||||
continue;
|
||||
@@ -343,22 +346,20 @@ void dnssd_signal_conflict(Manager *manager, const char *name) {
|
||||
s->withdrawn = true;
|
||||
|
||||
r = sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", s->name, &path);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Can't get D-BUS object path: %m");
|
||||
return;
|
||||
}
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Can't get D-BUS object path: %m");
|
||||
|
||||
r = sd_bus_emit_signal(manager->bus,
|
||||
path,
|
||||
"org.freedesktop.resolve1.DnssdService",
|
||||
"Conflicted",
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Cannot emit signal: %m");
|
||||
return;
|
||||
}
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Cannot emit signal: %m");
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -58,4 +58,4 @@ int dnssd_load(Manager *manager);
|
||||
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
|
||||
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);
|
||||
int dnssd_update_rrs(DnssdService *s);
|
||||
void dnssd_signal_conflict(Manager *manager, const char *name);
|
||||
int dnssd_signal_conflict(Manager *manager, const char *name);
|
||||
|
||||
@@ -395,7 +395,8 @@ int local_outbounds(
|
||||
sa.in = (struct sockaddr_in) {
|
||||
.sin_family = AF_INET,
|
||||
.sin_addr = gateways[i].address.in,
|
||||
.sin_port = htobe16(53), /* doesn't really matter which port we pick — we just care about the routing decision */
|
||||
.sin_port = htobe16(53), /* doesn't really matter which port we pick —
|
||||
* we just care about the routing decision */
|
||||
};
|
||||
|
||||
break;
|
||||
@@ -427,7 +428,7 @@ int local_outbounds(
|
||||
* good chance this fails. Since 5.7 this restriction was dropped and the first
|
||||
* SO_BINDTOINDEX on a socket may be done without privileges. This one has the benefit of
|
||||
* really influencing the routing decision, i.e. this one definitely works for us — as long
|
||||
* as we have the privileges for it.*/
|
||||
* as we have the privileges for it. */
|
||||
r = socket_bind_to_ifindex(fd, gateways[i].ifindex);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to bind socket to interface %i, ignoring: %m", gateways[i].ifindex);
|
||||
@@ -438,7 +439,7 @@ int local_outbounds(
|
||||
* *after* the routing decision and the auto-binding already took place. If so we can still
|
||||
* make use of the binding and return it. Hence, let's not unnecessarily fail early here: we
|
||||
* can still easily detect if the auto-binding worked or not, by comparing the bound IP
|
||||
* address with zero — which we do below. */
|
||||
* address with zero — which we do below. */
|
||||
if (connect(fd, &sa.sa, SOCKADDR_LEN(sa)) < 0)
|
||||
log_debug_errno(errno, "Failed to connect SOCK_DGRAM socket to gateway, ignoring: %m");
|
||||
|
||||
|
||||
@@ -607,7 +607,13 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
|
||||
m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_freq / 65536,
|
||||
spike ? " (ignored)" : "");
|
||||
|
||||
(void) sd_bus_emit_properties_changed(m->bus, "/org/freedesktop/timesync1", "org.freedesktop.timesync1.Manager", "NTPMessage", NULL);
|
||||
if (sd_bus_is_ready(m->bus) > 0)
|
||||
(void) sd_bus_emit_properties_changed(
|
||||
m->bus,
|
||||
"/org/freedesktop/timesync1",
|
||||
"org.freedesktop.timesync1.Manager",
|
||||
"NTPMessage",
|
||||
NULL);
|
||||
|
||||
if (!m->good) {
|
||||
_cleanup_free_ char *pretty = NULL;
|
||||
|
||||
Reference in New Issue
Block a user