From c140f64b3982a5659ca4554f2b95d69a5733d2e7 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 15 Dec 2014 14:15:55 -0600 Subject: [PATCH] core: don't auto-launch logind (bgo #741572) logind might need the network for login information, and apparently it fails hard if the network isn't up, and apparently it doesn't recover when the network does come up. Since NM doesn't actually care about suspend/resume until logind is running anyway, don't auto-launch it. Just wait until it shows up. While we're at it, make proxy creation async. https://bugzilla.gnome.org/show_bug.cgi?id=741572 (cherry picked from commit 5a051ad71671b5808f7b57d5d2cdaaa7b4a66d67) --- src/nm-sleep-monitor-systemd.c | 53 ++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/nm-sleep-monitor-systemd.c b/src/nm-sleep-monitor-systemd.c index e3844aec14..c0bc65e4a6 100644 --- a/src/nm-sleep-monitor-systemd.c +++ b/src/nm-sleep-monitor-systemd.c @@ -148,24 +148,59 @@ signal_cb (GDBusProxy *proxy, } static void -sleep_setup (NMSleepMonitor *self) +name_owner_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) { - GDBusConnection *bus; + GDBusProxy *proxy = G_DBUS_PROXY (object); + NMSleepMonitor *self = NM_SLEEP_MONITOR (user_data); + char *owner; - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); - self->sd_proxy = g_dbus_proxy_new_sync (bus, 0, NULL, - SD_NAME, SD_PATH, SD_INTERFACE, - NULL, NULL); - g_object_unref (bus); + g_assert (proxy == self->sd_proxy); + + owner = g_dbus_proxy_get_name_owner (proxy); + if (owner) + take_inhibitor (self); + else + drop_inhibitor (self); + g_free (owner); +} + +static void +on_proxy_acquired (GObject *object, + GAsyncResult *res, + NMSleepMonitor *self) +{ + GError *error = NULL; + char *owner; + + self->sd_proxy = g_dbus_proxy_new_for_bus_finish (res, &error); + if (!self->sd_proxy) { + nm_log_warn (LOGD_SUSPEND, "Failed to acquire logind proxy: %s", error->message); + g_clear_error (&error); + return; + } + + g_signal_connect (self->sd_proxy, "notify::g-name-owner", G_CALLBACK (name_owner_cb), self); g_signal_connect (self->sd_proxy, "g-signal", G_CALLBACK (signal_cb), self); + + owner = g_dbus_proxy_get_name_owner (self->sd_proxy); + if (owner) + take_inhibitor (self); + g_free (owner); } static void nm_sleep_monitor_init (NMSleepMonitor *self) { self->inhibit_fd = -1; - sleep_setup (self); - take_inhibitor (self); + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + SD_NAME, SD_PATH, SD_INTERFACE, + NULL, + (GAsyncReadyCallback) on_proxy_acquired, self); } static void