13001N/A--- src/gpm-manager.c.orig 2008-03-30 01:28:02.535684000 +0800
13001N/A+++ src/gpm-manager.c 2008-03-30 01:23:38.211239000 +0800
18241N/A@@ -436,6 +414,61 @@
13001N/A return TRUE;
13001N/A }
13001N/A
13001N/A+
13001N/A+#define GSM_DBUS_SERVICE "org.gnome.SessionManager"
13001N/A+#define GSM_DBUS_PATH "/org/gnome/SessionManager"
13001N/A+#define GSM_DBUS_INTERFACE "org.gnome.SessionManager"
13001N/A+
18241N/A+#include <pwd.h>
18241N/A+
18241N/A+static gboolean
18241N/A+can_shutdown ()
18241N/A+{
18241N/A+ uid_t uid;
18241N/A+ struct passwd *pw;
18241N/A+
18241N/A+ uid = getuid ();
18241N/A+ if ((pw = getpwuid (uid)) != NULL) {
18241N/A+ return (gboolean)chkauthattr ("solaris.system.shutdown", pw->pw_name);
18241N/A+ }
18241N/A+ return FALSE;
18241N/A+}
18241N/A+
13001N/A+/**
13001N/A+ * gsm_dbus_method:
13001N/A+ * @method: The g-s-m DBUS method name, e.g. "Logout" or "Shutdown"
13001N/A+ **/
13001N/A+static gboolean
13001N/A+gpm_manager_action_interactive (GpmManager *manager)
13001N/A+{
13001N/A+ DBusGConnection *connection;
13001N/A+ DBusGProxy *proxy;
13001N/A+ GError *error = NULL;
13001N/A+
18241N/A+ if (can_shutdown() == FALSE)
18241N/A+ return FALSE;
18241N/A+
13001N/A+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
13001N/A+ if (connection == NULL) {
13001N/A+ if (error) {
14471N/A+ egg_warning ("Couldn't connect to PowerManager %s",
13001N/A+ error->message);
13001N/A+ g_error_free (error);
13001N/A+ }
13001N/A+ return FALSE;
13001N/A+ }
13001N/A+
13001N/A+ proxy = dbus_g_proxy_new_for_name (connection,
13001N/A+ GSM_DBUS_SERVICE,
13001N/A+ GSM_DBUS_PATH,
13001N/A+ GSM_DBUS_INTERFACE);
13001N/A+ dbus_g_proxy_call_no_reply (proxy, "Shutdown",
13001N/A+ G_TYPE_INVALID,
13001N/A+ G_TYPE_INVALID);
13001N/A+ g_object_unref (proxy);
13001N/A+ return TRUE;
13001N/A+}
13001N/A+
13001N/A /**
13001N/A * manager_policy_do:
13001N/A * @manager: This class instance
13001N/A@@ -495,9 +510,8 @@
13001N/A } else if (strcmp (action, ACTION_INTERACTIVE) == 0) {
13001N/A gpm_info_explain_reason (manager->priv->info, GPM_EVENT_NOTIFICATION,
13001N/A _("GNOME interactive logout."), reason);
13001N/A- gnome_client_request_save (gnome_master_client (),
13001N/A- GNOME_SAVE_GLOBAL,
13001N/A- TRUE, GNOME_INTERACT_ANY, FALSE, TRUE);
13001N/A+ if (gpm_manager_action_interactive (manager) == FALSE)
14471N/A+ egg_warning ("Couldn't ask for interactive dialog from session manager");
13001N/A } else {
14471N/A egg_warning ("unknown action %s", action);
13001N/A }