From 254e9b97629165cb8e0ae8b235444baffbf3c6e4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Feb 2010 23:09:09 -0500 Subject: [PATCH 03/22] Unify the restart and stop code paths --- src/ck-manager.c | 144 +++++++++++++++++++----------------------------------- 1 files changed, 50 insertions(+), 94 deletions(-) diff --git a/src/ck-manager.c b/src/ck-manager.c index 1dfc789..f444f1e 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -83,6 +83,8 @@ struct CkManagerPrivate gboolean system_idle_hint; GTimeVal system_idle_since_hint; + + gboolean restart; }; enum { @@ -456,29 +458,9 @@ log_system_stop_event (CkManager *manager) memset (&event, 0, sizeof (CkLogEvent)); - event.type = CK_LOG_EVENT_SYSTEM_STOP; - g_get_current_time (&event.timestamp); - - error = NULL; - res = ck_event_logger_queue_event (manager->priv->logger, &event, &error); - if (! res) { - g_debug ("Unable to log event: %s", error->message); - g_error_free (error); - } - - /* FIXME: in this case we should block and wait for log to flush */ -} - -static void -log_system_restart_event (CkManager *manager) -{ - CkLogEvent event; - gboolean res; - GError *error; - - memset (&event, 0, sizeof (CkLogEvent)); - - event.type = CK_LOG_EVENT_SYSTEM_RESTART; + event.type = manager->priv->restart + ? CK_LOG_EVENT_SYSTEM_RESTART + : CK_LOG_EVENT_SYSTEM_STOP; g_get_current_time (&event.timestamp); error = NULL; @@ -1075,27 +1057,29 @@ out: #endif static void -do_restart (CkManager *manager, - DBusGMethodInvocation *context) +do_stop (CkManager *manager, + DBusGMethodInvocation *context) { GError *error; gboolean res; - g_debug ("ConsoleKit preforming Restart"); + g_debug ("ConsoleKit preforming %s", manager->priv->restart ? "Restart" : "Stop"); - log_system_restart_event (manager); + log_system_stop_event (manager); error = NULL; - res = g_spawn_command_line_async (PREFIX "/lib/ConsoleKit/scripts/ck-system-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 system: %s", error->message); + g_warning ("Unable to restart/stop system: %s", error->message); new_error = g_error_new (CK_MANAGER_ERROR, CK_MANAGER_ERROR_GENERAL, - "Unable to restart system: %s", error->message); + "Unable to restart/stop system: %s", error->message); dbus_g_method_return_error (context, new_error); g_error_free (new_error); @@ -1105,31 +1089,32 @@ do_restart (CkManager *manager, } } -/* - Example: - dbus-send --system --dest=org.freedesktop.ConsoleKit \ - --type=method_call --print-reply --reply-timeout=2000 \ - /org/freedesktop/ConsoleKit/Manager \ - org.freedesktop.ConsoleKit.Manager.Restart -*/ -gboolean -ck_manager_restart (CkManager *manager, - DBusGMethodInvocation *context) +static gboolean +restart_or_stop (CkManager *manager, + DBusGMethodInvocation *context) { const char *action; if (get_system_num_users (manager) > 1) { - action = "org.freedesktop.consolekit.system.restart-multiple-users"; + if (manager->priv->restart) { + action = "org.freedesktop.consolekit.system.restart-multiple-users"; + } else { + action = "org.freedesktop.consolekit.system.stop-multiple-users"; + } } else { - action = "org.freedesktop.consolekit.system.restart"; + if (manager->priv->restart) { + action = "org.freedesktop.consolekit.system.restart"; + } else { + action = "org.freedesktop.consolekit.system.stop"; + } } - g_debug ("ConsoleKit Restart: %s", action); + g_debug ("ConsoleKit Stop: %s", action); #if defined HAVE_POLKIT - check_polkit_permissions (manager, context, action, do_restart); + check_polkit_permissions (manager, context, action, do_stop); #elif defined ENABLE_RBAC_SHUTDOWN - check_rbac_permissions (manager, context, RBAC_SHUTDOWN_KEY, do_restart); + check_rbac_permissions (manager, context, RBAC_SHUTDOWN_KEY, do_stop); #else g_warning ("Compiled without PolicyKit or RBAC support!"); #endif @@ -1137,12 +1122,26 @@ ck_manager_restart (CkManager *manager, return TRUE; } +/* + Example: + dbus-send --system --dest=org.freedesktop.ConsoleKit \ + --type=method_call --print-reply --reply-timeout=2000 \ + /org/freedesktop/ConsoleKit/Manager \ + org.freedesktop.ConsoleKit.Manager.Restart +*/ gboolean -ck_manager_can_restart (CkManager *manager, +ck_manager_restart (CkManager *manager, DBusGMethodInvocation *context) +{ + manager->priv->restart = TRUE; + return restart_or_stop (manager, context); +} +gboolean +ck_manager_can_restart (CkManager *manager, + DBusGMethodInvocation *context) { - const char *action; + const char *action; action = "org.freedesktop.consolekit.system.restart"; @@ -1155,62 +1154,19 @@ ck_manager_can_restart (CkManager *manager, } else { dbus_g_method_return (context, FALSE); } +#else + dbus_g_method_return (context, TRUE); #endif return TRUE; } -static void -do_stop (CkManager *manager, - DBusGMethodInvocation *context) -{ - GError *error; - gboolean res; - - g_debug ("Stopping system"); - - log_system_stop_event (manager); - - error = NULL; - res = g_spawn_command_line_async (PREFIX "/lib/ConsoleKit/scripts/ck-system-stop", - &error); - if (! res) { - GError *new_error; - - g_warning ("Unable to stop system: %s", error->message); - - new_error = g_error_new (CK_MANAGER_ERROR, - CK_MANAGER_ERROR_GENERAL, - "Unable to stop system: %s", error->message); - dbus_g_method_return_error (context, new_error); - g_error_free (new_error); - g_error_free (error); - } else { - dbus_g_method_return (context); - } -} - gboolean ck_manager_stop (CkManager *manager, DBusGMethodInvocation *context) { - const char *action; - - if (get_system_num_users (manager) > 1) { - action = "org.freedesktop.consolekit.system.stop-multiple-users"; - } else { - action = "org.freedesktop.consolekit.system.stop"; - } - -#if defined HAVE_POLKIT - check_polkit_permissions (manager, context, action, do_stop); -#elif defined ENABLE_RBAC_SHUTDOWN - check_rbac_permissions (manager, context, RBAC_SHUTDOWN_KEY, do_stop); -#else - g_warning ("Compiled without PolicyKit or RBAC support!"); -#endif - - return TRUE; + manager->priv->restart = FALSE; + return restart_or_stop (manager, context); } gboolean -- 1.6.6