Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:13.1
xfce4-power-manager
xfce4-power-manager-systemd-shutdown-reboot-sup...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xfce4-power-manager-systemd-shutdown-reboot-support.patch of Package xfce4-power-manager
From 023333688f73ed26097c693d43f76e4b7d5698e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@googlemail.com> Date: Fri, 7 Jun 2013 18:38:42 +0200 Subject: [PATCH] Add shutdown/reboot functionality for systemd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit based on the xfce4-session implementation [1] [1] http://git.xfce.org/xfce/xfce4-session/commit/?id=ae28aef315a7a6b90f1649ce6d1f30b842791cbf Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com> --- configure.ac.in | 2 + src/Makefile.am | 14 +++- src/xfpm-manager.c | 29 ++++++- src/xfpm-power.c | 66 ++++++++++++++- src/xfpm-systemd.c | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xfpm-systemd.h | 60 +++++++++++++ 6 files changed, 411 insertions(+), 5 deletions(-) create mode 100644 src/xfpm-systemd.c create mode 100644 src/xfpm-systemd.h Index: xfce4-power-manager-1.2.0/configure.ac =================================================================== --- xfce4-power-manager-1.2.0.orig/configure.ac +++ xfce4-power-manager-1.2.0/configure.ac @@ -100,6 +100,8 @@ if test "x$ac_cv_enable_polkit" = "xno"; polkit="no" else AC_MSG_RESULT([yes]) + XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100], + [systemd], [Systemd support (through polkit)]) AC_DEFINE(ENABLE_POLKIT, 1 , [PolicyKit support]) polkit="yes" fi Index: xfce4-power-manager-1.2.0/src/Makefile.am =================================================================== --- xfce4-power-manager-1.2.0.orig/src/Makefile.am +++ xfce4-power-manager-1.2.0/src/Makefile.am @@ -41,6 +41,12 @@ xfce4_power_manager_SOURCES = gsd-media-keys-window.c \ gsd-media-keys-window.h +if HAVE_SYSTEMD +xfce4_power_manager_SOURCES += \ + xfpm-systemd.c \ + xfpm-systemd.h +endif + xfce4_power_manager_CFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/common \ @@ -54,6 +60,7 @@ xfce4_power_manager_CFLAGS = $(LIBXFCE4UI_CFLAGS) \ $(XFCONF_CFLAGS) \ $(LIBNOTIFY_CFLAGS) \ + $(SYSTEMD_CFLAGS) \ $(XRANDR_CFLAGS) \ $(DPMS_CFLAGS) \ $(PLATFORM_CPPFLAGS) \ @@ -72,6 +79,7 @@ xfce4_power_manager_LDADD = $(LIBXFCE4UI_LIBS) \ $(XFCONF_LIBS) \ $(LIBNOTIFY_LIBS) \ + $(SYSTEMD_LIBS) \ $(XRANDR_LIBS) \ $(DPMS_LIBS) Index: xfce4-power-manager-1.2.0/src/xfpm-manager.c =================================================================== --- xfce4-power-manager-1.2.0.orig/src/xfpm-manager.c +++ xfce4-power-manager-1.2.0/src/xfpm-manager.c @@ -58,6 +58,10 @@ #include "xfpm-enum-types.h" #include "xfpm-dbus-monitor.h" +#ifdef HAVE_SYSTEMD +#include "xfpm-systemd.h" +#endif + static void xfpm_manager_finalize (GObject *object); static void xfpm_manager_dbus_class_init (XfpmManagerClass *klass); @@ -80,6 +84,9 @@ struct XfpmManagerPrivate XfpmButton *button; XfpmXfconf *conf; XfpmBacklight *backlight; +#ifdef HAVE_SYSTEMD + XfpmSystemd *systemd; +#endif XfpmConsoleKit *console; XfpmDBusMonitor *monitor; XfpmDisks *disks; @@ -131,7 +138,12 @@ xfpm_manager_finalize (GObject *object) g_object_unref (manager->priv->button); g_object_unref (manager->priv->conf); g_object_unref (manager->priv->client); - g_object_unref (manager->priv->console); +#ifdef HAVE_SYSTEMD + if ( manager->priv->systemd != NULL ) + g_object_unref (manager->priv->systemd); +#endif + if ( manager->priv->console != NULL ) + g_object_unref (manager->priv->console); g_object_unref (manager->priv->monitor); g_object_unref (manager->priv->disks); g_object_unref (manager->priv->inhibit); @@ -201,6 +213,11 @@ static void xfpm_manager_shutdown (XfpmManager *manager) { GError *error = NULL; +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + xfpm_systemd_shutdown (manager->priv->systemd, &error ); + else +#endif xfpm_console_kit_shutdown (manager->priv->console, &error ); if ( error ) @@ -517,10 +534,17 @@ void xfpm_manager_start (XfpmManager *ma dbus_g_error_domain_register (XFPM_ERROR, NULL, XFPM_TYPE_ERROR); - + manager->priv->power = xfpm_power_get (); manager->priv->button = xfpm_button_new (); manager->priv->conf = xfpm_xfconf_new (); +#ifdef HAVE_SYSTEMD + manager->priv->console = NULL; + manager->priv->systemd = NULL; + if ( LOGIND_RUNNING () ) + manager->priv->systemd = xfpm_systemd_new (); + else +#endif manager->priv->console = xfpm_console_kit_new (); manager->priv->monitor = xfpm_dbus_monitor_new (); manager->priv->disks = xfpm_disks_new (); @@ -603,6 +627,13 @@ GHashTable *xfpm_manager_get_config (Xfp hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (manager->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (manager->priv->console), "can-shutdown", &can_shutdown, NULL); Index: xfce4-power-manager-1.2.0/src/xfpm-power.c =================================================================== --- xfce4-power-manager-1.2.0.orig/src/xfpm-power.c +++ xfce4-power-manager-1.2.0/src/xfpm-power.c @@ -51,6 +51,10 @@ #include "xfpm-enum-types.h" #include "egg-idletime.h" +#ifdef HAVE_SYSTEMD +#include "xfpm-systemd.h" +#endif + static void xfpm_power_finalize (GObject *object); static void xfpm_power_get_property (GObject *object, @@ -75,6 +79,9 @@ struct XfpmPowerPrivate GHashTable *hash; +#ifdef HAVE_SYSTEMD + XfpmSystemd *systemd; +#endif XfpmConsoleKit *console; XfpmInhibit *inhibit; XfpmXfconf *conf; @@ -686,10 +693,17 @@ xfpm_power_add_actions_to_notification ( { gboolean can_shutdown; +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_shutdown, NULL); - + if ( power->priv->can_hibernate && power->priv->auth_hibernate ) { xfpm_notify_add_action_to_notification( @@ -762,10 +776,17 @@ xfpm_power_show_critical_action_gtk (Xfp const gchar *message; gboolean can_shutdown; +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_shutdown, NULL); - + message = _("System is running on low power. "\ "Save your work to avoid losing data"); @@ -1333,6 +1354,13 @@ xfpm_power_init (XfpmPower *power) power->priv->inhibit = xfpm_inhibit_new (); power->priv->notify = xfpm_notify_new (); power->priv->conf = xfpm_xfconf_new (); +#ifdef HAVE_SYSTEMD + power->priv->systemd = NULL; + power->priv->console = NULL; + if ( LOGIND_RUNNING () ) + power->priv->systemd = xfpm_systemd_new (); + else +#endif power->priv->console = xfpm_console_kit_new (); g_signal_connect_swapped (power->priv->conf, "notify::" SHOW_TRAY_ICON_CFG, @@ -1451,7 +1479,12 @@ xfpm_power_finalize (GObject *object) g_object_unref (power->priv->inhibit); g_object_unref (power->priv->notify); g_object_unref (power->priv->conf); - g_object_unref (power->priv->console); +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_unref (power->priv->systemd); +#endif + if ( power->priv->console != NULL ) + g_object_unref (power->priv->console); xfpm_power_hide_adapter_icon (power); @@ -1613,10 +1646,17 @@ static gboolean xfpm_power_dbus_shutdown { gboolean can_reboot; +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_reboot, NULL); - + if ( !can_reboot) { g_set_error (error, XFPM_ERROR, XFPM_ERROR_PERMISSION_DENIED, @@ -1624,6 +1664,11 @@ static gboolean xfpm_power_dbus_shutdown return FALSE; } +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + xfpm_systemd_shutdown (power->priv->systemd, error); + else +#endif xfpm_console_kit_shutdown (power->priv->console, error); return TRUE; @@ -1634,10 +1679,17 @@ static gboolean xfpm_power_dbus_reboot { gboolean can_reboot; +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-restart", &can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-restart", &can_reboot, NULL); - + if ( !can_reboot) { g_set_error (error, XFPM_ERROR, XFPM_ERROR_PERMISSION_DENIED, @@ -1645,7 +1697,12 @@ static gboolean xfpm_power_dbus_reboot return FALSE; } +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + xfpm_systemd_reboot (power->priv->systemd, error); +#else xfpm_console_kit_reboot (power->priv->console, error); +#endif return TRUE; } @@ -1700,10 +1757,17 @@ static gboolean xfpm_power_dbus_can_rebo gboolean * OUT_can_reboot, GError ** error) { +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-reboot", OUT_can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-reboot", OUT_can_reboot, NULL); - + return TRUE; } @@ -1711,9 +1775,17 @@ static gboolean xfpm_power_dbus_can_shut gboolean * OUT_can_shutdown, GError ** error) { +#ifdef HAVE_SYSTEMD + if ( LOGIND_RUNNING () ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", OUT_can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", OUT_can_shutdown, NULL); + return TRUE; } Index: xfce4-power-manager-1.2.0/src/xfpm-systemd.c =================================================================== --- /dev/null +++ xfce4-power-manager-1.2.0/src/xfpm-systemd.c @@ -0,0 +1,245 @@ +/* + * * Copyright (C) 2009-2011 Ali <aliov@xfce.org> + * * Copyright (C) 2013 Andreas Müller <schnitzeltony@googlemail.com> + * + * Licensed under the GNU General Public License Version 2 + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <dbus/dbus-glib.h> +#include <polkit/polkit.h> + +#include "xfpm-systemd.h" + + +static void xfpm_systemd_finalize (GObject *object); + +static void xfpm_systemd_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +#define XFPM_SYSTEMD_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_SYSTEMD, XfpmSystemdPrivate)) + +struct XfpmSystemdPrivate +{ + gboolean can_shutdown; + gboolean can_restart; + + PolkitAuthority *authority; + PolkitSubject *subject; +}; + +enum +{ + PROP_0, + PROP_CAN_RESTART, + PROP_CAN_SHUTDOWN +}; + +G_DEFINE_TYPE (XfpmSystemd, xfpm_systemd, G_TYPE_OBJECT) + +#define SYSTEMD_DBUS_NAME "org.freedesktop.login1" +#define SYSTEMD_DBUS_PATH "/org/freedesktop/login1" +#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager" +#define SYSTEMD_REBOOT_ACTION "Reboot" +#define SYSTEMD_POWEROFF_ACTION "PowerOff" +#define SYSTEMD_REBOOT_TEST "org.freedesktop.login1.reboot" +#define SYSTEMD_POWEROFF_TEST "org.freedesktop.login1.power-off" + +static void +xfpm_systemd_class_init (XfpmSystemdClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = xfpm_systemd_finalize; + + object_class->get_property = xfpm_systemd_get_property; + + g_object_class_install_property (object_class, + PROP_CAN_RESTART, + g_param_spec_boolean ("can-restart", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_CAN_SHUTDOWN, + g_param_spec_boolean ("can-shutdown", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); + + g_type_class_add_private (klass, sizeof (XfpmSystemdPrivate)); +} + +static gboolean +xfpm_systemd_can_method (XfpmSystemd *systemd, + gboolean *can_method, + const gchar *method) +{ + PolkitAuthorizationResult *res; + GError *local_error = NULL; + + *can_method = FALSE; + res = polkit_authority_check_authorization_sync (systemd->priv->authority, + systemd->priv->subject, + method, + NULL, + POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE, + NULL, + &local_error); + if ( local_error ) + { + g_critical ("Unable to get %s : %s", method, local_error->message); + g_error_free (local_error); + } + + if(res) + { + *can_method = polkit_authorization_result_get_is_authorized (res) || + polkit_authorization_result_get_is_challenge (res); + g_object_unref (G_OBJECT (res)); + } + + return TRUE; +} + +static void +xfpm_systemd_init (XfpmSystemd *systemd) +{ + systemd->priv = XFPM_SYSTEMD_GET_PRIVATE (systemd); + systemd->priv->authority = polkit_authority_get_sync (NULL, NULL); + systemd->priv->subject = polkit_unix_process_new (getpid()); + systemd->priv->can_shutdown = FALSE; + systemd->priv->can_restart = FALSE; + + if(systemd->priv->authority && systemd->priv->subject) + { + xfpm_systemd_can_method (systemd, + &systemd->priv->can_shutdown, + SYSTEMD_POWEROFF_TEST); + xfpm_systemd_can_method (systemd, + &systemd->priv->can_restart, + SYSTEMD_REBOOT_TEST); + } +} + +static void xfpm_systemd_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + XfpmSystemd *systemd; + systemd = XFPM_SYSTEMD (object); + + switch (prop_id) + { + case PROP_CAN_SHUTDOWN: + g_value_set_boolean (value, systemd->priv->can_shutdown); + break; + case PROP_CAN_RESTART: + g_value_set_boolean (value, systemd->priv->can_restart); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +xfpm_systemd_finalize (GObject *object) +{ + XfpmSystemd *systemd; + + systemd = XFPM_SYSTEMD (object); + + if(systemd->priv->authority) + g_object_unref (G_OBJECT (systemd->priv->authority)); + if(systemd->priv->subject) + g_object_unref (G_OBJECT (systemd->priv->subject)); + + G_OBJECT_CLASS (xfpm_systemd_parent_class)->finalize (object); +} + +XfpmSystemd * +xfpm_systemd_new (void) +{ + static gpointer systemd_obj = NULL; + + if ( G_LIKELY (systemd_obj != NULL ) ) + { + g_object_ref (systemd_obj); + } + else + { + systemd_obj = g_object_new (XFPM_TYPE_SYSTEMD, NULL); + g_object_add_weak_pointer (systemd_obj, &systemd_obj); + } + + return XFPM_SYSTEMD (systemd_obj); +} + +static void +xfpm_systemd_try_method (XfpmSystemd *systemd, + const gchar *method, + GError **error) +{ + GDBusConnection *bus; + GError *local_error = NULL; + + bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error); + if (G_LIKELY (bus != NULL)) + { + g_dbus_connection_call_sync (bus, + SYSTEMD_DBUS_NAME, + SYSTEMD_DBUS_PATH, + SYSTEMD_DBUS_INTERFACE, + method, + g_variant_new ("(b)", TRUE), + NULL, 0, G_MAXINT, NULL, + &local_error); + g_object_unref (G_OBJECT (bus)); + + if (local_error != NULL) + { + g_propagate_error (error, local_error); + } + } +} + +void xfpm_systemd_shutdown (XfpmSystemd *systemd, GError **error) +{ + xfpm_systemd_try_method (systemd, + SYSTEMD_POWEROFF_ACTION, + error); +} + +void xfpm_systemd_reboot (XfpmSystemd *systemd, GError **error) +{ + xfpm_systemd_try_method (systemd, + SYSTEMD_REBOOT_ACTION, + error); +} Index: xfce4-power-manager-1.2.0/src/xfpm-systemd.h =================================================================== --- /dev/null +++ xfce4-power-manager-1.2.0/src/xfpm-systemd.h @@ -0,0 +1,62 @@ +/* + * * Copyright (C) 2009-2011 Ali <aliov@xfce.org> + * * Copyright (C) 2013 Andreas Müller <schnitzeltony@googlemail.com> + * + * Licensed under the GNU General Public License Version 2 + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFPM_SYSTEMD_H +#define __XFPM_SYSTEMD_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define LOGIND_RUNNING() (access ("/run/systemd/seats/", F_OK) >= 0) + +#define XFPM_TYPE_SYSTEMD (xfpm_systemd_get_type () ) +#define XFPM_SYSTEMD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), XFPM_TYPE_SYSTEMD, XfpmSystemd)) +#define XFPM_IS_SYSTEMD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFPM_TYPE_SYSTEMD)) + +typedef struct XfpmSystemdPrivate XfpmSystemdPrivate; + +typedef struct +{ + GObject parent; + XfpmSystemdPrivate *priv; + +} XfpmSystemd; + +typedef struct +{ + GObjectClass parent_class; + +} XfpmSystemdClass; + +GType xfpm_systemd_get_type (void) G_GNUC_CONST; + +XfpmSystemd *xfpm_systemd_new (void); + +void xfpm_systemd_shutdown (XfpmSystemd *systemd, + GError **error); + +void xfpm_systemd_reboot (XfpmSystemd *systemd, + GError **error); + +G_END_DECLS + +#endif /* __XFPM_SYSTEMD_H */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor