diff options
author | Dan Williams <dcbw@redhat.com> | 2014-12-15 14:15:55 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-12-16 09:26:32 -0600 |
commit | c140f64b3982a5659ca4554f2b95d69a5733d2e7 (patch) | |
tree | 01351b8a7482317c85c0192eaf852befe21016f2 | |
parent | ff362700f1ef1999b38e7524fa00371a7f146689 (diff) | |
download | NetworkManager-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.c | 53 |
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 |