summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-12-15 14:15:55 -0600
committerDan Williams <dcbw@redhat.com>2014-12-16 09:26:32 -0600
commitc140f64b3982a5659ca4554f2b95d69a5733d2e7 (patch)
tree01351b8a7482317c85c0192eaf852befe21016f2
parentff362700f1ef1999b38e7524fa00371a7f146689 (diff)
downloadNetworkManager-c140f64b3982a5659ca4554f2b95d69a5733d2e7.tar.gz
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)
-rw-r--r--src/nm-sleep-monitor-systemd.c53
1 files 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