diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c index 4076586..90e7873 100644 --- /dev/null +++ b/xfce4-session/xfsm-systemd.c @@ -0,0 +1,123 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2012 Christian Hesse + * + * 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. + */ + +#include + +#include +#include + +#include "xfsm-systemd.h" + +#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 "org.freedesktop.login1.reboot" +#define SYSTEMD_SHUTDOWN_ACTION "org.freedesktop.login1.power-off" + +struct _SystemdProxy { + PolkitAuthority *authority; + PolkitSubject *subject; +}; + +SystemdProxy * +systemd_proxy_new (void) +{ + SystemdProxy *proxy; + + proxy = g_new0 (SystemdProxy, 1); + + proxy->authority = polkit_authority_get_sync (NULL, NULL); + proxy->subject = polkit_unix_process_new (getpid()); + + return proxy; +} + +void +systemd_proxy_free (SystemdProxy *proxy) +{ + g_object_unref (proxy->authority); + g_object_unref (proxy->subject); + + g_free (proxy); +} + +gboolean systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const gchar *method, GError **error) +{ + PolkitAuthorizationResult *res; + GError *local_error = NULL; + + *can_method = FALSE; + res = polkit_authority_check_authorization_sync (proxy->authority, + proxy->subject, + method, + NULL, + POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE, + NULL, + &local_error); + if (res == NULL) { + g_propagate_error (error, local_error); + return FALSE; + } + + *can_method = polkit_authorization_result_get_is_authorized (res) || + polkit_authorization_result_get_is_challenge (res); + + g_object_unref (res); + + return TRUE; +} + +gboolean systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error) +{ + return systemd_proxy_can_method(proxy, can_restart, SYSTEMD_REBOOT_ACTION, error); +} + +gboolean systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error) +{ + return systemd_proxy_can_method(proxy, can_shutdown, SYSTEMD_SHUTDOWN_ACTION, error); +} + +gboolean systemd_proxy_method (SystemdProxy *proxy, const gchar *method, GError **error) +{ + GDBusConnection *bus; + + bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, 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, NULL); + g_object_unref (bus); + + return TRUE; +} + +gboolean systemd_proxy_restart (SystemdProxy *proxy, GError **error) +{ + return systemd_proxy_method(proxy, "Reboot", error); +} + +gboolean systemd_proxy_shutdown (SystemdProxy *proxy, GError **error) +{ + return systemd_proxy_method(proxy, "PowerOff", error); +} diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h index 3fa8317..2c4d868 100644 --- /dev/null +++ b/xfce4-session/xfsm-systemd.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2012 Christian Hesse + * + * 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 __SYSTEMD_PROXY_H__ +#define __SYSTEMD_PROXY_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _SystemdProxy SystemdProxy; + +SystemdProxy *systemd_proxy_new (void); +void systemd_proxy_free (SystemdProxy *proxy); +gboolean systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const char *method, GError **error); +gboolean systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error); +gboolean systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error); +gboolean systemd_proxy_method (SystemdProxy *proxy, const char *method, GError **error); +gboolean systemd_proxy_restart (SystemdProxy *proxy, GError **error); +gboolean systemd_proxy_shutdown (SystemdProxy *proxy, GError **error); + +G_END_DECLS + +#endif /* __SYSTEMD_PROXY_H__ */ commit 518a28c23f110617aad36e64c02cdab6a36adf37 Author: Christian Hesse Date: Fri Jul 27 14:21:14 2012 +0200 ... diff --git a/configure.in.in b/configure.in.in index 9aa4f8f..aa0b8bb 100644 --- a/configure.in +++ b/configure.in @@ -96,6 +96,33 @@ XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.1.0]) XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84]) XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0]) +dnl systemd integration +AC_ARG_ENABLE([systemd], + AS_HELP_STRING([--enable-systemd], [Use systemd]), + [with_systemd=$enableval], + [with_systemd=auto]) +PKG_CHECK_MODULES(SYSTEMD, + [libsystemd-login polkit-gobject-1], + [have_systemd=yes], [have_systemd=no]) +AC_MSG_CHECKING([whether to use systemd]) +if test x$with_systemd = xauto ; then + if test x$have_systemd = xno ; then + with_systemd=no + else + with_systemd=yes + fi +fi +AC_MSG_RESULT($with_systemd) +if test x$with_systemd = xyes; then + if test x$have_systemd = xno; then + AC_MSG_ERROR([Systemd support explicitly required, but systemd not found]) + fi + AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is used for session tracking]) +fi +AC_SUBST(SYSTEMD_CFLAGS) +AC_SUBST(SYSTEMD_LIBS) +AM_CONDITIONAL(WITH_SYSTEMD, [test "$with_systemd" = "yes"], [Using systemd]) + dnl Check for debugging support XDT_FEATURE_DEBUG([xfsm_debug_default]) commit f1279eba9452f027a2037be77388767437161d51 Author: Christian Hesse Date: Fri Jul 27 14:18:16 2012 +0200 ... diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c index 1429abd..077cdf3 100644 --- a/xfce4-session/xfsm-shutdown.c +++ b/xfce4-session/xfsm-shutdown.c @@ -96,7 +96,11 @@ struct _XfsmShutdown { GObject __parent__; +#ifdef HAVE_SYSTEMD + SystemdProxy *systemd_proxy; +#else XfsmConsolekit *consolekit; +#endif XfsmUPower *upower; /* kiosk settings */ @@ -134,7 +138,11 @@ xfsm_shutdown_init (XfsmShutdown *shutdown) { XfceKiosk *kiosk; +#ifdef HAVE_SYSTEMD + shutdown->systemd_proxy = systemd_proxy_new (); +#else shutdown->consolekit = xfsm_consolekit_get (); +#endif shutdown->upower = xfsm_upower_get (); shutdown->helper_state = SUDO_NOT_INITIAZED; shutdown->helper_require_password = FALSE; @@ -153,7 +161,11 @@ xfsm_shutdown_finalize (GObject *object) { XfsmShutdown *shutdown = XFSM_SHUTDOWN (object); +#ifdef HAVE_SYSTEMD + systemd_proxy_free (shutdown->systemd_proxy); +#else g_object_unref (G_OBJECT (shutdown->consolekit)); +#endif g_object_unref (G_OBJECT (shutdown->upower)); /* close down helper */ @@ -644,7 +656,11 @@ xfsm_shutdown_try_restart (XfsmShutdown *shutdown, if (shutdown->helper_state == SUDO_AVAILABLE) return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_RESTART, error); else +#ifdef HAVE_SYSTEMD + return systemd_proxy_restart (shutdown->systemd_proxy, error); +#else return xfsm_consolekit_try_restart (shutdown->consolekit, error); +#endif } @@ -661,7 +677,11 @@ xfsm_shutdown_try_shutdown (XfsmShutdown *shutdown, if (shutdown->helper_state == SUDO_AVAILABLE) return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SHUTDOWN, error); else +#ifdef HAVE_SYSTEMD + return systemd_proxy_shutdown (shutdown->systemd_proxy, error); +#else return xfsm_consolekit_try_shutdown (shutdown->consolekit, error); +#endif } @@ -701,7 +721,11 @@ xfsm_shutdown_can_restart (XfsmShutdown *shutdown, return TRUE; } +#ifdef HAVE_SYSTEMD + if (systemd_proxy_can_restart (shutdown->systemd_proxy, can_restart, error)) +#else if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error)) +#endif return TRUE; if (xfsm_shutdown_sudo_init (shutdown, error)) @@ -728,7 +752,11 @@ xfsm_shutdown_can_shutdown (XfsmShutdown *shutdown, return TRUE; } +#ifdef HAVE_SYSTEMD + if (systemd_proxy_can_shutdown (shutdown->systemd_proxy, can_shutdown, error)) +#else if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error)) +#endif return TRUE; if (xfsm_shutdown_sudo_init (shutdown, error)) commit 5aea3fb853683246a537a67423cf5b32076b8dfb Author: Christian Hesse Date: Fri Jul 27 14:03:27 2012 +0200 ... diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am index c015154..7e3b311 100644 --- a/xfce4-session/Makefile.am +++ b/xfce4-session/Makefile.am @@ -38,8 +38,6 @@ xfce4_session_SOURCES = \ xfsm-compat-gnome.h \ xfsm-compat-kde.c \ xfsm-compat-kde.h \ - xfsm-consolekit.c \ - xfsm-consolekit.h \ xfsm-dns.c \ xfsm-dns.h \ xfsm-error.c \ @@ -65,6 +63,16 @@ xfce4_session_SOURCES = \ xfsm-upower.c \ xfsm-upower.h +if WITH_SYSTEMD +xfce4_session_SOURCES += \ + xfsm-systemd.c \ + xfsm-systemd.h +else +xfce4_session_SOURCES += \ + xfsm-consolekit.c \ + xfsm-consolekit.h +endif + xfce4_session_CFLAGS = \ $(LIBSM_CFLAGS) \ $(LIBX11_CFLAGS) \ @@ -72,6 +80,7 @@ xfce4_session_CFLAGS = \ $(DBUS_CFLAGS) \ $(DBUS_GLIB_CFLAGS) \ $(LIBWNCK_CFLAGS) \ + $(SYSTEMD_CFLAGS) \ $(XFCONF_CFLAGS) \ $(GMODULE_CFLAGS) \ $(PLATFORM_CFLAGS) @@ -91,6 +100,7 @@ xfce4_session_LDADD = \ $(DBUS_LIBS) \ $(DBUS_GLIB_LIBS) \ $(LIBWNCK_LIBS) \ + $(SYSTEMD_LIBS) \ $(XFCONF_LIBS) \ -lm diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c index d8757a8..1429abd 100644 --- a/xfce4-session/xfsm-shutdown.c +++ b/xfce4-session/xfsm-shutdown.c @@ -66,10 +66,13 @@ #include #include #include -#include #include - +#ifdef HAVE_SYSTEMD +#include +#else +#include +#endif static void xfsm_shutdown_finalize (GObject *object); static void xfsm_shutdown_sudo_free (XfsmShutdown *shutdown);