From b881768ac1c3f8500a6eb4d39f85af7f3b1a0c1c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Feb 2010 23:39:47 -0500 Subject: [PATCH 20/22] 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 22a5a3d..ced8d53 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -1081,53 +1081,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 @@ -1168,9 +1183,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, RBAC_SHUTDOWN_KEY, do_stop); + check_rbac_permissions (manager, context, RBAC_SHUTDOWN_KEY, stop_all_sessions); #else g_warning ("Compiled without PolicyKit or RBAC support!"); #endif @@ -1750,12 +1765,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.6