From 244c900f371748f8e41bab3dd876e94efd5ea547 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 13 Oct 2009 00:01:17 -0400 Subject: [PATCH 20/21] Make Stop/Restart stop all sessions Make Stop/Restart emit Stop signals to all sessions, and wait for the responses, for up to 11 seconds. --- src/ck-manager.c | 78 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/ck-manager.c b/src/ck-manager.c index 2f2dce9..3a12145 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -1075,53 +1075,68 @@ cleanup_after_stop (CkManager *manager) ck_manager_set_stopping (manager, FALSE); } -static void -do_stop (AuthReady *ready, - gint result, - GError *error) +static gboolean +do_stop (CkManager *manager) { - gboolean res; - - if (result < 0) { - GError *new_error; - - new_error = g_error_new (CK_MANAGER_ERROR, - CK_MANAGER_ERROR_GENERAL, - "Failed to obtain authorization: %s", error->message); - dbus_g_method_return_error (ready->context, new_error); - g_error_free (new_error); - cleanup_after_stop (ready->manager); + gboolean res; + GError *error; - return; + if (manager->priv->query_timeout > 0) { + g_source_remove (manager->priv->query_timeout); + manager->priv->query_timeout = 0; } - g_debug ("ConsoleKit preforming %s", ready->manager->priv->restart ? "Restart" : "Stop"); + g_debug ("ConsoleKit preforming %s", manager->priv->restart ? "Restart" : "Stop"); - log_system_stop_event (ready->manager); + log_system_stop_event (manager); error = NULL; - res = g_spawn_command_line_async (ready->manager->priv->restart + res = g_spawn_command_line_async (manager->priv->restart ? PREFIX "/lib/ConsoleKit/scripts/ck-system-restart" : PREFIX "/lib/ConsoleKit/scripts/ck-system-stop", &error); if (! res) { - GError *new_error; - g_warning ("Unable to restart/stop system: %s", error->message); + g_error_free (error); + cleanup_after_stop (manager); + + } + + return FALSE; +} + +static void +stop_all_sessions (AuthReady *ready, + gint result, + GError *error) +{ + GHashTableIter iter; + CkSession *session; + + if (result < 0) { + GError *new_error; new_error = g_error_new (CK_MANAGER_ERROR, CK_MANAGER_ERROR_GENERAL, - "Unable to restart/stop system: %s", error->message); + "Failed to obtain authorization: %s", error->message); dbus_g_method_return_error (ready->context, new_error); g_error_free (new_error); - g_error_free (error); cleanup_after_stop (ready->manager); return; - } + g_debug ("Restart or Stop call: complete, proceeding to stop sessions"); + dbus_g_method_return (ready->context); + + ready->manager->priv->query_timeout = g_timeout_add_seconds (11, (GSourceFunc)do_stop, ready->manager); + + g_hash_table_iter_init (&iter, ready->manager->priv->sessions); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&session)) { + ready->manager->priv->query_sessions = g_slist_prepend (ready->manager->priv->query_sessions, session); + ck_session_stop (session); + } } static gboolean @@ -1162,9 +1177,9 @@ restart_or_stop (CkManager *manager, g_debug ("ConsoleKit Stop: %s", action); #if defined HAVE_POLKIT - check_polkit_permissions (manager, context, action, do_stop); + check_polkit_permissions (manager, context, action, stop_all_sessions); #elif defined ENABLE_RBAC_SHUTDOWN - check_rbac_permissions (manager, context, do_stop); + check_rbac_permissions (manager, context, stop_all_sessions); #else g_warning ("Compiled without PolicyKit or RBAC support!"); #endif @@ -1731,12 +1746,15 @@ on_session_stop_response (CkSession *session, if (manager->priv->query_sessions == NULL) { - g_debug ("got all session responses"); + g_debug ("got all session responses"); - if (manager->priv->query_context != NULL) { - /* we are in a QueryStop call */ + if (manager->priv->query_context != NULL) { + /* we are in a QueryStop call */ query_stop_complete (manager); - } + } else if (manager->priv->stopping) { + /* we are in a Stop/Restart call */ + do_stop (manager); + } } } -- 1.6.5.rc2