return 0;
}
-static int on_bus_retry(sd_event_source *s, usec_t usec, void *userdata) {
- Manager *m = userdata;
-
- assert(s);
- assert(m);
-
- m->bus_retry_event_source = sd_event_source_unref(m->bus_retry_event_source);
-
- manager_connect_bus(m);
-
- return 0;
-}
-
static int manager_reset_all(Manager *m) {
Link *link;
Iterator i;
int b, r;
assert(message);
+ assert(m);
r = sd_bus_message_read(message, "b", &b);
if (r < 0) {
return 0;
}
-int manager_connect_bus(Manager *m) {
- int r;
+static int on_connected(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
+ Manager *m = userdata;
+ assert(message);
assert(m);
- r = sd_bus_default_system(&m->bus);
- if (r < 0) {
- /* We failed to connect? Yuck, we must be in early
- * boot. Let's try in 5s again. */
+ /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
+ if (m->dynamic_hostname)
+ (void) manager_set_hostname(m, m->dynamic_hostname);
+ if (m->dynamic_timezone)
+ (void) manager_set_timezone(m, m->dynamic_timezone);
- log_debug_errno(r, "Failed to connect to bus, trying again in 5s: %m");
+ return 0;
+}
- r = sd_event_add_time(m->event, &m->bus_retry_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + 5*USEC_PER_SEC, 0, on_bus_retry, m);
- if (r < 0)
- return log_error_errno(r, "Failed to install bus reconnect time event: %m");
+int manager_connect_bus(Manager *m) {
+ int r;
+
+ assert(m);
+ if (m->bus)
return 0;
- }
- r = sd_bus_match_signal_async(
- m->bus, &m->prepare_for_sleep_slot,
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "PrepareForSleep",
- match_prepare_for_sleep, NULL, m);
+ r = bus_open_system_watch_bind(&m->bus);
if (r < 0)
- return log_error_errno(r, "Failed to request match for PrepareForSleep: %m");
+ return log_error_errno(r, "Failed to connect to bus: %m");
r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m);
if (r < 0)
if (r < 0)
return log_error_errno(r, "Failed to attach bus to event loop: %m");
- /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
- if (m->dynamic_hostname) {
- r = manager_set_hostname(m, m->dynamic_hostname);
- if (r < 0)
- return r;
- }
- if (m->dynamic_timezone) {
- r = manager_set_timezone(m, m->dynamic_timezone);
- if (r < 0)
- return r;
- }
+ r = sd_bus_match_signal_async(
+ m->bus,
+ &m->connected_slot,
+ "org.freedesktop.DBus.Local",
+ NULL,
+ "org.freedesktop.DBus.Local",
+ "Connected",
+ on_connected, NULL, m);
+ if (r < 0)
+ return log_error_errno(r, "Failed to request match on Connected signal: %m");
+
+ r = sd_bus_match_signal_async(
+ m->bus,
+ &m->prepare_for_sleep_slot,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "PrepareForSleep",
+ match_prepare_for_sleep, NULL, m);
+ if (r < 0)
+ log_warning_errno(r, "Failed to request match for PrepareForSleep, ignoring: %m");
return 0;
}
sd_bus_unref(m->bus);
sd_bus_slot_unref(m->prepare_for_sleep_slot);
+ sd_bus_slot_unref(m->connected_slot);
sd_event_source_unref(m->bus_retry_event_source);
free(m->dynamic_timezone);
int r;
log_debug("Setting transient hostname: '%s'", strna(hostname));
+
if (free_and_strdup(&m->dynamic_hostname, hostname) < 0)
return log_oom();
- if (!m->bus) {
- /* TODO: replace by assert when we can rely on kdbus */
- log_info("Not connected to system bus, ignoring transient hostname.");
+ if (!m->bus || sd_bus_is_ready(m->bus) <= 0) {
+ log_info("Not connected to system bus, not setting hostname.");
return 0;
}
if (free_and_strdup(&m->dynamic_timezone, tz) < 0)
return log_oom();
- if (!m->bus) {
- log_info("Not connected to system bus, ignoring timezone.");
+ if (!m->bus || sd_bus_is_ready(m->bus) <= 0) {
+ log_info("Not connected to system bus, not setting hostname.");
return 0;
}
SD_BUS_VTABLE_END,
};
-static int on_bus_retry(sd_event_source *s, usec_t usec, void *userdata) {
- Manager *m = userdata;
-
- assert(s);
- assert(m);
-
- m->bus_retry_event_source = sd_event_source_unref(m->bus_retry_event_source);
-
- manager_connect_bus(m);
- return 0;
-}
-
static int match_prepare_for_sleep(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
Manager *m = userdata;
int b, r;
if (m->bus)
return 0;
- r = sd_bus_default_system(&m->bus);
- if (r < 0) {
- /* We failed to connect? Yuck, we must be in early
- * boot. Let's try in 5s again. */
-
- log_debug_errno(r, "Failed to connect to bus, trying again in 5s: %m");
-
- r = sd_event_add_time(m->event, &m->bus_retry_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + 5*USEC_PER_SEC, 0, on_bus_retry, m);
- if (r < 0)
- return log_error_errno(r, "Failed to install bus reconnect time event: %m");
-
- (void) sd_event_source_set_description(m->bus_retry_event_source, "bus-retry");
- return 0;
- }
+ r = bus_open_system_watch_bind(&m->bus);
+ if (r < 0)
+ return log_error_errno(r, "Failed to connect to system bus: %m");
r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/resolve1", "org.freedesktop.resolve1.Manager", resolve_vtable, m);
if (r < 0)
NULL,
m);
if (r < 0)
- log_error_errno(r, "Failed to request match for PrepareForSleep: %m");
+ log_warning_errno(r, "Failed to request match for PrepareForSleep, ignoring: %m");
return 0;
}