[gnome-system-monitor/f14/master] 2.28.2
Matthias Clasen
mclasen at fedoraproject.org
Thu Sep 30 18:49:26 UTC 2010
commit 6c30e1e224bb8b6f68186be34b89df194eeadd63
Author: Matthias Clasen <mclasen at redhat.com>
Date: Wed Sep 29 11:03:14 2010 -0400
2.28.2
.gitignore | 1 +
gnome-system-monitor-2.25.91-polkit.patch | 546 ++++---------
gnome-system-monitor.spec | 19 +-
polkit.patch | 1274 +++++++++++++++++++++++++++++
sources | 2 +-
5 files changed, 1455 insertions(+), 387 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 8cf38c5..65e8ea1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
gnome-system-monitor-2.28.1.tar.bz2
+/gnome-system-monitor-2.28.2.tar.bz2
diff --git a/gnome-system-monitor-2.25.91-polkit.patch b/gnome-system-monitor-2.25.91-polkit.patch
index b5e863c..a430709 100644
--- a/gnome-system-monitor-2.25.91-polkit.patch
+++ b/gnome-system-monitor-2.25.91-polkit.patch
@@ -1,52 +1,45 @@
-diff -up gnome-system-monitor-2.26.1/configure.in.polkit gnome-system-monitor-2.26.1/configure.in
---- gnome-system-monitor-2.26.1/configure.in.polkit 2009-04-10 18:33:14.000000000 -0400
-+++ gnome-system-monitor-2.26.1/configure.in 2009-04-23 15:01:02.779508852 -0400
-@@ -35,10 +35,41 @@ GIOMM_REQUIRED=2.16.0
+diff -up gnome-system-monitor-2.28.2/configure.in.polkit gnome-system-monitor-2.28.2/configure.in
+--- gnome-system-monitor-2.28.2/configure.in.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/configure.in 2010-09-30 13:00:35.606603002 -0400
+@@ -35,10 +35,35 @@ GIOMM_REQUIRED=2.16.0
GLIBMM_REQUIRED=2.14
LIBXML_REQUIRED=2.0
RSVG_REQUIRED=2.12
-DBUS_REQUIRED=0.7
--
--PKG_CHECK_MODULES(PROCMAN, glib-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-icon-theme >= $GNOME_ICON_THEME_REQUIRED gtkmm-2.4 >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED dbus-glib-1 >= $DBUS_REQUIRED)
-+POLKIT_GNOME_REQUIRED=0.7
-+POLKIT_DBUS_REQUIRED=0.7
++POLKIT_REQUIRED=0.92
+DBUS_GLIB_REQUIRED=0.71
+DBUS_REQUIRED=1.1.2
-+
-+
+
+-PKG_CHECK_MODULES(PROCMAN, glib-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-icon-theme >= $GNOME_ICON_THEME_REQUIRED gtkmm-2.4 >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED dbus-glib-1 >= $DBUS_REQUIRED)
+
+PKG_CHECK_MODULES(PROCMAN, glib-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-icon-theme >= $GNOME_ICON_THEME_REQUIRED gtkmm-2.4 >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED dbus-glib-1 >= $DBUS_GLIB_REQUIRED)
+
+# PolicyKit detection; defaults to 'auto' (use it if it's available)
+#
-+POLKIT_GNOME_CFLAGS=
-+POLKIT_GNOME_LIBS=
-+POLKIT_DBUS_CFLAGS=
-+POLKIT_DBUS_LIBS=
++POLKIT_CFLAGS=
++POLKIT_LIBS=
+AC_ARG_ENABLE(polkit, AS_HELP_STRING([--enable-polkit],[Enable PolicyKit support (auto)]),enable_polkit=$enableval,enable_polkit=auto)
+if test "x$enable_polkit" = "xno" ; then
+ HAVE_POLKIT=no
+else
+ HAVE_POLKIT=no
-+ PKG_CHECK_MODULES(POLKIT_GNOME, polkit-gnome >= $POLKIT_GNOME_REQUIRED dbus-1 >= $DBUS_REQUIRED, HAVE_POLKIT=yes, HAVE_POLKIT=no)
-
++ PKG_CHECK_MODULES(POLKIT, polkit-gobject-1 >= $POLKIT_REQUIRED dbus-1 >= $DBUS_REQUIRED dbus-glib-1 >= $DBUS_GLIB_REQUIRED gobject-2.0, HAVE_POLKIT=yes, HAVE_POLKIT=no)
++
+ if test "x$enable_polkit" = "xyes" -a "x$HAVE_POLKIT" = "xno" ; then
+ AC_MSG_ERROR(PolicyKit support explicity enabled but not available)
+ fi
+
+ if test "x$HAVE_POLKIT" = "xyes" ; then
+ AC_DEFINE(HAVE_POLKIT, 1, [Defined if PolicyKit support is enabled])
-+ PKG_CHECK_MODULES(POLKIT_DBUS, polkit-dbus >= $POLKIT_DBUS_REQUIRED dbus-glib-1 >= $DBUS_GLIB_REQUIRED gobject-2.0)
+ fi
+fi
+AM_CONDITIONAL(HAVE_POLKIT, test "x$HAVE_POLKIT" = "xyes")
-+AC_SUBST(POLKIT_GNOME_CFLAGS)
-+AC_SUBST(POLKIT_GNOME_LIBS)
-+AC_SUBST(POLKIT_DBUS_CFLAGS)
-+AC_SUBST(POLKIT_DBUS_LIBS)
++AC_SUBST(POLKIT_CFLAGS)
++AC_SUBST(POLKIT_LIBS)
AC_ARG_ENABLE(more-warnings,
[AC_HELP_STRING([--enable-more-warnings], [Maximum compiler warnings])],
-@@ -98,6 +129,7 @@ Configuration:
+@@ -98,6 +123,7 @@ Configuration:
C++ Compiler: ${CXX}
CFLAGS: ${CFLAGS}
CXXFLAGS: ${CXXFLAGS}
@@ -54,9 +47,9 @@ diff -up gnome-system-monitor-2.26.1/configure.in.polkit gnome-system-monitor-2.
Maintainer mode: ${USER_MAINTAINER_MODE}
Languages: ${ALL_LINGUAS}
"
-diff -up gnome-system-monitor-2.26.1/po/POTFILES.in.polkit gnome-system-monitor-2.26.1/po/POTFILES.in
---- gnome-system-monitor-2.26.1/po/POTFILES.in.polkit 2009-04-13 15:36:22.000000000 -0400
-+++ gnome-system-monitor-2.26.1/po/POTFILES.in 2009-04-23 15:01:02.779508852 -0400
+diff -up gnome-system-monitor-2.28.2/po/POTFILES.in.polkit gnome-system-monitor-2.28.2/po/POTFILES.in
+--- gnome-system-monitor-2.28.2/po/POTFILES.in.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/po/POTFILES.in 2010-09-30 13:00:35.584603002 -0400
@@ -8,6 +8,7 @@ src/callbacks.cpp
src/defaulttable.h
src/disks.cpp
@@ -65,35 +58,11 @@ diff -up gnome-system-monitor-2.26.1/po/POTFILES.in.polkit gnome-system-monitor-
src/gnome-system-monitor.schemas.in
src/gsm_color_button.c
src/interface.cpp
-diff -up gnome-system-monitor-2.26.1/src/callbacks.cpp.polkit gnome-system-monitor-2.26.1/src/callbacks.cpp
---- gnome-system-monitor-2.26.1/src/callbacks.cpp.polkit 2009-01-20 16:00:27.000000000 -0500
-+++ gnome-system-monitor-2.26.1/src/callbacks.cpp 2009-04-23 15:01:24.243745907 -0400
-@@ -210,11 +210,13 @@ cb_app_delete (GtkWidget *window, GdkEve
-
-
-
-+#ifndef HAVE_POLKIT
- void
- cb_end_process_button_pressed (GtkButton *button, gpointer data)
- {
- kill_process_helper(static_cast<ProcData*>(data), SIGTERM);
- }
-+#endif
-
-
- static void change_gconf_color(GConfClient *client, const char *key,
-@@ -286,6 +288,7 @@ cb_row_selected (GtkTreeSelection *selec
- ProcData * const procdata = static_cast<ProcData*>(data);
-
- procdata->selection = selection;
-+ procdata->selected_process = NULL;
-
- /* get the most recent selected process and determine if there are
- ** no selected processes
-diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanism.c
---- /dev/null 2009-04-23 10:50:49.279044520 -0400
-+++ gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanism.c 2009-04-23 15:01:02.782492856 -0400
-@@ -0,0 +1,640 @@
+diff -up gnome-system-monitor-2.28.2/src/callbacks.cpp.polkit gnome-system-monitor-2.28.2/src/callbacks.cpp
+diff -up gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c.polkit gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c
+--- gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c.polkit 2010-09-30 13:00:35.587603002 -0400
++++ gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c 2010-09-30 13:00:35.609603002 -0400
+@@ -0,0 +1,592 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 David Zeuthen <david at fubar.dk>
@@ -136,7 +105,7 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+#include <glib-object.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
-+#include <polkit-dbus/polkit-dbus.h>
++#include <polkit/polkit.h>
+
+static gboolean no_exit = FALSE;
+
@@ -220,7 +189,7 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+{
+ DBusGConnection *system_bus_connection;
+ DBusGProxy *system_bus_proxy;
-+ PolKitContext *pol_ctx;
++ PolkitAuthority *pol_ctx;
+};
+
+static void gnome_system_monitor_mechanism_class_init (GnomeSystemMonitorMechanismClass *klass);
@@ -328,50 +297,11 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+}
+
+static gboolean
-+pk_io_watch_have_data (GIOChannel *channel, GIOCondition condition, gpointer user_data)
-+{
-+ int fd;
-+ PolKitContext *pk_context = user_data;
-+ fd = g_io_channel_unix_get_fd (channel);
-+ polkit_context_io_func (pk_context, fd);
-+ return TRUE;
-+}
-+
-+static int
-+pk_io_add_watch (PolKitContext *pk_context, int fd)
-+{
-+ guint id = 0;
-+ GIOChannel *channel;
-+ channel = g_io_channel_unix_new (fd);
-+ if (channel == NULL)
-+ goto out;
-+ id = g_io_add_watch (channel, G_IO_IN, pk_io_watch_have_data, pk_context);
-+ if (id == 0) {
-+ g_io_channel_unref (channel);
-+ goto out;
-+ }
-+ g_io_channel_unref (channel);
-+out:
-+ return id;
-+}
-+
-+static void
-+pk_io_remove_watch (PolKitContext *pk_context, int watch_id)
-+{
-+ g_source_remove (watch_id);
-+}
-+
-+static gboolean
+register_mechanism (GnomeSystemMonitorMechanism *mechanism)
+{
+ GError *error = NULL;
+
-+ mechanism->priv->pol_ctx = polkit_context_new ();
-+ polkit_context_set_io_watch_functions (mechanism->priv->pol_ctx, pk_io_add_watch, pk_io_remove_watch);
-+ if (!polkit_context_init (mechanism->priv->pol_ctx, NULL)) {
-+ g_critical ("cannot initialize libpolkit");
-+ goto error;
-+ }
++ mechanism->priv->pol_ctx = polkit_authority_get ();
+
+ error = NULL;
+ mechanism->priv->system_bus_connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
@@ -417,93 +347,66 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+ return GNOME_SYSTEM_MONITOR_MECHANISM (object);
+}
+
-+static PolKitCaller *
++static PolkitSubject *
+get_caller_from_context (GnomeSystemMonitorMechanism *mechanism, DBusGMethodInvocation *context)
+{
-+ const char *sender;
-+ GError *error;
-+ DBusError dbus_error;
-+ PolKitCaller *pk_caller;
++ char *sender;
++ PolkitSubject *pk_caller;
+
+ sender = dbus_g_method_get_sender (context);
-+ dbus_error_init (&dbus_error);
-+ pk_caller = polkit_caller_new_from_dbus_name (
-+ dbus_g_connection_get_connection (mechanism->priv->system_bus_connection),
-+ sender,
-+ &dbus_error);
-+ if (pk_caller == NULL) {
-+ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
-+ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
-+ "Error getting information about caller: %s: %s",
-+ dbus_error.name, dbus_error.message);
-+ dbus_error_free (&dbus_error);
-+ dbus_g_method_return_error (context, error);
-+ g_error_free (error);
-+ return NULL;
-+ }
++ pk_caller = polkit_system_bus_name_new (sender);
++ g_free (sender);
+
+ return pk_caller;
+}
+
-+/* note, we take ownership of the passed PolKitCaller object */
++/* note, we take ownership of the passed PolkitSubject object */
+static gboolean
-+_check_polkit_for_action_for_caller (GnomeSystemMonitorMechanism *mechanism,
++_check_polkit_for_action_for_caller (GnomeSystemMonitorMechanism *mechanism,
+ DBusGMethodInvocation *context,
-+ PolKitCaller *pk_caller,
-+ const char *action,
-+ const char *action_secondary)
++ PolkitSubject *subject,
++ const char *action)
+{
+ GError *error;
-+ PolKitAction *pk_action;
-+ PolKitResult pk_result;
++ PolkitAuthorizationResult *result;
+
+ error = NULL;
+
-+ pk_action = polkit_action_new ();
-+ polkit_action_set_action_id (pk_action, action);
-+ pk_result = polkit_context_is_caller_authorized (mechanism->priv->pol_ctx,
-+ pk_action,
-+ pk_caller,
-+ TRUE,
-+ NULL);
-+ if (pk_result != POLKIT_RESULT_YES) {
-+ polkit_action_set_action_id (pk_action, action_secondary);
-+ pk_result = polkit_context_is_caller_authorized (mechanism->priv->pol_ctx,
-+ pk_action,
-+ pk_caller,
-+ TRUE,
-+ NULL);
-+ }
-+ polkit_action_unref (pk_action);
-+ polkit_caller_unref (pk_caller);
++ result = polkit_authority_check_authorization_sync (mechanism->priv->pol_ctx,
++ subject,
++ action,
++ NULL,
++ POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
++ NULL, NULL);
++ g_object_unref (subject);
+
-+ if (pk_result != POLKIT_RESULT_YES) {
++ if (!polkit_authorization_result_get_is_authorized (result)) {
+ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
+ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_NOT_PRIVILEGED,
-+ "%s %s <-- (action, result)",
-+ action,
-+ polkit_result_to_string_representation (pk_result));
++ "%s",
++ action);
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
++ g_object_unref (result);
+ return FALSE;
+ }
+
++ g_object_unref (result);
+ return TRUE;
+}
+
+static gboolean
-+_check_polkit_for_action (GnomeSystemMonitorMechanism *mechanism,
-+ DBusGMethodInvocation *context,
-+ const char *action,
-+ const char *action_secondary)
++_check_polkit_for_action (GnomeSystemMonitorMechanism *mechanism,
++ DBusGMethodInvocation *context,
++ const char *action)
+{
-+ PolKitCaller *pk_caller;
++ PolkitSubject *subject;
+
+ /* Check that caller is privileged */
-+ if ((pk_caller = get_caller_from_context (mechanism, context)) == NULL)
++ if ((subject = get_caller_from_context (mechanism, context)) == NULL)
+ return FALSE;
+
-+ return _check_polkit_for_action_for_caller (mechanism, context, pk_caller, action, action_secondary);
++ return _check_polkit_for_action_for_caller (mechanism, context, subject, action);
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
@@ -517,7 +420,7 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+{
+ reset_killtimer ();
+
-+ if (!_check_polkit_for_action (mechanism, context, "org.gnome.system-monitor.kill", NULL))
++ if (!_check_polkit_for_action (mechanism, context, "org.gnome.system-monitor.kill"))
+ return FALSE;
+
+ g_debug ("Sending signal %d to pid %d", sig, pid);
@@ -537,6 +440,28 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+ return TRUE;
+}
+
++static gboolean
++get_uid_from_context (GnomeSystemMonitorMechanism *mechanism,
++ DBusGMethodInvocation *context,
++ uid_t *uid)
++{
++ char *sender;
++ DBusConnection *con;
++
++ con = dbus_g_connection_get_connection (dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL));
++ if (con == NULL)
++ return FALSE;
++
++ sender = dbus_g_method_get_sender (context);
++ *uid = dbus_bus_get_unix_user (con, sender, NULL);
++ g_free (sender);
++
++ if (*uid == (unsigned)-1)
++ return FALSE;
++
++ return TRUE;
++}
++
+gboolean
+gnome_system_monitor_mechanism_renice (GnomeSystemMonitorMechanism *mechanism,
+ int pid,
@@ -545,11 +470,10 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+{
+ uid_t caller_uid;
+ uid_t process_uid;
-+ PolKitCaller *pk_caller;
++ PolkitSubject *subject;
+ char *procpath;
+ struct stat statbuf;
+ const char *action_id;
-+ const char *action_id_secondary;
+
+ reset_killtimer ();
+
@@ -569,11 +493,11 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+ g_free (procpath);
+ process_uid = statbuf.st_uid;
+
-+ pk_caller = get_caller_from_context (mechanism, context);
-+ if (pk_caller == NULL)
++ subject = get_caller_from_context (mechanism, context);
++ if (subject == NULL)
+ return FALSE;
+
-+ if (!polkit_caller_get_uid (pk_caller, &caller_uid)) {
++ if (!get_uid_from_context (mechanism, context, &caller_uid)) {
+ GError *error;
+ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
+ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
@@ -581,24 +505,21 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+ g_warning ("Error: %s", error->message);
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
-+ polkit_caller_unref (pk_caller);
++ g_object_unref (subject);
+ return FALSE;
+ }
+
+ if (caller_uid == process_uid) {
-+ /* we need either .increase-own-priority or .change-priority */
+ action_id = "org.gnome.system-monitor.increase-own-priority";
-+ action_id_secondary = "org.gnome.system-monitor.change-priority";
+ } else {
+ action_id = "org.gnome.system-monitor.change-priority";
-+ action_id_secondary = NULL;
+ }
+
-+ if (!_check_polkit_for_action_for_caller (mechanism, context, pk_caller, action_id, action_id_secondary)) {
++ if (!_check_polkit_for_action_for_caller (mechanism, context, subject, action_id)) {
+ return FALSE;
+ }
+
-+ g_debug ("Renicing pid %d (owned by uid %d) to priority %d on behalf of uid %d (action_id=%s)",
++ g_debug ("Renicing pid %d (owned by uid %d) to priority %d on behalf of uid %d (action_id=%s)",
+ pid, process_uid, nice_value, caller_uid, action_id);
+
+ errno = 0;
@@ -734,9 +655,9 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+out:
+ return ret;
+}
-diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanism.xml
---- /dev/null 2009-04-23 10:50:49.279044520 -0400
-+++ gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanism.xml 2009-04-23 15:01:02.782492856 -0400
+diff -up gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml.polkit gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml
+--- gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml.polkit 2010-09-30 13:00:35.588603002 -0400
++++ gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml 2010-09-30 13:00:35.588603002 -0400
@@ -0,0 +1,15 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/">
@@ -753,15 +674,15 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/gnome-system-monitor-mechanis
+ </method>
+ </interface>
+</node>
-diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monitor-2.26.1/src/interface.cpp
---- gnome-system-monitor-2.26.1/src/interface.cpp.polkit 2009-04-10 18:33:14.000000000 -0400
-+++ gnome-system-monitor-2.26.1/src/interface.cpp 2009-04-23 15:02:01.567746154 -0400
+diff -up gnome-system-monitor-2.28.2/src/interface.cpp.polkit gnome-system-monitor-2.28.2/src/interface.cpp
+--- gnome-system-monitor-2.28.2/src/interface.cpp.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/interface.cpp 2010-09-30 13:00:35.611603002 -0400
@@ -30,6 +30,10 @@
#include <gdk/gdkkeysyms.h>
#include <math.h>
+#ifdef HAVE_POLKIT
-+# include <polkit-gnome/polkit-gnome.h>
++# include <polkit/polkit.h>
+#endif
+
#include "procman.h"
@@ -783,12 +704,14 @@ diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monit
{ "ChangePriority", NULL, N_("_Change Priority..."), "<control>N",
N_("Change the order of priority of process"), G_CALLBACK (cb_renice) },
{ "Preferences", GTK_STOCK_PREFERENCES, NULL, NULL,
-@@ -186,10 +192,14 @@ create_proc_view (ProcData *procdata)
+@@ -186,10 +192,16 @@ create_proc_view (ProcData *procdata)
hbox2 = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0);
+#ifdef HAVE_POLKIT
-+ procdata->endprocessbutton = polkit_gnome_action_create_button (procdata->sigterm_action);
++ procdata->endprocessbutton = gtk_button_new ();
++ gtk_activatable_set_related_action (GTK_ACTIVATABLE (procdata->endprocessbutton),
++ procdata->sigterm_action);
+#else
procdata->endprocessbutton = gtk_button_new_with_mnemonic (_("End _Process"));
- gtk_box_pack_end (GTK_BOX (hbox2), procdata->endprocessbutton, FALSE, FALSE, 0);
@@ -799,44 +722,40 @@ diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monit
/* create popup_menu */
-@@ -670,6 +680,45 @@ create_main_window (ProcData *procdata)
+@@ -670,6 +682,41 @@ create_main_window (ProcData *procdata)
G_CALLBACK(cb_radio_processes),
procdata);
+#ifdef HAVE_POLKIT
-+ procdata->sigstop_action = polkit_gnome_action_new_default ("StopProcess",
-+ NULL,
-+ _("_Stop Process"),
-+ _("Stop process"));
-+ g_object_set (procdata->sigstop_action, "auth-label", _("_Stop Process..."), NULL);
++ procdata->sigstop_action = gtk_action_new ("StopProcess",
++ _("_Stop Process"),
++ _("Stop process"),
++ NULL);
+ g_signal_connect (procdata->sigstop_action, "activate", G_CALLBACK (cb_kill_sigstop), procdata);
+ gtk_action_group_add_action_with_accel (procdata->action_group,
+ GTK_ACTION (procdata->sigstop_action),
+ "<control>S");
+
-+ procdata->sigcont_action = polkit_gnome_action_new_default ("ContProcess",
-+ NULL,
-+ _("_Continue Process"),
-+ _("Continue process"));
-+ g_object_set (procdata->sigcont_action, "auth-label", _("_Continue Process..."), NULL);
++ procdata->sigcont_action = gtk_action_new ("ContProcess",
++ _("_Continue Process"),
++ _("Continue process"),
++ NULL);
+ g_signal_connect (procdata->sigcont_action, "activate", G_CALLBACK (cb_kill_sigcont), procdata);
+ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigcont_action),
+ "<control>C");
+
-+ procdata->sigterm_action = polkit_gnome_action_new_default ("EndProcess",
-+ NULL,
-+ _("End _Process"),
-+ _("Force process to finish normally"));
-+ g_object_set (procdata->sigterm_action, "auth-label", _("End _Process..."), NULL);
++ procdata->sigterm_action = gtk_action_new ("EndProcess",
++ _("End _Process"),
++ _("Force process to finish normally"),
++ NULL);
+ g_signal_connect (procdata->sigterm_action, "activate", G_CALLBACK (cb_end_process), procdata);
+ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigterm_action),
+ "<control>E");
+
-+ procdata->sigkill_action = polkit_gnome_action_new_default ("KillProcess",
-+ NULL,
-+ _("_Kill Process"),
-+ _("Force process to finish immediately"));
-+ g_object_set (procdata->sigkill_action, "auth-label", _("_Kill Process..."), NULL);
++ procdata->sigkill_action = gtk_action_new ("KillProcess",
++ _("_Kill Process"),
++ _("Force process to finish immediately"),
++ NULL);
+ g_signal_connect (procdata->sigkill_action, "activate", G_CALLBACK (cb_kill_process), procdata);
+ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigkill_action),
+ "<control>K");
@@ -845,7 +764,7 @@ diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monit
gtk_ui_manager_insert_action_group (procdata->uimanager,
procdata->action_group,
0);
-@@ -677,7 +726,6 @@ create_main_window (ProcData *procdata)
+@@ -677,7 +724,6 @@ create_main_window (ProcData *procdata)
menubar = gtk_ui_manager_get_widget (procdata->uimanager, "/MenuBar");
gtk_box_pack_start (GTK_BOX (main_box), menubar, FALSE, FALSE, 0);
@@ -853,7 +772,7 @@ diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monit
/* create the main notebook */
procdata->notebook = notebook = gtk_notebook_new ();
gtk_box_pack_start (GTK_BOX (main_box),
-@@ -774,23 +822,53 @@ update_sensitivity(ProcData *data)
+@@ -774,23 +820,26 @@ update_sensitivity(ProcData *data)
processes_sensitivity = (data->config.current_tab == PROCMAN_TAB_PROCESSES);
selected_sensitivity = (processes_sensitivity && data->selected_process != NULL);
@@ -875,50 +794,24 @@ diff -up gnome-system-monitor-2.26.1/src/interface.cpp.polkit gnome-system-monit
for (i = 0; i != G_N_ELEMENTS(selected_actions); ++i) {
action = gtk_action_group_get_action(data->action_group,
selected_actions[i]);
-+#ifdef HAVE_POLKIT
-+ if (POLKIT_GNOME_IS_ACTION (action)) {
-+ polkit_gnome_action_set_sensitive (POLKIT_GNOME_ACTION (action), selected_sensitivity);
-+ } else {
-+ gtk_action_set_sensitive(action, selected_sensitivity);
-+ }
-+#else
- gtk_action_set_sensitive(action, selected_sensitivity);
-+#endif
+- gtk_action_set_sensitive(action, selected_sensitivity);
++ gtk_action_set_sensitive(action, processes_sensitivity);
}
+
-+#ifdef HAVE_POLKIT
-+ /* update the PolicyKit actions */
-+ if (data->selected_process != NULL) {
-+ ProcInfo *pi = data->selected_process;
-+ PolKitAction *pk_action;
-+
-+ /* TODO: multiple processes may be selected; consider all of them */
-+
-+ if (pi->uid == getuid ()) {
-+ pk_action = NULL;
-+ } else {
-+ pk_action = data->pk_action_kill;
-+ }
-+ g_object_set (data->sigstop_action, "polkit-action", pk_action, NULL);
-+ g_object_set (data->sigcont_action, "polkit-action", pk_action, NULL);
-+ g_object_set (data->sigterm_action, "polkit-action", pk_action, NULL);
-+ g_object_set (data->sigkill_action, "polkit-action", pk_action, NULL);
-+ }
-+#endif
}
static void
-diff -up gnome-system-monitor-2.26.1/src/Makefile.am.polkit gnome-system-monitor-2.26.1/src/Makefile.am
---- gnome-system-monitor-2.26.1/src/Makefile.am.polkit 2008-08-08 15:55:59.000000000 -0400
-+++ gnome-system-monitor-2.26.1/src/Makefile.am 2009-04-23 15:01:02.784504169 -0400
+diff -up gnome-system-monitor-2.28.2/src/Makefile.am.polkit gnome-system-monitor-2.28.2/src/Makefile.am
+--- gnome-system-monitor-2.28.2/src/Makefile.am.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/Makefile.am 2010-09-30 13:00:35.613603002 -0400
@@ -4,7 +4,9 @@ INCLUDES = \
-DPROCMAN_DATADIR=\""$(datadir)/procman/"\" \
-DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
-DDATADIR=\""$(datadir)"\" \
- @PROCMAN_CFLAGS@
+ @PROCMAN_CFLAGS@ \
-+ @POLKIT_DBUS_CFLAGS@ \
-+ @POLKIT_GNOME_CFLAGS@
++ @POLKIT_CFLAGS@ \
++ @POLKIT_CFLAGS@
bin_PROGRAMS = gnome-system-monitor
@@ -931,7 +824,7 @@ diff -up gnome-system-monitor-2.26.1/src/Makefile.am.polkit gnome-system-monitor
+endif
-gnome_system_monitor_LDADD = @PROCMAN_LIBS@ libbacon.la
-+gnome_system_monitor_LDADD = @PROCMAN_LIBS@ @POLKIT_GNOME_LIBS@ libbacon.la
++gnome_system_monitor_LDADD = @PROCMAN_LIBS@ @POLKIT_LIBS@ libbacon.la
noinst_LTLIBRARIES = libbacon.la
@@ -942,7 +835,7 @@ diff -up gnome-system-monitor-2.26.1/src/Makefile.am.polkit gnome-system-monitor
+######################################################################
+if HAVE_POLKIT
+
-+polkit_policydir = $(datadir)/PolicyKit/policy
++polkit_policydir = $(datadir)/polkit-1/actions
+dist_polkit_policy_DATA = org.gnome.system-monitor.policy
+# You will need a recent intltool or the patch from this bug http://bugzilla.gnome.org/show_bug.cgi?id=462312
+ at INTLTOOL_POLICY_RULE@
@@ -967,8 +860,8 @@ diff -up gnome-system-monitor-2.26.1/src/Makefile.am.polkit gnome-system-monitor
+ gnome-system-monitor-mechanism-glue.h \
+ gnome-system-monitor-mechanism.c
+
-+gnome_system_monitor_mechanism_CFLAGS = $(POLKIT_DBUS_CFLAGS)
-+gnome_system_monitor_mechanism_LDADD = $(POLKIT_DBUS_LIBS)
++gnome_system_monitor_mechanism_CFLAGS = $(POLKIT_CFLAGS)
++gnome_system_monitor_mechanism_LDADD = $(POLKIT_LIBS)
+endif
+######################################################################
+
@@ -981,10 +874,10 @@ diff -up gnome-system-monitor-2.26.1/src/Makefile.am.polkit gnome-system-monitor
CLEANFILES = \
$(schema_DATA)
-diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.SystemMonitor.Mechanism.conf
---- /dev/null 2009-04-23 10:50:49.279044520 -0400
-+++ gnome-system-monitor-2.26.1/src/org.gnome.SystemMonitor.Mechanism.conf 2009-04-23 15:01:02.786494180 -0400
-@@ -0,0 +1,11 @@
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf.polkit gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf
+--- gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf.polkit 2010-09-30 13:00:35.593603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf 2010-09-30 13:00:35.614603002 -0400
+@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
+
+<!DOCTYPE busconfig PUBLIC
@@ -995,18 +888,22 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.SystemMonitor.Mecha
+ <policy user="root">
+ <allow own="org.gnome.SystemMonitor.Mechanism"/>
+ </policy>
++
++ <policy context="default">
++ <allow send_destination="org.gnome.SystemMonitor.Mechanism"/>
++ </policy>
+</busconfig>
-diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.SystemMonitor.Mechanism.service.in
---- /dev/null 2009-04-23 10:50:49.279044520 -0400
-+++ gnome-system-monitor-2.26.1/src/org.gnome.SystemMonitor.Mechanism.service.in 2009-04-23 15:01:02.786494180 -0400
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in.polkit gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in
+--- gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in.polkit 2010-09-30 13:00:35.594603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in 2010-09-30 13:00:35.594603002 -0400
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=org.gnome.SystemMonitor.Mechanism
+Exec=libexecdir/gnome-system-monitor-mechanism
+User=root
-diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.system-monitor.policy.in
---- /dev/null 2009-04-23 10:50:49.279044520 -0400
-+++ gnome-system-monitor-2.26.1/src/org.gnome.system-monitor.policy.in 2009-04-23 15:01:02.787520999 -0400
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in.polkit gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in
+--- gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in.polkit 2010-09-30 13:00:35.595603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in 2010-09-30 13:00:35.615603002 -0400
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+
@@ -1044,7 +941,7 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.system-monitor.poli
+ <_message>Increasing the priority of one of your own processes requires privileges</_message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
-+ <allow_active>auth_self_keep_always</allow_active>
++ <allow_active>auth_self_keep</allow_active>
+ </defaults>
+ </action>
+
@@ -1058,16 +955,16 @@ diff -up /dev/null gnome-system-monitor-2.26.1/src/org.gnome.system-monitor.poli
+ </action>
+
+</policyconfig>
-diff -up gnome-system-monitor-2.26.1/src/procactions.cpp.polkit gnome-system-monitor-2.26.1/src/procactions.cpp
---- gnome-system-monitor-2.26.1/src/procactions.cpp.polkit 2007-01-02 17:15:36.000000000 -0500
-+++ gnome-system-monitor-2.26.1/src/procactions.cpp 2009-04-23 15:01:02.788493760 -0400
+diff -up gnome-system-monitor-2.28.2/src/procactions.cpp.polkit gnome-system-monitor-2.28.2/src/procactions.cpp
+--- gnome-system-monitor-2.28.2/src/procactions.cpp.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/procactions.cpp 2010-09-30 13:00:35.616603002 -0400
@@ -31,6 +31,10 @@
#include "procdialogs.h"
#include "callbacks.h"
+#ifdef HAVE_POLKIT
+# include "gnome-system-monitor-mechanism-client-glue.h"
-+# include <polkit-gnome/polkit-gnome.h>
++# include <polkit/polkit.h>
+#endif
static void
@@ -1173,78 +1070,18 @@ diff -up gnome-system-monitor-2.26.1/src/procactions.cpp.polkit gnome-system-mon
proctable_update_all (procdata);
}
+
-diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-monitor-2.26.1/src/procdialogs.cpp
---- gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit 2008-05-23 17:44:00.000000000 -0400
-+++ gnome-system-monitor-2.26.1/src/procdialogs.cpp 2009-04-23 15:01:02.789493899 -0400
-@@ -35,6 +35,11 @@
- #include "procman_gnomesu.h"
- #include "procman_gksu.h"
-
-+#ifdef HAVE_POLKIT
-+# include "gnome-system-monitor-mechanism-client-glue.h"
-+# include <polkit-gnome/polkit-gnome.h>
-+#endif
-+
- static GtkWidget *renice_dialog = NULL;
- static GtkWidget *prefs_dialog = NULL;
- static gint new_nice_value = 0;
-@@ -121,29 +126,89 @@ get_nice_level (gint nice)
+diff -up gnome-system-monitor-2.28.2/src/procdialogs.cpp.polkit gnome-system-monitor-2.28.2/src/procdialogs.cpp
+--- gnome-system-monitor-2.28.2/src/procdialogs.cpp.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/src/procdialogs.cpp 2010-09-30 13:01:39.444603008 -0400
+@@ -123,29 +123,34 @@ get_nice_level (gint nice)
return _("(Very Low Priority)");
}
+typedef struct {
+ GtkWidget *priority_label;
+ ProcData *procdata;
-+#ifdef HAVE_POLKIT
-+ PolKitGnomeAction *renice_action;
-+#endif
+} ReniceClosure;
+
-+#ifdef HAVE_POLKIT
-+static void
-+_renice_compute_polkit_action (ReniceClosure *rc)
-+{
-+ if (rc->procdata->selected_process != NULL) {
-+ ProcInfo *pi = rc->procdata->selected_process;
-+
-+ if (pi->uid == getuid ()) {
-+ if (new_nice_value < pi->nice) {
-+ GValue v;
-+ GValueArray *va;
-+
-+ g_warning ("foo");
-+
-+ memset (&v, 0, sizeof (GValue));
-+ g_value_init (&v, G_TYPE_POINTER);
-+ g_value_set_pointer (&v, rc->procdata->pk_action_change_priority);
-+ va = g_value_array_new (1);
-+ g_value_array_prepend (va, &v);
-+
-+ g_object_set (rc->renice_action,
-+ "polkit-action",
-+ rc->procdata->pk_action_increase_own_priority,
-+ "polkit-action-sufficient",
-+ va,
-+ NULL);
-+
-+ g_value_array_free (va);
-+ goto out;
-+ }
-+ } else {
-+ g_object_set (rc->renice_action,
-+ "polkit-action",
-+ rc->procdata->pk_action_change_priority, NULL);
-+ goto out;
-+ }
-+ }
-+
-+ g_object_set (rc->renice_action, "polkit-action", NULL, NULL);
-+
-+out:
-+ ;
-+}
-+#endif
-+
static void
renice_scale_changed (GtkAdjustment *adj, gpointer data)
{
@@ -1252,13 +1089,10 @@ diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-mon
-
+ ReniceClosure *rc = (ReniceClosure *) data;
+
- new_nice_value = int(adj->value);
+ new_nice_value = int(gtk_adjustment_get_value (adj));
- gtk_label_set_text (GTK_LABEL (label), get_nice_level (new_nice_value));
-
-+ gtk_label_set_text (GTK_LABEL (rc->priority_label), get_nice_level (new_nice_value));
-+#ifdef HAVE_POLKIT
-+ _renice_compute_polkit_action (rc);
-+#endif
++‣‧‧‧‧‧‧gtk_label_set_text (GTK_LABEL (rc->priority_label), get_nice_level (new_nice_value));‣‧‧‣‧‧‧‧‧‧‧
}
static void
@@ -1272,20 +1106,16 @@ diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-mon
if (new_nice_value == -100)
return;
- renice(procdata, new_nice_value);
-+ renice (rc->procdata, new_nice_value);
++ renice(rc->procdata, new_nice_value);
}
gtk_widget_destroy (GTK_WIDGET (dialog));
renice_dialog = NULL;
-+
-+#ifdef HAVE_POLKIT
-+ g_object_unref (G_OBJECT (rc->renice_action));
-+#endif
+ g_free (rc);
}
void
-@@ -153,22 +218,28 @@ procdialog_create_renice_dialog (ProcDat
+@@ -155,7 +160,6 @@ procdialog_create_renice_dialog (ProcDat
GtkWidget *dialog = NULL;
GtkWidget *dialog_vbox;
GtkWidget *vbox;
@@ -1293,14 +1123,12 @@ diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-mon
GtkWidget *label;
GtkWidget *priority_label;
GtkWidget *table;
- GtkObject *renice_adj;
+@@ -163,14 +167,19 @@ procdialog_create_renice_dialog (ProcDat
GtkWidget *hscale;
GtkWidget *button;
-+#ifndef HAVE_POLKIT
-+ GtkWidget *hbox;
GtkWidget *align;
++ GtkWidget *hbox;
GtkWidget *icon;
-+#endif
gchar *text;
+ ReniceClosure *rc;
@@ -1315,46 +1143,30 @@ diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-mon
dialog = gtk_dialog_new_with_buttons (_("Change Priority"), NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
-@@ -178,7 +249,20 @@ procdialog_create_renice_dialog (ProcDat
+@@ -180,7 +189,7 @@ procdialog_create_renice_dialog (ProcDat
gtk_window_set_resizable (GTK_WINDOW (renice_dialog), FALSE);
gtk_dialog_set_has_separator (GTK_DIALOG (renice_dialog), FALSE);
gtk_container_set_border_width (GTK_CONTAINER (renice_dialog), 5);
-
+
-+#ifdef HAVE_POLKIT
-+ rc->renice_action = polkit_gnome_action_new_default ("ReniceProcessButton",
-+ NULL,
-+ _("Change _Priority"),
-+ NULL);
-+ g_object_set (rc->renice_action,
-+ "auth-label", _("Change _Priority..."),
-+ "yes-icon-name", GTK_STOCK_OK,
-+ NULL);
-+
-+ button = polkit_gnome_action_create_button (rc->renice_action);
-+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
-+#else
button = gtk_button_new ();
- GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_set_can_default (button, TRUE);
-@@ -195,7 +279,9 @@ procdialog_create_renice_dialog (ProcDat
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
+@@ -198,6 +207,7 @@ procdialog_create_renice_dialog (ProcDat
gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-+#endif
gtk_dialog_add_action_widget (GTK_DIALOG (renice_dialog), button, 100);
+
gtk_dialog_set_default_response (GTK_DIALOG (renice_dialog), 100);
new_nice_value = -100;
-@@ -236,15 +322,17 @@ procdialog_create_renice_dialog (ProcDat
+@@ -238,15 +248,16 @@ procdialog_create_renice_dialog (ProcDat
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
g_free (text);
+
+ rc->priority_label = priority_label;
+ new_nice_value = info->nice;
-+ _renice_compute_polkit_action (rc);
g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (renice_dialog_button_pressed), procdata);
@@ -1369,9 +1181,9 @@ diff -up gnome-system-monitor-2.26.1/src/procdialogs.cpp.polkit gnome-system-mon
}
static void
-diff -up gnome-system-monitor-2.26.1/src/procman.cpp.polkit gnome-system-monitor-2.26.1/src/procman.cpp
---- gnome-system-monitor-2.26.1/src/procman.cpp.polkit 2009-03-31 17:57:18.000000000 -0400
-+++ gnome-system-monitor-2.26.1/src/procman.cpp 2009-04-23 15:01:02.790494038 -0400
+diff -up gnome-system-monitor-2.28.2/src/procman.cpp.polkit gnome-system-monitor-2.28.2/src/procman.cpp
+--- gnome-system-monitor-2.28.2/src/procman.cpp.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/src/procman.cpp 2010-09-30 13:00:35.620603002 -0400
@@ -36,6 +36,10 @@
#include <glibtop/close.h>
#include <glibtop/loadavg.h>
@@ -1383,7 +1195,7 @@ diff -up gnome-system-monitor-2.26.1/src/procman.cpp.polkit gnome-system-monitor
#include "load-graph.h"
#include "procman.h"
#include "interface.h"
-@@ -58,7 +62,34 @@ ProcData::ProcData()
+@@ -58,7 +62,25 @@ ProcData::ProcData()
disk_timeout(0),
cpu_total_time(1),
cpu_total_time_last(1)
@@ -1405,56 +1217,42 @@ diff -up gnome-system-monitor-2.26.1/src/procman.cpp.polkit gnome-system-monitor
+ "/",
+ "org.gnome.SystemMonitor.Mechanism");
+ }
-+
-+ this->pk_action_kill = polkit_action_new ();
-+ polkit_action_set_action_id (this->pk_action_kill, "org.gnome.system-monitor.kill");
-+
-+ this->pk_action_change_priority = polkit_action_new ();
-+ polkit_action_set_action_id (this->pk_action_change_priority, "org.gnome.system-monitor.change-priority");
-+
-+ this->pk_action_increase_own_priority = polkit_action_new ();
-+ polkit_action_set_action_id (this->pk_action_increase_own_priority, "org.gnome.system-monitor.increase-own-priority");
+#endif
+}
ProcData* ProcData::get_instance()
-diff -up gnome-system-monitor-2.26.1/src/procman.h.polkit gnome-system-monitor-2.26.1/src/procman.h
---- gnome-system-monitor-2.26.1/src/procman.h.polkit 2009-01-20 15:53:35.000000000 -0500
-+++ gnome-system-monitor-2.26.1/src/procman.h 2009-04-23 15:01:02.791493688 -0400
-@@ -33,6 +33,11 @@
+diff -up gnome-system-monitor-2.28.2/src/procman.h.polkit gnome-system-monitor-2.28.2/src/procman.h
+--- gnome-system-monitor-2.28.2/src/procman.h.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/procman.h 2010-09-30 13:00:35.622603002 -0400
+@@ -33,6 +33,10 @@
#include <map>
#include <string>
+#ifdef HAVE_POLKIT
+# include <dbus/dbus-glib.h>
-+# include <polkit-gnome/polkit-gnome.h>
+#endif
+
struct ProcInfo;
struct ProcData;
struct LoadGraph;
-@@ -211,6 +216,19 @@ struct ProcData
+@@ -210,6 +214,15 @@ struct ProcData
GtkWidget *app;
GtkUIManager *menu;
+#ifdef HAVE_POLKIT
+ DBusGProxy *mechanism_proxy;
+
-+ PolKitAction *pk_action_kill;
-+ PolKitAction *pk_action_change_priority;
-+ PolKitAction *pk_action_increase_own_priority;
-+
-+ PolKitGnomeAction *sigstop_action;
-+ PolKitGnomeAction *sigcont_action;
-+ PolKitGnomeAction *sigterm_action;
-+ PolKitGnomeAction *sigkill_action;
++ GtkAction *sigstop_action;
++ GtkAction *sigcont_action;
++ GtkAction *sigterm_action;
++ GtkAction *sigkill_action;
+#endif
+
unsigned frequency;
SmoothRefresh *smooth_refresh;
-@@ -231,7 +249,6 @@ gboolean procman_get_tree_state (GConfCl
+@@ -230,7 +243,6 @@ gboolean procman_get_tree_state (GConfCl
diff --git a/gnome-system-monitor.spec b/gnome-system-monitor.spec
index 8ebb1d3..78d47f7 100644
--- a/gnome-system-monitor.spec
+++ b/gnome-system-monitor.spec
@@ -11,7 +11,7 @@
Summary: Process and resource monitor
Name: gnome-system-monitor
-Version: 2.28.1
+Version: 2.28.2
Release: 1%{?dist}
License: GPLv2+
Group: Applications/System
@@ -41,19 +41,13 @@ BuildRequires: polkit-devel >= %{polkit_version}
BuildRequires: autoconf, automake, libtool
# sent upstream: http://bugzilla.gnome.org/show_bug.cgi?id=491462
-Patch0: gnome-system-monitor-2.25.91-polkit.patch
+Patch0: polkit.patch
# sent upstream: http://bugzilla.gnome.org/show_bug.cgi?id=421912
Patch1: session.patch
-# https://bugzilla.redhat.com/show_bug.cgi?id=495730
-Patch2: polkit1.patch
-
-# http://bugzilla.gnome.org/show_bug.cgi?id=592747
-Patch3: buttons.patch
-
# http://bugzilla.gnome.org/show_bug.cgi?id=592758
-Patch4: memmapsdialog.patch
+Patch2: memmapsdialog.patch
Requires(pre): GConf2 >= %{gconf_version}
Requires(post): GConf2 >= %{gconf_version}
@@ -68,9 +62,7 @@ such as CPU and memory.
%setup -q
%patch0 -p1 -b .polkit
%patch1 -p1 -b .session
-%patch2 -p1 -b .polkit1
-%patch3 -p1 -b .buttons
-%patch4 -p1 -b .memmapsdialog
+%patch2 -p1 -b .memmapsdialog
autoreconf -i -f
@@ -149,6 +141,9 @@ fi
%changelog
+* Wed Sep 29 2010 Matthias Clasen <mclasen at redhat.com> - 2.28.2-1
+- Update to 2.28.2
+
* Tue Mar 30 2010 Matthias Clasen <mclasen at redhat.com> - 2.28.1-1
- Update to 2.28.1
diff --git a/polkit.patch b/polkit.patch
new file mode 100644
index 0000000..d0f4d08
--- /dev/null
+++ b/polkit.patch
@@ -0,0 +1,1274 @@
+diff -up gnome-system-monitor-2.28.2/configure.in.polkit gnome-system-monitor-2.28.2/configure.in
+--- gnome-system-monitor-2.28.2/configure.in.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/configure.in 2010-09-30 14:27:14.731603002 -0400
+@@ -35,10 +35,35 @@ GIOMM_REQUIRED=2.16.0
+ GLIBMM_REQUIRED=2.14
+ LIBXML_REQUIRED=2.0
+ RSVG_REQUIRED=2.12
+-DBUS_REQUIRED=0.7
++POLKIT_REQUIRED=0.92
++DBUS_GLIB_REQUIRED=0.71
++DBUS_REQUIRED=1.1.2
+
+-PKG_CHECK_MODULES(PROCMAN, glib-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-icon-theme >= $GNOME_ICON_THEME_REQUIRED gtkmm-2.4 >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED dbus-glib-1 >= $DBUS_REQUIRED)
+
++PKG_CHECK_MODULES(PROCMAN, glib-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-icon-theme >= $GNOME_ICON_THEME_REQUIRED gtkmm-2.4 >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED dbus-glib-1 >= $DBUS_GLIB_REQUIRED)
++
++# PolicyKit detection; defaults to 'auto' (use it if it's available)
++#
++POLKIT_CFLAGS=
++POLKIT_LIBS=
++AC_ARG_ENABLE(polkit, AS_HELP_STRING([--enable-polkit],[Enable PolicyKit support (auto)]),enable_polkit=$enableval,enable_polkit=auto)
++if test "x$enable_polkit" = "xno" ; then
++ HAVE_POLKIT=no
++else
++ HAVE_POLKIT=no
++ PKG_CHECK_MODULES(POLKIT, polkit-gobject-1 >= $POLKIT_REQUIRED dbus-1 >= $DBUS_REQUIRED dbus-glib-1 >= $DBUS_GLIB_REQUIRED gobject-2.0, HAVE_POLKIT=yes, HAVE_POLKIT=no)
++
++ if test "x$enable_polkit" = "xyes" -a "x$HAVE_POLKIT" = "xno" ; then
++ AC_MSG_ERROR(PolicyKit support explicity enabled but not available)
++ fi
++
++ if test "x$HAVE_POLKIT" = "xyes" ; then
++ AC_DEFINE(HAVE_POLKIT, 1, [Defined if PolicyKit support is enabled])
++ fi
++fi
++AM_CONDITIONAL(HAVE_POLKIT, test "x$HAVE_POLKIT" = "xyes")
++AC_SUBST(POLKIT_CFLAGS)
++AC_SUBST(POLKIT_LIBS)
+
+ AC_ARG_ENABLE(more-warnings,
+ [AC_HELP_STRING([--enable-more-warnings], [Maximum compiler warnings])],
+@@ -98,6 +123,7 @@ Configuration:
+ C++ Compiler: ${CXX}
+ CFLAGS: ${CFLAGS}
+ CXXFLAGS: ${CXXFLAGS}
++ PolicyKit support: ${HAVE_POLKIT}
+ Maintainer mode: ${USER_MAINTAINER_MODE}
+ Languages: ${ALL_LINGUAS}
+ "
+diff -up gnome-system-monitor-2.28.2/po/POTFILES.in.polkit gnome-system-monitor-2.28.2/po/POTFILES.in
+--- gnome-system-monitor-2.28.2/po/POTFILES.in.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/po/POTFILES.in 2010-09-30 14:27:14.732603002 -0400
+@@ -8,6 +8,7 @@ src/callbacks.cpp
+ src/defaulttable.h
+ src/disks.cpp
+ src/e_date.c
++src/gnome-system-monitor.policy.in
+ src/gnome-system-monitor.schemas.in
+ src/gsm_color_button.c
+ src/interface.cpp
+diff -up gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c.polkit gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c
+--- gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c.polkit 2010-09-30 14:27:14.734603002 -0400
++++ gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.c 2010-09-30 14:27:14.734603002 -0400
+@@ -0,0 +1,592 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2007 David Zeuthen <david at fubar.dk>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <signal.h>
++#include <errno.h>
++#include <string.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++#include <sys/resource.h>
++#include <fcntl.h>
++#include <signal.h>
++
++#include <glib.h>
++#include <glib/gi18n-lib.h>
++#include <glib-object.h>
++#include <dbus/dbus-glib.h>
++#include <dbus/dbus-glib-lowlevel.h>
++#include <polkit/polkit.h>
++
++static gboolean no_exit = FALSE;
++
++/*--------------------------------------------------------------------------------------------------------------*/
++
++#define GNOME_SYSTEM_MONITOR_TYPE_MECHANISM (gnome_system_monitor_mechanism_get_type ())
++#define GNOME_SYSTEM_MONITOR_MECHANISM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, GnomeSystemMonitorMechanism))
++#define GNOME_SYSTEM_MONITOR_MECHANISM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, GnomeSystemMonitorMechanismClass))
++#define GNOME_SYSTEM_MONITOR_IS_MECHANISM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM))
++#define GNOME_SYSTEM_MONITOR_IS_MECHANISM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM))
++#define GNOME_SYSTEM_MONITOR_MECHANISM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, GnomeSystemMonitorMechanismClass))
++
++typedef struct GnomeSystemMonitorMechanismPrivate GnomeSystemMonitorMechanismPrivate;
++
++typedef struct
++{
++ GObject parent;
++ GnomeSystemMonitorMechanismPrivate *priv;
++} GnomeSystemMonitorMechanism;
++
++typedef struct
++{
++ GObjectClass parent_class;
++} GnomeSystemMonitorMechanismClass;
++
++typedef enum
++{
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_NOT_PRIVILEGED,
++ GNOME_SYSTEM_MONITOR_MECHANISM_NUM_ERRORS
++} GnomeSystemMonitorMechanismError;
++
++#define GNOME_SYSTEM_MONITOR_MECHANISM_ERROR gnome_system_monitor_mechanism_error_quark ()
++
++GType gnome_system_monitor_mechanism_error_get_type (void);
++#define GNOME_SYSTEM_MONITOR_MECHANISM_TYPE_ERROR (gnome_system_monitor_mechanism_error_get_type ())
++
++
++GQuark gnome_system_monitor_mechanism_error_quark (void);
++GType gnome_system_monitor_mechanism_get_type (void);
++GnomeSystemMonitorMechanism *gnome_system_monitor_mechanism_new (void);
++
++/* exported methods */
++gboolean gnome_system_monitor_mechanism_kill (GnomeSystemMonitorMechanism *mechanism,
++ int pid,
++ int sig,
++ DBusGMethodInvocation *context);
++
++gboolean gnome_system_monitor_mechanism_renice (GnomeSystemMonitorMechanism *mechanism,
++ int pid,
++ int nice_value,
++ DBusGMethodInvocation *context);
++
++/*--------------------------------------------------------------------------------------------------------------*/
++#include "gnome-system-monitor-mechanism-glue.h"
++
++static gboolean
++do_exit (gpointer user_data)
++{
++ g_debug ("Exiting due to inactivity");
++ exit (1);
++ return FALSE;
++}
++
++static void
++reset_killtimer (void)
++{
++ static guint timer_id = 0;
++
++ if (no_exit)
++ return;
++
++ if (timer_id > 0) {
++ g_source_remove (timer_id);
++ }
++ g_debug ("Setting killtimer to 30 seconds...");
++ timer_id = g_timeout_add (30 * 1000, do_exit, NULL);
++}
++
++struct GnomeSystemMonitorMechanismPrivate
++{
++ DBusGConnection *system_bus_connection;
++ DBusGProxy *system_bus_proxy;
++ PolkitAuthority *pol_ctx;
++};
++
++static void gnome_system_monitor_mechanism_class_init (GnomeSystemMonitorMechanismClass *klass);
++static void gnome_system_monitor_mechanism_init (GnomeSystemMonitorMechanism *seat);
++static void gnome_system_monitor_mechanism_finalize (GObject *object);
++
++G_DEFINE_TYPE (GnomeSystemMonitorMechanism, gnome_system_monitor_mechanism, G_TYPE_OBJECT)
++
++#define GNOME_SYSTEM_MONITOR_MECHANISM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, GnomeSystemMonitorMechanismPrivate))
++
++GQuark
++gnome_system_monitor_mechanism_error_quark (void)
++{
++ static GQuark ret = 0;
++
++ if (ret == 0) {
++ ret = g_quark_from_static_string ("gnome_system_monitor_mechanism_error");
++ }
++
++ return ret;
++}
++
++
++#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
++
++GType
++gnome_system_monitor_mechanism_error_get_type (void)
++{
++ static GType etype = 0;
++
++ if (etype == 0)
++ {
++ static const GEnumValue values[] =
++ {
++ ENUM_ENTRY (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL, "GeneralError"),
++ ENUM_ENTRY (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_NOT_PRIVILEGED, "NotPrivileged"),
++ { 0, 0, 0 }
++ };
++
++ g_assert (GNOME_SYSTEM_MONITOR_MECHANISM_NUM_ERRORS == G_N_ELEMENTS (values) - 1);
++
++ etype = g_enum_register_static ("GnomeSystemMonitorMechanismError", values);
++ }
++
++ return etype;
++}
++
++
++static GObject *
++gnome_system_monitor_mechanism_constructor (GType type,
++ guint n_construct_properties,
++ GObjectConstructParam *construct_properties)
++{
++ GnomeSystemMonitorMechanism *mechanism;
++ GnomeSystemMonitorMechanismClass *klass;
++
++ klass = GNOME_SYSTEM_MONITOR_MECHANISM_CLASS (g_type_class_peek (GNOME_SYSTEM_MONITOR_TYPE_MECHANISM));
++
++ mechanism = GNOME_SYSTEM_MONITOR_MECHANISM (
++ G_OBJECT_CLASS (gnome_system_monitor_mechanism_parent_class)->constructor (type,
++ n_construct_properties,
++ construct_properties));
++
++ return G_OBJECT (mechanism);
++}
++
++static void
++gnome_system_monitor_mechanism_class_init (GnomeSystemMonitorMechanismClass *klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++
++ object_class->constructor = gnome_system_monitor_mechanism_constructor;
++ object_class->finalize = gnome_system_monitor_mechanism_finalize;
++
++ g_type_class_add_private (klass, sizeof (GnomeSystemMonitorMechanismPrivate));
++
++ dbus_g_object_type_install_info (GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, &dbus_glib_gnome_system_monitor_mechanism_object_info);
++
++ dbus_g_error_domain_register (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR, NULL, GNOME_SYSTEM_MONITOR_MECHANISM_TYPE_ERROR);
++
++}
++
++static void
++gnome_system_monitor_mechanism_init (GnomeSystemMonitorMechanism *mechanism)
++{
++ mechanism->priv = GNOME_SYSTEM_MONITOR_MECHANISM_GET_PRIVATE (mechanism);
++
++}
++
++static void
++gnome_system_monitor_mechanism_finalize (GObject *object)
++{
++ GnomeSystemMonitorMechanism *mechanism;
++
++ g_return_if_fail (object != NULL);
++ g_return_if_fail (GNOME_SYSTEM_MONITOR_IS_MECHANISM (object));
++
++ mechanism = GNOME_SYSTEM_MONITOR_MECHANISM (object);
++
++ g_return_if_fail (mechanism->priv != NULL);
++
++ g_object_unref (mechanism->priv->system_bus_proxy);
++
++ G_OBJECT_CLASS (gnome_system_monitor_mechanism_parent_class)->finalize (object);
++}
++
++static gboolean
++register_mechanism (GnomeSystemMonitorMechanism *mechanism)
++{
++ GError *error = NULL;
++
++ mechanism->priv->pol_ctx = polkit_authority_get ();
++
++ error = NULL;
++ mechanism->priv->system_bus_connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ if (mechanism->priv->system_bus_connection == NULL) {
++ if (error != NULL) {
++ g_critical ("error getting system bus: %s", error->message);
++ g_error_free (error);
++ }
++ goto error;
++ }
++
++ dbus_g_connection_register_g_object (mechanism->priv->system_bus_connection, "/",
++ G_OBJECT (mechanism));
++
++ mechanism->priv->system_bus_proxy = dbus_g_proxy_new_for_name (mechanism->priv->system_bus_connection,
++ DBUS_SERVICE_DBUS,
++ DBUS_PATH_DBUS,
++ DBUS_INTERFACE_DBUS);
++
++ reset_killtimer ();
++
++ return TRUE;
++
++error:
++ return FALSE;
++}
++
++
++GnomeSystemMonitorMechanism *
++gnome_system_monitor_mechanism_new (void)
++{
++ GObject *object;
++ gboolean res;
++
++ object = g_object_new (GNOME_SYSTEM_MONITOR_TYPE_MECHANISM, NULL);
++
++ res = register_mechanism (GNOME_SYSTEM_MONITOR_MECHANISM (object));
++ if (! res) {
++ g_object_unref (object);
++ return NULL;
++ }
++
++ return GNOME_SYSTEM_MONITOR_MECHANISM (object);
++}
++
++static PolkitSubject *
++get_caller_from_context (GnomeSystemMonitorMechanism *mechanism, DBusGMethodInvocation *context)
++{
++ char *sender;
++ PolkitSubject *pk_caller;
++
++ sender = dbus_g_method_get_sender (context);
++ pk_caller = polkit_system_bus_name_new (sender);
++ g_free (sender);
++
++ return pk_caller;
++}
++
++/* note, we take ownership of the passed PolkitSubject object */
++static gboolean
++_check_polkit_for_action_for_caller (GnomeSystemMonitorMechanism *mechanism,
++ DBusGMethodInvocation *context,
++ PolkitSubject *subject,
++ const char *action)
++{
++ GError *error;
++ PolkitAuthorizationResult *result;
++
++ error = NULL;
++
++ result = polkit_authority_check_authorization_sync (mechanism->priv->pol_ctx,
++ subject,
++ action,
++ NULL,
++ POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
++ NULL, NULL);
++ g_object_unref (subject);
++
++ if (!polkit_authorization_result_get_is_authorized (result)) {
++ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_NOT_PRIVILEGED,
++ "%s",
++ action);
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++ g_object_unref (result);
++ return FALSE;
++ }
++
++ g_object_unref (result);
++ return TRUE;
++}
++
++static gboolean
++_check_polkit_for_action (GnomeSystemMonitorMechanism *mechanism,
++ DBusGMethodInvocation *context,
++ const char *action)
++{
++ PolkitSubject *subject;
++
++ /* Check that caller is privileged */
++ if ((subject = get_caller_from_context (mechanism, context)) == NULL)
++ return FALSE;
++
++ return _check_polkit_for_action_for_caller (mechanism, context, subject, action);
++}
++
++/*--------------------------------------------------------------------------------------------------------------*/
++/* exported methods */
++
++gboolean
++gnome_system_monitor_mechanism_kill (GnomeSystemMonitorMechanism *mechanism,
++ int pid,
++ int sig,
++ DBusGMethodInvocation *context)
++{
++ reset_killtimer ();
++
++ if (!_check_polkit_for_action (mechanism, context, "org.gnome.system-monitor.kill"))
++ return FALSE;
++
++ g_debug ("Sending signal %d to pid %d", sig, pid);
++
++ if (kill (pid, sig) != 0) {
++ GError *error;
++ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
++ "Error sending signal %d to pid %d: %m", sig, pid);
++ g_warning ("Error: %s", error->message);
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++ return FALSE;
++ }
++
++ dbus_g_method_return (context);
++ return TRUE;
++}
++
++static gboolean
++get_uid_from_context (GnomeSystemMonitorMechanism *mechanism,
++ DBusGMethodInvocation *context,
++ uid_t *uid)
++{
++ char *sender;
++ DBusConnection *con;
++
++ con = dbus_g_connection_get_connection (dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL));
++ if (con == NULL)
++ return FALSE;
++
++ sender = dbus_g_method_get_sender (context);
++ *uid = dbus_bus_get_unix_user (con, sender, NULL);
++ g_free (sender);
++
++ if (*uid == (unsigned)-1)
++ return FALSE;
++
++ return TRUE;
++}
++
++gboolean
++gnome_system_monitor_mechanism_renice (GnomeSystemMonitorMechanism *mechanism,
++ int pid,
++ int nice_value,
++ DBusGMethodInvocation *context)
++{
++ uid_t caller_uid;
++ uid_t process_uid;
++ PolkitSubject *subject;
++ char *procpath;
++ struct stat statbuf;
++ const char *action_id;
++
++ reset_killtimer ();
++
++ /* Hmm; is there a better way to do this? This may be Linux specific.. */
++ procpath = g_strdup_printf ("/proc/%d", pid);
++ if (stat (procpath, &statbuf) != 0) {
++ GError *error;
++ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
++ "Error figuring out uid for pid %d", pid);
++ g_warning ("Error: %s", error->message);
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++ g_free (procpath);
++ return FALSE;
++ }
++ g_free (procpath);
++ process_uid = statbuf.st_uid;
++
++ subject = get_caller_from_context (mechanism, context);
++ if (subject == NULL)
++ return FALSE;
++
++ if (!get_uid_from_context (mechanism, context, &caller_uid)) {
++ GError *error;
++ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
++ "Error figuring out uid of caller");
++ g_warning ("Error: %s", error->message);
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++ g_object_unref (subject);
++ return FALSE;
++ }
++
++ if (caller_uid == process_uid) {
++ action_id = "org.gnome.system-monitor.increase-own-priority";
++ } else {
++ action_id = "org.gnome.system-monitor.change-priority";
++ }
++
++ if (!_check_polkit_for_action_for_caller (mechanism, context, subject, action_id)) {
++ return FALSE;
++ }
++
++ g_debug ("Renicing pid %d (owned by uid %d) to priority %d on behalf of uid %d (action_id=%s)",
++ pid, process_uid, nice_value, caller_uid, action_id);
++
++ errno = 0;
++ if (setpriority (PRIO_PROCESS, pid, nice_value) != 0) {
++ GError *error;
++ error = g_error_new (GNOME_SYSTEM_MONITOR_MECHANISM_ERROR,
++ GNOME_SYSTEM_MONITOR_MECHANISM_ERROR_GENERAL,
++ "Error renicing pid %d to priority %d: %m", pid, nice_value);
++ g_warning ("Error: %s", error->message);
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++ return FALSE;
++ }
++
++ dbus_g_method_return (context);
++ return TRUE;
++}
++
++/*--------------------------------------------------------------------------------------------------------------*/
++
++#define BUS_NAME "org.gnome.SystemMonitor.Mechanism"
++
++static gboolean
++acquire_name_on_proxy (DBusGProxy *bus_proxy)
++{
++ GError *error;
++ guint result;
++ gboolean res;
++ gboolean ret;
++
++ ret = FALSE;
++
++ if (bus_proxy == NULL) {
++ goto out;
++ }
++
++ error = NULL;
++ res = dbus_g_proxy_call (bus_proxy,
++ "RequestName",
++ &error,
++ G_TYPE_STRING, BUS_NAME,
++ G_TYPE_UINT, 0,
++ G_TYPE_INVALID,
++ G_TYPE_UINT, &result,
++ G_TYPE_INVALID);
++ if (! res) {
++ if (error != NULL) {
++ g_warning ("Failed to acquire %s: %s", BUS_NAME, error->message);
++ g_error_free (error);
++ } else {
++ g_warning ("Failed to acquire %s", BUS_NAME);
++ }
++ goto out;
++ }
++
++ if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
++ if (error != NULL) {
++ g_warning ("Failed to acquire %s: %s", BUS_NAME, error->message);
++ g_error_free (error);
++ } else {
++ g_warning ("Failed to acquire %s", BUS_NAME);
++ }
++ goto out;
++ }
++
++ ret = TRUE;
++
++ out:
++ return ret;
++}
++
++int
++main (int argc, char **argv)
++{
++ GMainLoop *loop;
++ GnomeSystemMonitorMechanism *mechanism;
++ DBusGProxy *bus_proxy;
++ DBusGConnection *connection;
++ int ret;
++ GError *error;
++ GOptionContext *context;
++ static GOptionEntry entries [] = {
++ { "no-exit", 0, 0, G_OPTION_ARG_NONE, &no_exit, N_("Don't exit after 30 seconds of inactivity"), NULL },
++ { NULL }
++ };
++
++ ret = 1;
++
++ g_type_init ();
++
++ context = g_option_context_new (_("PolicyKit GNOME session daemon"));
++ g_option_context_add_main_entries (context, entries, NULL);
++ g_option_context_parse (context, &argc, &argv, NULL);
++ g_option_context_free (context);
++
++
++ error = NULL;
++ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ if (connection == NULL) {
++ g_warning ("Couldn't connect to system bus: %s", error->message);
++ g_error_free (error);
++ goto out;
++ }
++
++ bus_proxy = dbus_g_proxy_new_for_name (connection,
++ DBUS_SERVICE_DBUS,
++ DBUS_PATH_DBUS,
++ DBUS_INTERFACE_DBUS);
++ if (bus_proxy == NULL) {
++ g_warning ("Could not construct bus_proxy object; bailing out");
++ goto out;
++ }
++
++ if (!acquire_name_on_proxy (bus_proxy) ) {
++ g_warning ("Could not acquire name; bailing out");
++ goto out;
++ }
++
++ mechanism = gnome_system_monitor_mechanism_new ();
++
++ if (mechanism == NULL) {
++ goto out;
++ }
++
++ loop = g_main_loop_new (NULL, FALSE);
++
++ g_main_loop_run (loop);
++
++ g_object_unref (mechanism);
++ g_main_loop_unref (loop);
++ ret = 0;
++
++out:
++ return ret;
++}
+diff -up gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml.polkit gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml
+--- gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml.polkit 2010-09-30 14:27:14.735603002 -0400
++++ gnome-system-monitor-2.28.2/src/gnome-system-monitor-mechanism.xml 2010-09-30 14:27:14.735603002 -0400
+@@ -0,0 +1,15 @@
++<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
++<node name="/">
++ <interface name="org.gnome.SystemMonitor.Mechanism">
++ <method name="Kill">
++ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
++ <arg name="pid" direction="in" type="i"/>
++ <arg name="signal" direction="in" type="i"/>
++ </method>
++ <method name="Renice">
++ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
++ <arg name="pid" direction="in" type="i"/>
++ <arg name="nice_value" direction="in" type="i"/>
++ </method>
++ </interface>
++</node>
+diff -up gnome-system-monitor-2.28.2/src/interface.cpp.polkit gnome-system-monitor-2.28.2/src/interface.cpp
+--- gnome-system-monitor-2.28.2/src/interface.cpp.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/interface.cpp 2010-09-30 14:27:14.737603002 -0400
+@@ -30,6 +30,10 @@
+ #include <gdk/gdkkeysyms.h>
+ #include <math.h>
+
++#ifdef HAVE_POLKIT
++# include <polkit/polkit.h>
++#endif
++
+ #include "procman.h"
+ #include "callbacks.h"
+ #include "interface.h"
+@@ -58,6 +62,7 @@ static const GtkActionEntry menu_entries
+ N_("Quit the program"), G_CALLBACK (cb_app_exit) },
+
+
++#ifndef HAVE_POLKIT
+ { "StopProcess", NULL, N_("_Stop Process"), "<control>S",
+ N_("Stop process"), G_CALLBACK(cb_kill_sigstop) },
+ { "ContProcess", NULL, N_("_Continue Process"), "<control>C",
+@@ -67,6 +72,7 @@ static const GtkActionEntry menu_entries
+ N_("Force process to finish normally"), G_CALLBACK (cb_end_process) },
+ { "KillProcess", NULL, N_("_Kill Process"), "<control>K",
+ N_("Force process to finish immediately"), G_CALLBACK (cb_kill_process) },
++#endif
+ { "ChangePriority", NULL, N_("_Change Priority..."), "<control>N",
+ N_("Change the order of priority of process"), G_CALLBACK (cb_renice) },
+ { "Preferences", GTK_STOCK_PREFERENCES, NULL, NULL,
+@@ -186,10 +192,16 @@ create_proc_view (ProcData *procdata)
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0);
+
++#ifdef HAVE_POLKIT
++ procdata->endprocessbutton = gtk_button_new ();
++ gtk_activatable_set_related_action (GTK_ACTIVATABLE (procdata->endprocessbutton),
++ procdata->sigterm_action);
++#else
+ procdata->endprocessbutton = gtk_button_new_with_mnemonic (_("End _Process"));
+- gtk_box_pack_end (GTK_BOX (hbox2), procdata->endprocessbutton, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (procdata->endprocessbutton), "clicked",
+ G_CALLBACK (cb_end_process_button_pressed), procdata);
++#endif
++ gtk_box_pack_end (GTK_BOX (hbox2), procdata->endprocessbutton, FALSE, FALSE, 0);
+
+
+ /* create popup_menu */
+@@ -670,6 +682,41 @@ create_main_window (ProcData *procdata)
+ G_CALLBACK(cb_radio_processes),
+ procdata);
+
++#ifdef HAVE_POLKIT
++ procdata->sigstop_action = gtk_action_new ("StopProcess",
++ _("_Stop Process"),
++ _("Stop process"),
++ NULL);
++ g_signal_connect (procdata->sigstop_action, "activate", G_CALLBACK (cb_kill_sigstop), procdata);
++ gtk_action_group_add_action_with_accel (procdata->action_group,
++ GTK_ACTION (procdata->sigstop_action),
++ "<control>S");
++
++ procdata->sigcont_action = gtk_action_new ("ContProcess",
++ _("_Continue Process"),
++ _("Continue process"),
++ NULL);
++ g_signal_connect (procdata->sigcont_action, "activate", G_CALLBACK (cb_kill_sigcont), procdata);
++ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigcont_action),
++ "<control>C");
++
++ procdata->sigterm_action = gtk_action_new ("EndProcess",
++ _("End _Process"),
++ _("Force process to finish normally"),
++ NULL);
++ g_signal_connect (procdata->sigterm_action, "activate", G_CALLBACK (cb_end_process), procdata);
++ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigterm_action),
++ "<control>E");
++
++ procdata->sigkill_action = gtk_action_new ("KillProcess",
++ _("_Kill Process"),
++ _("Force process to finish immediately"),
++ NULL);
++ g_signal_connect (procdata->sigkill_action, "activate", G_CALLBACK (cb_kill_process), procdata);
++ gtk_action_group_add_action_with_accel (procdata->action_group, GTK_ACTION (procdata->sigkill_action),
++ "<control>K");
++#endif
++
+ gtk_ui_manager_insert_action_group (procdata->uimanager,
+ procdata->action_group,
+ 0);
+@@ -677,7 +724,6 @@ create_main_window (ProcData *procdata)
+ menubar = gtk_ui_manager_get_widget (procdata->uimanager, "/MenuBar");
+ gtk_box_pack_start (GTK_BOX (main_box), menubar, FALSE, FALSE, 0);
+
+-
+ /* create the main notebook */
+ procdata->notebook = notebook = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (main_box),
+@@ -774,23 +820,26 @@ update_sensitivity(ProcData *data)
+ processes_sensitivity = (data->config.current_tab == PROCMAN_TAB_PROCESSES);
+ selected_sensitivity = (processes_sensitivity && data->selected_process != NULL);
+
++#ifndef HAVE_POLKIT
+ if(data->endprocessbutton) {
+ /* avoid error on startup if endprocessbutton
+ has not been built yet */
+ gtk_widget_set_sensitive(data->endprocessbutton, selected_sensitivity);
+ }
++#endif
+
+ for (i = 0; i != G_N_ELEMENTS(processes_actions); ++i) {
+ action = gtk_action_group_get_action(data->action_group,
+ processes_actions[i]);
+- gtk_action_set_sensitive(action, processes_sensitivity);
++ gtk_action_set_sensitive(action, selected_sensitivity);
+ }
+
+ for (i = 0; i != G_N_ELEMENTS(selected_actions); ++i) {
+ action = gtk_action_group_get_action(data->action_group,
+ selected_actions[i]);
+- gtk_action_set_sensitive(action, selected_sensitivity);
++ gtk_action_set_sensitive(action, processes_sensitivity);
+ }
++
+ }
+
+ static void
+diff -up gnome-system-monitor-2.28.2/src/Makefile.am.polkit gnome-system-monitor-2.28.2/src/Makefile.am
+--- gnome-system-monitor-2.28.2/src/Makefile.am.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/Makefile.am 2010-09-30 14:27:14.739603002 -0400
+@@ -4,7 +4,9 @@ INCLUDES = \
+ -DPROCMAN_DATADIR=\""$(datadir)/procman/"\" \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+ -DDATADIR=\""$(datadir)"\" \
+- @PROCMAN_CFLAGS@
++ @PROCMAN_CFLAGS@ \
++ @POLKIT_CFLAGS@ \
++ @POLKIT_CFLAGS@
+
+ bin_PROGRAMS = gnome-system-monitor
+
+@@ -35,8 +37,11 @@ gnome_system_monitor_SOURCES = \
+ e_date.c e_date.h \
+ gsm_color_button.c gsm_color_button.h
+
++if HAVE_POLKIT
++gnome_system_monitor_SOURCES += gnome-system-monitor-mechanism-client-glue.h
++endif
+
+-gnome_system_monitor_LDADD = @PROCMAN_LIBS@ libbacon.la
++gnome_system_monitor_LDADD = @PROCMAN_LIBS@ @POLKIT_LIBS@ libbacon.la
+
+
+ noinst_LTLIBRARIES = libbacon.la
+@@ -52,8 +57,44 @@ schema_ins = gnome-system-monitor.schem
+ schema_DATA = $(schema_ins:.schemas.in=.schemas)
+ @INTLTOOL_SCHEMAS_RULE@
+
++######################################################################
++if HAVE_POLKIT
++
++polkit_policydir = $(datadir)/polkit-1/actions
++dist_polkit_policy_DATA = org.gnome.system-monitor.policy
++# You will need a recent intltool or the patch from this bug http://bugzilla.gnome.org/show_bug.cgi?id=462312
++ at INTLTOOL_POLICY_RULE@
++
++gnome-system-monitor-mechanism-client-glue.h: gnome-system-monitor-mechanism.xml Makefile.am
++ dbus-binding-tool --prefix=gnome_system_monitor_mechanism --mode=glib-client --output=gnome-system-monitor-mechanism-client-glue.h gnome-system-monitor-mechanism.xml
++
++gnome-system-monitor-mechanism-glue.h: gnome-system-monitor-mechanism.xml Makefile.am
++ dbus-binding-tool --prefix=gnome_system_monitor_mechanism --mode=glib-server --output=gnome-system-monitor-mechanism-glue.h gnome-system-monitor-mechanism.xml
++
++dbusconfdir = $(sysconfdir)/dbus-1/system.d
++dbusconf_DATA = org.gnome.SystemMonitor.Mechanism.conf
++
++org.gnome.SystemMonitor.Mechanism.service : org.gnome.SystemMonitor.Mechanism.service.in Makefile.am
++ sed -e s_libexecdir_$(libexecdir)_ org.gnome.SystemMonitor.Mechanism.service.in > org.gnome.SystemMonitor.Mechanism.service
++
++dbussyssvcdir = $(datadir)/dbus-1/system-services
++dbussyssvc_DATA = org.gnome.SystemMonitor.Mechanism.service
++
++libexec_PROGRAMS = gnome-system-monitor-mechanism
++gnome_system_monitor_mechanism_SOURCES = \
++ gnome-system-monitor-mechanism-glue.h \
++ gnome-system-monitor-mechanism.c
++
++gnome_system_monitor_mechanism_CFLAGS = $(POLKIT_CFLAGS)
++gnome_system_monitor_mechanism_LDADD = $(POLKIT_LIBS)
++endif
++######################################################################
++
++
+ EXTRA_DIST = \
+- $(schema_ins)
++ $(schema_ins) \
++ org.gnome.system-monitor.policy.in \
++ org.gnome.system-monitor.service.in
+
+ CLEANFILES = \
+ $(schema_DATA)
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf.polkit gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf
+--- gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf.polkit 2010-09-30 14:27:14.740603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.conf 2010-09-30 14:27:14.740603002 -0400
+@@ -0,0 +1,15 @@
++<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
++
++<!DOCTYPE busconfig PUBLIC
++ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
++ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
++<busconfig>
++ <!-- Only root can own the service -->
++ <policy user="root">
++ <allow own="org.gnome.SystemMonitor.Mechanism"/>
++ </policy>
++
++ <policy context="default">
++ <allow send_destination="org.gnome.SystemMonitor.Mechanism"/>
++ </policy>
++</busconfig>
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in.polkit gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in
+--- gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in.polkit 2010-09-30 14:27:14.741603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.SystemMonitor.Mechanism.service.in 2010-09-30 14:27:14.741603002 -0400
+@@ -0,0 +1,4 @@
++[D-BUS Service]
++Name=org.gnome.SystemMonitor.Mechanism
++Exec=libexecdir/gnome-system-monitor-mechanism
++User=root
+diff -up gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in.polkit gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in
+--- gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in.polkit 2010-09-30 14:27:14.742603002 -0400
++++ gnome-system-monitor-2.28.2/src/org.gnome.system-monitor.policy.in 2010-09-30 14:27:14.743603002 -0400
+@@ -0,0 +1,50 @@
++<?xml version="1.0" encoding="utf-8"?>
++
++<!DOCTYPE policyconfig PUBLIC
++ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
++ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
++
++<!--
++Policy definitions for gnome-system-monitor
++
++Copyright (c) 2007 David Zeuthen <david at fubar.dk>
++
++NOTE: If you make changes to this file, make sure to validate the file
++using the polkit-policy-file-validate(1) tool. Changes made to this
++file are instantly applied.
++-->
++
++<policyconfig>
++
++ <vendor>The GNOME Project</vendor>
++ <vendor_url>http://online.gnome.org/application?id=gnome-system-monitor</vendor_url>
++ <icon_name>utilities-system-monitor</icon_name>
++
++ <action id="org.gnome.system-monitor.change-priority">
++ <_description>Change priority of a process owned by another user</_description>
++ <_message>Changing the priority of a process owned by another user requires privileges</_message>
++ <defaults>
++ <allow_inactive>no</allow_inactive>
++ <allow_active>auth_admin</allow_active>
++ </defaults>
++ </action>
++
++ <action id="org.gnome.system-monitor.increase-own-priority">
++ <_description>Increase the priority of a processes</_description>
++ <_message>Increasing the priority of one of your own processes requires privileges</_message>
++ <defaults>
++ <allow_inactive>no</allow_inactive>
++ <allow_active>auth_self_keep</allow_active>
++ </defaults>
++ </action>
++
++ <action id="org.gnome.system-monitor.kill">
++ <_description>Kill a process owned by another user</_description>
++ <_message>Killing a process owned by another user requires privileges</_message>
++ <defaults>
++ <allow_inactive>no</allow_inactive>
++ <allow_active>auth_admin</allow_active>
++ </defaults>
++ </action>
++
++</policyconfig>
+diff -up gnome-system-monitor-2.28.2/src/procactions.cpp.polkit gnome-system-monitor-2.28.2/src/procactions.cpp
+--- gnome-system-monitor-2.28.2/src/procactions.cpp.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/procactions.cpp 2010-09-30 14:27:14.744603002 -0400
+@@ -31,6 +31,10 @@
+ #include "procdialogs.h"
+ #include "callbacks.h"
+
++#ifdef HAVE_POLKIT
++# include "gnome-system-monitor-mechanism-client-glue.h"
++# include <polkit/polkit.h>
++#endif
+
+ static void
+ renice_single_process (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+@@ -48,6 +52,10 @@ renice_single_process (GtkTreeModel *mod
+ if (!info)
+ return;
+
++ /* docs for getpriority suggest clearing errno before the call
++ * since -1 is a legitimate return value */
++ errno = 0;
++
+ error = setpriority (PRIO_PROCESS, info->pid, args->nice_value);
+
+ /* success */
+@@ -55,6 +63,28 @@ renice_single_process (GtkTreeModel *mod
+
+ saved_errno = errno;
+
++#ifdef HAVE_POLKIT
++ /* need to be root */
++ if (errno == EPERM || errno == EACCES) {
++ GError *error = NULL;
++
++ if (!org_gnome_SystemMonitor_Mechanism_renice (args->procdata->mechanism_proxy,
++ info->pid,
++ args->nice_value,
++ &error)) {
++ /* TODO: Handle "require privileges" */
++ error_msg = g_strdup_printf (
++ _("Cannot renice process with pid %d to nice value %d: "
++ "%s"),
++ info->pid, args->nice_value, error->message);
++ g_error_free (error);
++ } else {
++ return;
++ }
++ } else {
++ return;
++ }
++#else
+ /* need to be root */
+ if(errno == EPERM || errno == EACCES) {
+ gboolean success;
+@@ -69,10 +99,11 @@ renice_single_process (GtkTreeModel *mod
+ saved_errno = errno;
+ }
+ }
++#endif
+
+ /* failed */
+ error_msg = g_strdup_printf (
+- _("Cannot change the priority of process with pid %d to %d.\n"
++ _("Cannot change the priority of process with pid %d to %d: "
+ "%s"),
+ info->pid, args->nice_value, g_strerror(saved_errno));
+
+@@ -135,6 +166,28 @@ kill_single_process (GtkTreeModel *model
+
+ saved_errno = errno;
+
++#ifdef HAVE_POLKIT
++ /* need to be root */
++ if (errno == EPERM) {
++ GError *error = NULL;
++
++ if (!org_gnome_SystemMonitor_Mechanism_kill (args->procdata->mechanism_proxy,
++ info->pid,
++ args->signal,
++ &error)) {
++ /* TODO: Handle "require privileges" */
++ error_msg = g_strdup_printf (
++ _("Cannot kill process with pid %d with signal %d.\n"
++ "%s"),
++ info->pid, args->signal, error->message);
++ g_error_free (error);
++ } else {
++ return;
++ }
++ } else {
++ return;
++ }
++#else
+ /* need to be root */
+ if(errno == EPERM) {
+ gboolean success;
+@@ -149,12 +202,12 @@ kill_single_process (GtkTreeModel *model
+ saved_errno = errno;
+ }
+ }
+-
+ /* failed */
+ error_msg = g_strdup_printf (
+ _("Cannot kill process with pid %d with signal %d.\n"
+ "%s"),
+ info->pid, args->signal, g_strerror(saved_errno));
++#endif
+
+ dialog = gtk_message_dialog_new (
+ NULL,
+@@ -188,3 +241,4 @@ kill_process (ProcData *procdata, int si
+ procdata);
+ proctable_update_all (procdata);
+ }
++
+diff -up gnome-system-monitor-2.28.2/src/procdialogs.cpp.polkit gnome-system-monitor-2.28.2/src/procdialogs.cpp
+--- gnome-system-monitor-2.28.2/src/procdialogs.cpp.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/src/procdialogs.cpp 2010-09-30 14:27:49.183603015 -0400
+@@ -123,29 +123,34 @@ get_nice_level (gint nice)
+ return _("(Very Low Priority)");
+ }
+
++typedef struct {
++ GtkWidget *priority_label;
++ ProcData *procdata;
++} ReniceClosure;
++
+ static void
+ renice_scale_changed (GtkAdjustment *adj, gpointer data)
+ {
+- GtkWidget *label = GTK_WIDGET (data);
+-
+- new_nice_value = int(gtk_adjustment_get_value (adj));
+- gtk_label_set_text (GTK_LABEL (label), get_nice_level (new_nice_value));
+-
++ ReniceClosure *rc = (ReniceClosure *) data;
++
++ new_nice_value = int(gtk_adjustment_get_value (adj));
++ gtk_label_set_text (GTK_LABEL (rc->priority_label), get_nice_level (new_nice_value));
+ }
+
+ static void
+ renice_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
+ {
+- ProcData *procdata = static_cast<ProcData*>(data);
+-
++ ReniceClosure *rc = (ReniceClosure *) data;
++
+ if (id == 100) {
+ if (new_nice_value == -100)
+ return;
+- renice(procdata, new_nice_value);
++ renice(rc->procdata, new_nice_value);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ renice_dialog = NULL;
++ g_free (rc);
+ }
+
+ void
+@@ -155,7 +160,6 @@ procdialog_create_renice_dialog (ProcDat
+ GtkWidget *dialog = NULL;
+ GtkWidget *dialog_vbox;
+ GtkWidget *vbox;
+- GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *priority_label;
+ GtkWidget *table;
+@@ -163,14 +167,19 @@ procdialog_create_renice_dialog (ProcDat
+ GtkWidget *hscale;
+ GtkWidget *button;
+ GtkWidget *align;
++ GtkWidget *hbox;
+ GtkWidget *icon;
+ gchar *text;
++ ReniceClosure *rc;
+
+ if (renice_dialog)
+ return;
+
+ if (!info)
+ return;
++
++ rc = g_new0 (ReniceClosure, 1);
++ rc->procdata = procdata;
+
+ dialog = gtk_dialog_new_with_buttons (_("Change Priority"), NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+@@ -180,24 +189,14 @@ procdialog_create_renice_dialog (ProcDat
+ gtk_window_set_resizable (GTK_WINDOW (renice_dialog), FALSE);
+ gtk_dialog_set_has_separator (GTK_DIALOG (renice_dialog), FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (renice_dialog), 5);
+-
+- button = gtk_button_new ();
+- gtk_widget_set_can_default (button, TRUE);
+-
+- align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
+- gtk_container_add (GTK_CONTAINER (button), align);
+-
+- hbox = gtk_hbox_new (FALSE, 2);
+- gtk_container_add (GTK_CONTAINER (align), hbox);
+
++ button = gtk_button_new_with_mnemonic (_("Change _Priority"));
++ gtk_widget_set_can_default (button, TRUE);
+ icon = gtk_image_new_from_stock (GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON);
+- gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+-
+- label = gtk_label_new_with_mnemonic (_("Change _Priority"));
+- gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
+- gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
++ gtk_button_set_image (GTK_BUTTON (button), icon);
+
+ gtk_dialog_add_action_widget (GTK_DIALOG (renice_dialog), button, 100);
++
+ gtk_dialog_set_default_response (GTK_DIALOG (renice_dialog), 100);
+ new_nice_value = -100;
+
+@@ -238,15 +237,16 @@ procdialog_create_renice_dialog (ProcDat
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ g_free (text);
++
++ rc->priority_label = priority_label;
++ new_nice_value = info->nice;
+
+ g_signal_connect (G_OBJECT (dialog), "response",
+- G_CALLBACK (renice_dialog_button_pressed), procdata);
++ G_CALLBACK (renice_dialog_button_pressed), rc);
+ g_signal_connect (G_OBJECT (renice_adj), "value_changed",
+- G_CALLBACK (renice_scale_changed), priority_label);
++ G_CALLBACK (renice_scale_changed), rc);
+
+ gtk_widget_show_all (dialog);
+-
+-
+ }
+
+ static void
+diff -up gnome-system-monitor-2.28.2/src/procman.cpp.polkit gnome-system-monitor-2.28.2/src/procman.cpp
+--- gnome-system-monitor-2.28.2/src/procman.cpp.polkit 2010-09-27 19:13:17.000000000 -0400
++++ gnome-system-monitor-2.28.2/src/procman.cpp 2010-09-30 14:27:14.747603002 -0400
+@@ -36,6 +36,10 @@
+ #include <glibtop/close.h>
+ #include <glibtop/loadavg.h>
+
++#ifdef HAVE_POLKIT
++# include <dbus/dbus-glib.h>
++#endif
++
+ #include "load-graph.h"
+ #include "procman.h"
+ #include "interface.h"
+@@ -58,7 +62,25 @@ ProcData::ProcData()
+ disk_timeout(0),
+ cpu_total_time(1),
+ cpu_total_time_last(1)
+-{ }
++{
++#ifdef HAVE_POLKIT
++ GError *error;
++ DBusGConnection *bus;
++
++ error = NULL;
++ bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ if (bus == NULL) {
++ g_warning ("Couldn't connect to system bus: %s", error->message);
++ g_error_free (error);
++ this->mechanism_proxy = NULL;
++ } else {
++ this->mechanism_proxy = dbus_g_proxy_new_for_name (bus,
++ "org.gnome.SystemMonitor.Mechanism",
++ "/",
++ "org.gnome.SystemMonitor.Mechanism");
++ }
++#endif
++}
+
+
+ ProcData* ProcData::get_instance()
+diff -up gnome-system-monitor-2.28.2/src/procman.h.polkit gnome-system-monitor-2.28.2/src/procman.h
+--- gnome-system-monitor-2.28.2/src/procman.h.polkit 2010-02-09 08:23:26.000000000 -0500
++++ gnome-system-monitor-2.28.2/src/procman.h 2010-09-30 14:27:14.748603002 -0400
+@@ -33,6 +33,10 @@
+ #include <map>
+ #include <string>
+
++#ifdef HAVE_POLKIT
++# include <dbus/dbus-glib.h>
++#endif
++
+ struct ProcInfo;
+ struct ProcData;
+ struct LoadGraph;
+@@ -210,6 +214,15 @@ struct ProcData
+ GtkWidget *app;
+ GtkUIManager *menu;
+
++#ifdef HAVE_POLKIT
++ DBusGProxy *mechanism_proxy;
++
++ GtkAction *sigstop_action;
++ GtkAction *sigcont_action;
++ GtkAction *sigterm_action;
++ GtkAction *sigkill_action;
++#endif
++
+ unsigned frequency;
+
+ SmoothRefresh *smooth_refresh;
+@@ -230,7 +243,6 @@ gboolean procman_get_tree_state (GConfCl
+
+
+
+-
+ struct ReniceArgs
+ {
+ ProcData *procdata;
diff --git a/sources b/sources
index bc02e21..d4d76b0 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-064cf1a97d3dd1946bc3e55d8272c2c8 gnome-system-monitor-2.28.1.tar.bz2
+3f0bca9b0ebc7a365466851cd580d167 gnome-system-monitor-2.28.2.tar.bz2
More information about the scm-commits
mailing list