summaryrefslogtreecommitdiff
path: root/xfce4-session/xfsm-shutdown-helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'xfce4-session/xfsm-shutdown-helper.c')
-rw-r--r--xfce4-session/xfsm-shutdown-helper.c1862
1 files changed, 0 insertions, 1862 deletions
diff --git a/xfce4-session/xfsm-shutdown-helper.c b/xfce4-session/xfsm-shutdown-helper.c
deleted file mode 100644
index ef29f4f5..00000000
--- a/xfce4-session/xfsm-shutdown-helper.c
+++ /dev/null
@@ -1,1862 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2003-2006 Benedikt Meurer <benny@xfce.org>
- * Copyright (c) 2010 Ali Abdallah <aliov@xfce.org>
- * All rights reserved.
- *
- * 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, 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
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#endif
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
-#ifdef HAVE_SYS_USER_H
-#include <sys/user.h>
-#endif
-#ifdef HAVE_SYS_SYSCTL_H
-#include <sys/sysctl.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include <libxfce4util/libxfce4util.h>
-
-#include <xfce4-session/xfsm-shutdown-helper.h>
-#include <xfce4-session/xfsm-global.h>
-
-static void xfsm_shutdown_helper_finalize (GObject *object);
-
-static void xfsm_shutdown_helper_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void xfsm_shutdown_helper_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-
-/**
- * Suspend/Hibernate backend to use.
- *
- * upower, HAL, pmutils via sudo.
- *
- **/
-typedef enum
-{
- XFSM_SLEEP_BACKEND_NOT_SUPPORTED,
- XFSM_SLEEP_BACKEND_UPOWER,
- XFSM_SLEEP_BACKEND_HAL,
- XFSM_SLEEP_BACKEND_SUDO /*sudo pm-suspend ?*/
-
-} XfsmSleepBackend;
-
-/**
- * Shutdown/Reboot backend to use
- *
- * ConsoleKit, HAL, sudo
- **/
-typedef enum
-{
- XFSM_SHUTDOWN_BACKEND_NOT_SUPPORTED,
- XFSM_SHUTDOWN_BACKEND_CONSOLE_KIT,
- XFSM_SHUTDOWN_BACKEND_HAL,
- XFSM_SHUTDOWN_BACKEND_SUDO
-
-} XfsmShutdownBackend;
-
-#ifdef ENABLE_POLKIT
-/*DBus GTypes for polkit calls*/
-static GType polkit_subject_gtype = G_TYPE_INVALID;
-static GType polkit_details_gtype = G_TYPE_INVALID;
-static GType polkit_result_gtype = G_TYPE_INVALID;
-#endif /*ENABLE_POLKIT*/
-
-struct _XfsmShutdownHelper
-{
- GObject parent;
-
- DBusGConnection *system_bus;
-
-#ifdef ENABLE_POLKIT
- DBusGProxy *polkit_proxy;
- GValueArray *polkit_subject;
- GHashTable *polkit_details;
- GHashTable *polkit_subject_hash;
-#endif
-
- XfsmShutdownBackend shutdown_backend;
- XfsmSleepBackend sleep_backend;
-
- gboolean auth_shutdown;
- gboolean auth_restart;
- gboolean auth_suspend;
- gboolean auth_hibernate;
- gboolean can_shutdown;
- gboolean can_restart;
- gboolean can_suspend;
- gboolean can_hibernate;
-
- gboolean devkit_is_upower;
-
- /* Sudo data */
- gchar *sudo;
- FILE *infile;
- FILE *outfile;
- pid_t pid;
- gboolean require_password;
-
-};
-
-struct _XfsmShutdownHelperClass
-{
- GObjectClass parent_class;
-};
-
-enum
-{
- PROP_0,
- PROP_AUTHORIZED_TO_SHUTDOWN,
- PROP_AUTHORIZED_TO_RESTART,
- PROP_AUTHORIZED_TO_SUSPEND,
- PROP_AUTHORIZED_TO_HIBERNATE,
- PROP_CAN_SHUTDOWN,
- PROP_CAN_RESTART,
- PROP_CAN_SUSPEND,
- PROP_CAN_HIBERNATE,
- PROP_USER_CAN_SHUTDOWN,
- PROP_USER_CAN_RESTART,
- PROP_USER_CAN_SUSPEND,
- PROP_USER_CAN_HIBERNATE,
- PROP_REQUIRE_PASSWORD
-};
-
-G_DEFINE_TYPE (XfsmShutdownHelper, xfsm_shutdown_helper, G_TYPE_OBJECT)
-
-#ifdef ENABLE_POLKIT
-
-#if defined(__FreeBSD__)
-/**
- * Taken from polkitunixprocess.c code to get process start
- * time from pid.
- *
- * Copyright (C) 2008 Red Hat, Inc.
- *
- **/
-static gboolean
-get_kinfo_proc (pid_t pid, struct kinfo_proc *p)
-{
- int mib[4];
- size_t len;
-
- len = 4;
- sysctlnametomib ("kern.proc.pid", mib, &len);
-
- len = sizeof (struct kinfo_proc);
- mib[3] = pid;
-
- if (sysctl (mib, 4, p, &len, NULL, 0) == -1)
- return FALSE;
-
- return TRUE;
-}
-#endif /*if defined(__FreeBSD__)*/
-
-static guint64
-get_start_time_for_pid (pid_t pid)
-{
- guint64 start_time;
-#if !defined(__FreeBSD__)
- gchar *filename;
- gchar *contents;
- size_t length;
- gchar **tokens;
- guint num_tokens;
- gchar *p;
- gchar *endp;
-
- start_time = 0;
- contents = NULL;
-
- filename = g_strdup_printf ("/proc/%d/stat", pid);
-
- if (!g_file_get_contents (filename, &contents, &length, NULL))
- goto out;
-
- /* start time is the token at index 19 after the '(process name)' entry - since only this
- * field can contain the ')' character, search backwards for this to avoid malicious
- * processes trying to fool us
- */
- p = strrchr (contents, ')');
- if (p == NULL)
- {
- goto out;
- }
- p += 2; /* skip ') ' */
-
- if (p - contents >= (int) length)
- {
- g_warning ("Error parsing file %s", filename);
- goto out;
- }
-
- tokens = g_strsplit (p, " ", 0);
-
- num_tokens = g_strv_length (tokens);
-
- if (num_tokens < 20)
- {
- g_warning ("Error parsing file %s", filename);
- goto out;
- }
-
- start_time = strtoull (tokens[19], &endp, 10);
- if (endp == tokens[19])
- {
- g_warning ("Error parsing file %s", filename);
- goto out;
- }
-
- g_strfreev (tokens);
-
- out:
- g_free (filename);
- g_free (contents);
-
-#else /*if !defined(__FreeBSD__)*/
-
- struct kinfo_proc p;
-
- start_time = 0;
-
- if (! get_kinfo_proc (pid, &p))
- {
- g_warning ("Error obtaining start time for %d (%s)",
- (gint) pid,
- g_strerror (errno));
- goto out;
- }
-
- start_time = (guint64) p.ki_start.tv_sec;
-
-out:
-#endif
-
- return start_time;
-}
-
-static void
-init_dbus_gtypes (void)
-{
- if (G_UNLIKELY (polkit_subject_gtype == G_TYPE_INVALID ) )
- {
- polkit_subject_gtype =
- dbus_g_type_get_struct ("GValueArray",
- G_TYPE_STRING,
- dbus_g_type_get_map ("GHashTable",
- G_TYPE_STRING,
- G_TYPE_VALUE),
- G_TYPE_INVALID);
- }
-
- if (G_UNLIKELY (polkit_details_gtype == G_TYPE_INVALID ))
- {
- polkit_details_gtype = dbus_g_type_get_map ("GHashTable",
- G_TYPE_STRING,
- G_TYPE_STRING);
- }
-
- if (G_UNLIKELY (polkit_result_gtype == G_TYPE_INVALID ) )
- {
- polkit_result_gtype =
- dbus_g_type_get_struct ("GValueArray",
- G_TYPE_BOOLEAN,
- G_TYPE_BOOLEAN,
- dbus_g_type_get_map ("GHashTable",
- G_TYPE_STRING,
- G_TYPE_STRING),
- G_TYPE_INVALID);
- }
-}
-
-/**
- * xfsm_shutdown_helper_init_polkit_data:
- *
- * Check for Pokit and
- * Init the neccarry Polkit data an GTypes.
- *
- **/
-static gboolean
-xfsm_shutdown_helper_init_polkit_data (XfsmShutdownHelper *helper)
-{
- GValue hash_elem = { 0 };
- guint64 start_time;
- gint pid;
-
- helper->polkit_proxy =
- dbus_g_proxy_new_for_name (helper->system_bus,
- "org.freedesktop.PolicyKit1",
- "/org/freedesktop/PolicyKit1/Authority",
- "org.freedesktop.PolicyKit1.Authority");
-
- if (!helper->polkit_proxy)
- return FALSE;
-
- pid = getpid ();
-
- start_time = get_start_time_for_pid (pid);
-
- if (G_LIKELY (start_time != 0))
- {
- GValue val = { 0 }, pid_val = { 0 }, start_time_val = { 0 };
-
- helper->polkit_subject = g_value_array_new (2);
- helper->polkit_subject_hash = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free, NULL);
- g_value_init (&val, G_TYPE_STRING);
- g_value_set_string (&val, "unix-process");
- g_value_array_append (helper->polkit_subject, &val);
-
- g_value_unset (&val);
-
- g_value_init (&pid_val, G_TYPE_UINT);
- g_value_set_uint (&pid_val, pid);
- g_hash_table_insert (helper->polkit_subject_hash, g_strdup ("pid"), &pid_val);
-
- g_value_init (&start_time_val, G_TYPE_UINT64);
- g_value_set_uint64 (&start_time_val, start_time);
- g_hash_table_insert (helper->polkit_subject_hash, g_strdup ("start-time"), &start_time_val);
- }
- else
- {
- g_warning ("Unable to create Polkit subject");
- return FALSE;
- }
-
-
- g_value_init (&hash_elem,
- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE));
-
- g_value_set_static_boxed (&hash_elem, helper->polkit_subject_hash);
- g_value_array_append (helper->polkit_subject, &hash_elem);
-
- /**
- * Polkit details, will leave it empty.
- **/
- helper->polkit_details = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- return TRUE;
-}
-#endif /*ENABLE_POLKIT*/
-
-/**
- * xfsm_shutdown_helper_check_sudo:
- *
- * Check if we can use sudo backend.
- * Method is called if HAL, upower, consolekit are missing
- * or the session was compiled without those services.
- *
- **/
-static gboolean
-xfsm_shutdown_helper_check_sudo (XfsmShutdownHelper *helper)
-{
- struct rlimit rlp;
- gchar buf[15];
- gint parent_pipe[2];
- gint child_pipe[2];
- gint result;
- gint n;
-
- helper->sudo = g_find_program_in_path ("sudo");
-
- if ( G_UNLIKELY (helper->sudo == NULL ) )
- {
- g_warning ("Program 'sudo' was not found.");
- return FALSE;
- }
-
- result = pipe (parent_pipe);
-
- if (result < 0)
- {
- g_warning ("Unable to create parent pipe: %s", strerror (errno));
- return FALSE;
- }
-
- result = pipe (child_pipe);
- if (result < 0)
- {
- g_warning ("Unable to create child pipe: %s", strerror (errno));
- goto error0;
- }
-
- helper->pid = fork ();
-
- if (helper->pid < 0)
- {
- g_warning ("Unable to fork sudo helper: %s", strerror (errno));
- goto error1;
- }
- else if (helper->pid == 0)
- {
- /* setup signals */
- signal (SIGPIPE, SIG_IGN);
-
- /* setup environment */
- xfce_setenv ("LC_ALL", "C", TRUE);
- xfce_setenv ("LANG", "C", TRUE);
- xfce_setenv ("LANGUAGE", "C", TRUE);
-
- /* setup the 3 standard file handles */
- dup2 (child_pipe[0], STDIN_FILENO);
- dup2 (parent_pipe[1], STDOUT_FILENO);
- dup2 (parent_pipe[1], STDERR_FILENO);
-
- /* Close all other file handles */
- getrlimit (RLIMIT_NOFILE, &rlp);
- for (n = 0; n < (gint) rlp.rlim_cur; ++n)
- {
- if (n != STDIN_FILENO && n != STDOUT_FILENO && n != STDERR_FILENO)
- close (n);
- }
-
- /* execute sudo with the helper */
- execl (helper->sudo, "sudo", "-H", "-S", "-p",
- "XFSM_SUDO_PASS ", "--", XFSM_SHUTDOWN_HELPER_CMD, NULL);
- _exit (127);
- }
-
- close (parent_pipe[1]);
-
- /* read sudo/helper answer */
- n = read (parent_pipe[0], buf, 15);
- if (n < 15)
- {
- g_warning ("Unable to read response from sudo helper: %s",
- n < 0 ? strerror (errno) : "Unknown error");
- goto error1;
- }
-
- helper->infile = fdopen (parent_pipe[0], "r");
-
- if (helper->infile == NULL)
- {
- g_warning ("Unable to open parent pipe: %s", strerror (errno));
- goto error1;
- }
-
- helper->outfile = fdopen (child_pipe[1], "w");
-
- if (helper->outfile == NULL)
- {
- g_warning ("Unable to open child pipe: %s", strerror (errno));
- goto error2;
- }
-
- if (memcmp (buf, "XFSM_SUDO_PASS ", 15) == 0)
- {
- helper->require_password = TRUE;
- }
- else if (memcmp (buf, "XFSM_SUDO_DONE ", 15) == 0)
- {
- helper->require_password = FALSE;
- }
- else
- {
- g_warning ("Got unexpected reply from sudo shutdown helper");
- goto error2;
- }
-
- close (parent_pipe[1]);
- close (child_pipe[0]);
-
- return TRUE;
-
-error2:
- if (helper->infile != NULL)
- {
- fclose (helper->infile);
- helper->infile = NULL;
- }
-
- if (helper->outfile != NULL)
- {
- fclose (helper->outfile);
- helper->outfile = NULL;
- }
-
-error1:
- close (child_pipe[0]);
- close (child_pipe[1]);
-
-error0:
- close (parent_pipe[0]);
- close (parent_pipe[1]);
-
- return FALSE;
-}
-
-#ifdef ENABLE_UPOWER
-/**
- * xfsm_shutdown_helper_get_power_props:
- *
- **/
-static GHashTable *
-xfsm_shutdown_helper_get_power_props (XfsmShutdownHelper *helper,
- const gchar *name,
- const gchar *path,
- const gchar *iface)
-{
- DBusGProxy *proxy_prop;
- GHashTable *props;
- GType g_type_hash_map;
- GError *error = NULL;
-
- proxy_prop = dbus_g_proxy_new_for_name (helper->system_bus,
- name,
- path,
- DBUS_INTERFACE_PROPERTIES);
-
- if (!proxy_prop)
- {
- g_warning ("Unable to create proxy for %s", name);
- return NULL;
- }
-
- /* The Hash table is a pair of (strings, GValues) */
- g_type_hash_map = dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE);
-
- dbus_g_proxy_call (proxy_prop, "GetAll", &error,
- G_TYPE_STRING, iface,
- G_TYPE_INVALID,
- g_type_hash_map, &props,
- G_TYPE_INVALID);
-
- g_object_unref (proxy_prop);
-
- if (error)
- {
- g_warning ("Method 'GetAll' failed : %s", error->message);
- g_error_free (error);
- return NULL;
- }
-
- return props;
-}
-
-
-/**
- * xfsm_shutdown_helper_check_devkit_upower:
- *
- * Check upower (formely devicekit-power)
- * for hibernate and suspend availability.
- *
- * Returns: FALSE if failed to contact upower, TRUE otherwise.
- **/
-static gboolean
-xfsm_shutdown_helper_check_devkit_upower (XfsmShutdownHelper *helper)
-{
- /**
- * Get the properties on 'org.freedesktop.UPower'
- * or 'org.freedesktop.DeviceKit.Power'
- *
- * DaemonVersion 's'
- * CanSuspend' 'b'
- * CanHibernate' 'b'
- * OnBattery' 'b'
- * OnLowBattery' 'b'
- * LidIsClosed' 'b'
- * LidIsPresent' 'b'
- **/
-
- GHashTable *props;
- GValue *value;
- const gchar *name, *path, *iface;
-
- /* Check for upower first */
- name = "org.freedesktop.UPower";
- path = "/org/freedesktop/UPower";
- iface = "org.freedesktop.UPower";
-
- helper->devkit_is_upower = TRUE;
-
- props = xfsm_shutdown_helper_get_power_props (helper,
- name,
- path,
- iface);
- if (!props)
- {
- g_message ("UPower not found, trying DevKitPower");
-
- name = "org.freedesktop.DeviceKit.Power";
- path = "/org/freedesktop/DeviceKit/Power";
- iface = "org.freedesktop.DeviceKit.Power";
-
- helper->devkit_is_upower = FALSE;
-
- props = xfsm_shutdown_helper_get_power_props (helper,
- name,
- path,
- iface);
- if (!props)
- {
- g_message ("Devkit Power is not running or not installed");
- return FALSE;
- }
- }
-
- /*Get The CanSuspend bit*/
- value = g_hash_table_lookup (props, "CanSuspend");
-
- if (G_LIKELY (value))
- {
- helper->can_suspend = g_value_get_boolean (value);
- }
- else
- {
- g_warning ("No 'CanSuspend' property");
- }
-
- /*Get the CanHibernate bit*/
- value = g_hash_table_lookup (props, "CanHibernate");
-
- if (G_LIKELY (value))
- {
- helper->can_hibernate = g_value_get_boolean (value);
- }
- else
- {
- g_warning ("No 'CanHibernate' property");
- }
-
- g_hash_table_destroy (props);
-
- return TRUE;
-}
-#endif /*ENABLE_UPOWER*/
-
-
-/**
- * xfsm_shutdown_helper_check_console_kit:
- *
- * Check Consolekit for methods:
- * Stop (Shutdown), Restart.
- **/
-#ifdef ENABLE_CONSOLE_KIT
-static gboolean
-xfsm_shutdown_helper_check_console_kit (XfsmShutdownHelper *helper)
-{
- DBusGProxy *proxy;
- GError *error = NULL;
- gboolean ret;
-
- proxy = dbus_g_proxy_new_for_name (helper->system_bus,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager");
-
- if (!proxy)
- {
- g_warning ("Failed to create proxy for 'org.freedesktop.ConsoleKit'");
- return FALSE;
- }
-
- ret = dbus_g_proxy_call (proxy, "CanStop", &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &helper->can_shutdown,
- G_TYPE_INVALID);
-
- if (error)
- {
- g_warning ("'CanStop' method failed : %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- dbus_g_proxy_call (proxy, "CanRestart", &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &helper->can_restart,
- G_TYPE_INVALID);
-
- if (error)
- {
- g_warning ("'CanRestart' method failed : %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- ret = TRUE;
-
- out:
-
- g_object_unref (proxy);
-
- return ret;
-}
-#endif /*ENABLE_CONSOLE_KIT*/
-
-
-/**
- * xfsm_shutdown_helper_check_hal:
- *
- * Check if HAL is running and for its PowerManagement bits
- *
- **/
-#ifdef ENABLE_HAL
-static gboolean
-xfsm_shutdown_helper_check_hal (XfsmShutdownHelper *helper)
-{
- DBusGProxy *proxy_power;
- DBusGProxy *proxy_device;
- GError *error = NULL;
- gboolean ret = FALSE;
-
- proxy_power =
- dbus_g_proxy_new_for_name (helper->system_bus,
- "org.freedesktop.Hal",
- "/org/freedesktop/Hal/devices/computer",
- "org.freedesktop.Hal.Device.SystemPowerManagement");
-
- if (!proxy_power)
- {
- g_warning ("Failed to create proxy for 'org.freedesktop.Hal' ");
- return FALSE;
- }
-
- dbus_g_proxy_call (proxy_power, "JustToCheckUserPermission", &error,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
- g_object_unref (proxy_power);
-
- if (G_LIKELY (error))
- {
- /* The message passed dbus permission check? */
- if ( !g_error_matches (error, DBUS_GERROR, DBUS_GERROR_UNKNOWN_METHOD) )
- {
- g_error_free (error);
- return FALSE;
- }
-
- g_error_free (error);
- error = NULL;
- }
- else
- {
- /*Something went wrong with HAL*/
- return FALSE;
- }
-
- /*
- * Message raised DBUS_GERROR_UNKNOWN_METHOD, so it reached HAL,
- * we can consider thatn HAL allows us to use its power management interface
- */
- helper->auth_shutdown = TRUE;
- helper->auth_restart = TRUE;
- helper->auth_suspend = TRUE;
- helper->auth_hibernate = TRUE;
- /* HAL doesn't have can_shutdown and can_reboot bits since it can always
- shutdown and reboot the system */
- helper->can_shutdown = TRUE;
- helper->can_restart = TRUE;
-
- /*Check to see is the system can_hibernate and can_suspend*/
- proxy_device = dbus_g_proxy_new_for_name (helper->system_bus,
- "org.freedesktop.Hal",
- "/org/freedesktop/Hal/devices/computer",
- "org.freedesktop.Hal.Device");
-
- if (!proxy_device)
- return FALSE;
-
- dbus_g_proxy_call (proxy_device, "GetPropertyBoolean", &error,
- G_TYPE_STRING, "power_management.can_hibernate",
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &helper->can_hibernate,
- G_TYPE_INVALID);
-
- if (error)
- {
- g_warning ("Method 'GetPropertyBoolean' failed : %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- dbus_g_proxy_call (proxy_device, "GetPropertyBoolean", &error,
- G_TYPE_STRING, "power_management.can_suspend",
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &helper->can_suspend,
- G_TYPE_INVALID);
-
- if (error)
- {
- g_warning ("Method 'GetPropertyBoolean' failed : %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- ret = TRUE;
-
- out:
-
- g_object_unref (proxy_device);
-
- return ret;
-}
-#endif /*ENABLE_HAL*/
-
-/**
- * xfsm_shutdown_helper_check_polkit_authorization:
- *
- **/
-#ifdef ENABLE_POLKIT
-static gboolean
-xfsm_shutdown_helper_check_authorization (XfsmShutdownHelper *helper,
- const gchar *action_id)
-{
- GValueArray *result;
- GValue result_val = { 0 };
- GError *error = NULL;
- gboolean is_authorized = FALSE;
- gboolean ret;
-
- /**
- * <method name="CheckAuthorization">
- * <arg type="(sa{sv})" name="subject" direction="in"/>
- * <arg type="s" name="action_id" direction="in"/>
- * <arg type="a{ss}" name="details" direction="in"/>
- * <arg type="u" name="flags" direction="in"/>
- * <arg type="s" name="cancellation_id" direction="in"/>
- * <arg type="(bba{ss})" name="result" direction="out"/>
- * </method>
- *
- **/
-
- g_return_val_if_fail (helper->polkit_proxy != NULL, FALSE);
- g_return_val_if_fail (helper->polkit_subject, FALSE);
- g_return_val_if_fail (helper->polkit_details, FALSE);
-
- /* Initialized DBus GTypes */
- init_dbus_gtypes ();
-
- result = g_value_array_new (0);
-
- ret = dbus_g_proxy_call (helper->polkit_proxy, "CheckAuthorization", &error,
- polkit_subject_gtype, helper->polkit_subject,
- G_TYPE_STRING, action_id,
- polkit_details_gtype, helper->polkit_details,
- G_TYPE_UINT, 0,
- G_TYPE_STRING, NULL,
- G_TYPE_INVALID,
- polkit_result_gtype, &result,
- G_TYPE_INVALID);
-
- if (G_LIKELY (ret))
- {
- g_value_init (&result_val, polkit_result_gtype);
- g_value_set_static_boxed (&result_val, result);
-
- dbus_g_type_struct_get (&result_val,
- 0, &is_authorized,
- G_MAXUINT);
- g_value_unset (&result_val);
- }
- else if (error)
- {
- g_warning ("'CheckAuthorization' failed : %s", error->message);
- g_error_free (error);
- }
-
- g_value_array_free (result);
- return is_authorized;
-}
-#endif /*ENABLE_POLKIT*/
-
-/**
- *xfsm_shutdown_helper_check_backends:
- *
- * Try to check what is the best available backend to use
- * Supported: ConsoleKit, HAL, upower and sudo.
- *
- **/
-static void
-xfsm_shutdown_helper_check_backends (XfsmShutdownHelper *helper)
-{
-#ifdef ENABLE_POLKIT
- /*if polkit data was successfully initialized*/
- gboolean polkit_ok = FALSE;
-#endif
-
-#ifdef ENABLE_UPOWER
- /*Check upower (formely devicekit-power)*/
- if ( xfsm_shutdown_helper_check_devkit_upower (helper) )
- helper->sleep_backend = XFSM_SLEEP_BACKEND_UPOWER;
-#endif /* ENABLE_UPOWER */
-
-#ifdef ENABLE_CONSOLE_KIT
- if ( xfsm_shutdown_helper_check_console_kit (helper) )
- {
- helper->shutdown_backend = XFSM_SHUTDOWN_BACKEND_CONSOLE_KIT;
- /*ConsoleKit doesn't use Polkit*/
- helper->auth_shutdown = helper->can_shutdown;
- helper->auth_restart = helper->can_restart;
- }
-#endif
-
- if ( helper->sleep_backend == XFSM_SLEEP_BACKEND_UPOWER )
- {
-#ifdef ENABLE_POLKIT
-
- polkit_ok = xfsm_shutdown_helper_init_polkit_data (helper);
-
- if (polkit_ok)
- {
- const gchar *action_hibernate, *action_suspend;
-
- if (helper->devkit_is_upower)
- {
- action_hibernate = "org.freedesktop.upower.hibernate";
- action_suspend = "org.freedesktop.upower.suspend";
- }
- else
- {
- action_hibernate = "org.freedesktop.devicekit.power.hibernate";
- action_suspend = "org.freedesktop.devicekit.power.suspend";
- }
-
- helper->auth_hibernate =
- xfsm_shutdown_helper_check_authorization (helper, action_hibernate);
-
- helper->auth_suspend =
- xfsm_shutdown_helper_check_authorization (helper, action_suspend);
- }
- else
- {
- helper->auth_hibernate = TRUE;
- helper->auth_suspend = TRUE;
- }
-#else
- helper->auth_hibernate = TRUE;
- helper->auth_suspend = TRUE;
-#endif /* ENABLE_POLKIT */
- }
-
- /*
- * Use HAL just as a fallback.
- */
-#ifdef ENABLE_HAL
- if (helper->sleep_backend == XFSM_SLEEP_BACKEND_NOT_SUPPORTED ||
- helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_NOT_SUPPORTED)
- {
- if (xfsm_shutdown_helper_check_hal (helper))
- {
- if (helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_NOT_SUPPORTED)
- helper->shutdown_backend = XFSM_SHUTDOWN_BACKEND_HAL;
-
- if (helper->sleep_backend == XFSM_SLEEP_BACKEND_NOT_SUPPORTED)
- helper->sleep_backend = XFSM_SLEEP_BACKEND_HAL;
- }
- }
-#endif
-
- /* Fallback for sudo */
- if (helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_NOT_SUPPORTED)
- {
- if (xfsm_shutdown_helper_check_sudo (helper) )
- {
- helper->shutdown_backend = XFSM_SHUTDOWN_BACKEND_SUDO;
- helper->can_shutdown = TRUE;
- helper->can_restart = TRUE;
- helper->auth_shutdown = TRUE;
- helper->auth_restart = TRUE;
- }
- }
-
-#ifdef DEBUG
- {
- const gchar *shutdown_str[] = {"Shutdown not supported",
- "Using ConsoleKit for shutdown",
- "Using HAL for shutdown",
- "Using Sudo for shutdown",
- NULL};
-
- const gchar *sleep_str[] = {"Sleep not supported",
- "Using UPower for sleep",
- "Using HAL for sleep",
- "Using Sudo for sleep",
- NULL};
-
- g_debug ("%s", shutdown_str[helper->shutdown_backend]);
- g_debug ("%s", sleep_str[helper->sleep_backend]);
-
- g_debug ("can_shutdown=%d can_restart=%d can_hibernate=%d can_suspend=%d",
- helper->can_shutdown, helper->can_restart,
- helper->can_hibernate, helper->can_suspend);
-
- g_debug ("auth_shutdown=%d auth_restart=%d auth_hibernate=%d auth_suspend=%d",
- helper->auth_shutdown, helper->auth_restart,
- helper->auth_hibernate, helper->auth_suspend);
- }
-#endif
-
-#ifdef ENABLE_POLKIT
-
- if (polkit_ok)
- {
- g_hash_table_destroy (helper->polkit_details);
- g_hash_table_destroy (helper->polkit_subject_hash);
- g_value_array_free (helper->polkit_subject);
- }
-
-#endif
-
-}
-
-static void
-xfsm_shutdown_helper_class_init (XfsmShutdownHelperClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = xfsm_shutdown_helper_finalize;
-
- object_class->get_property = xfsm_shutdown_helper_get_property;
- object_class->set_property = xfsm_shutdown_helper_set_property;
-
- /**
- * XfsmShutdownHelper::authorized-to-shutdown
- *
- * Whether the user is allowed to preform shutdown.
- **/
- g_object_class_install_property (object_class,
- PROP_AUTHORIZED_TO_SHUTDOWN,
- g_param_spec_boolean ("authorized-to-shutdown",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::authorized-to-reboot
- *
- * Whether the user is allowed to preform reboot.
- **/
- g_object_class_install_property (object_class,
- PROP_AUTHORIZED_TO_RESTART,
- g_param_spec_boolean ("authorized-to-restart",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::authorized-to-suspend
- *
- * Whether the user is allowed to preform suspend.
- **/
- g_object_class_install_property (object_class,
- PROP_AUTHORIZED_TO_SUSPEND,
- g_param_spec_boolean ("authorized-to-suspend",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::authorized-to-hibernate
- *
- * Whether the user is allowed to preform hibernate.
- **/
- g_object_class_install_property (object_class,
- PROP_AUTHORIZED_TO_HIBERNATE,
- g_param_spec_boolean ("authorized-to-hibernate",
- NULL, NULL, FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::can-shutdown
- *
- * Whether the system can do shutdown.
- **/
- g_object_class_install_property (object_class,
- PROP_CAN_SHUTDOWN,
- g_param_spec_boolean ("can-shutdown",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::can-restart
- *
- * Whether the system can do restart.
- **/
- g_object_class_install_property (object_class,
- PROP_CAN_RESTART,
- g_param_spec_boolean ("can-restart",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::can-suspend
- *
- * Whether the system can do suspend.
- **/
- g_object_class_install_property (object_class,
- PROP_CAN_SUSPEND,
- g_param_spec_boolean ("can-suspend",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
- /**
- * XfsmShutdownHelper::can-hibernate
- *
- * Whether the system can do hibernate.
- **/
- g_object_class_install_property (object_class,
- PROP_CAN_HIBERNATE,
- g_param_spec_boolean ("can-hibernate",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::user-can-shutdown
- *
- * Whether the user is allowed and the system can shutdown.
- **/
- g_object_class_install_property (object_class,
- PROP_USER_CAN_SHUTDOWN,
- g_param_spec_boolean ("user-can-shutdown",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::user-can-restart
- *
- * Whether the user is allowed and the system can restart.
- **/
- g_object_class_install_property (object_class,
- PROP_USER_CAN_RESTART,
- g_param_spec_boolean ("user-can-restart",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::user-can-suspend
- *
- * Whether the user is allowed and the system can suspend.
- **/
- g_object_class_install_property (object_class,
- PROP_USER_CAN_SUSPEND,
- g_param_spec_boolean ("user-can-suspend",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
- /**
- * XfsmShutdownHelper::user-can-hibernate
- *
- * Whether the user is allowed and the system can hibernate.
- **/
- g_object_class_install_property (object_class,
- PROP_USER_CAN_HIBERNATE,
- g_param_spec_boolean ("user-can-hibernate",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
- /**
- * XfsmShutdownHelper::require-password
- *
- * Whether the shutdown operation requires a password to
- * pass to sudo.
- **/
- g_object_class_install_property (object_class,
- PROP_REQUIRE_PASSWORD,
- g_param_spec_boolean ("require-password",
- NULL, NULL,
- FALSE,
- G_PARAM_READABLE));
-
-}
-
-static void
-xfsm_shutdown_helper_init (XfsmShutdownHelper *helper)
-{
- GError *error = NULL;
-
-#ifdef ENABLE_POLKIT
- helper->polkit_proxy = NULL;
- helper->polkit_subject = NULL;
- helper->polkit_details = NULL;
- helper->polkit_subject_hash = NULL;
-#endif
-
- helper->sudo = NULL;
- helper->infile = NULL;
- helper->outfile = NULL;
- helper->pid = 0;
- helper->require_password = FALSE;
-
- helper->sleep_backend = XFSM_SLEEP_BACKEND_NOT_SUPPORTED;
- helper->shutdown_backend = XFSM_SHUTDOWN_BACKEND_NOT_SUPPORTED;
-
- helper->auth_shutdown = FALSE;
- helper->auth_restart = FALSE;
- helper->auth_suspend = FALSE;
- helper->auth_hibernate = FALSE;
- helper->can_shutdown = FALSE;
- helper->can_restart = FALSE;
- helper->can_suspend = FALSE;
- helper->can_hibernate = FALSE;
-
- helper->system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
-
- if (G_LIKELY (helper->system_bus))
- {
- xfsm_shutdown_helper_check_backends (helper);
- }
- else
- {
- g_warning ("Failed to connect to the system bus : %s", error->message);
- g_error_free (error);
-
- /* Unable to connect to the system bus, just try sudo */
- if (xfsm_shutdown_helper_check_sudo (helper))
- {
- helper->shutdown_backend = XFSM_SHUTDOWN_BACKEND_SUDO;
-
- helper->can_shutdown = TRUE;
- helper->can_restart = TRUE;
- helper->auth_shutdown = TRUE;
- helper->auth_restart = TRUE;
- }
- }
-}
-
-static void xfsm_shutdown_helper_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-}
-
-static void xfsm_shutdown_helper_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- XfsmShutdownHelper *helper;
-
- helper = XFSM_SHUTDOWN_HELPER (object);
-
- switch (prop_id)
- {
- case PROP_AUTHORIZED_TO_SHUTDOWN:
- g_value_set_boolean (value, helper->auth_shutdown);
- break;
- case PROP_AUTHORIZED_TO_RESTART:
- g_value_set_boolean (value, helper->auth_restart);
- break;
- case PROP_AUTHORIZED_TO_SUSPEND:
- g_value_set_boolean (value, helper->auth_suspend);
- break;
- case PROP_AUTHORIZED_TO_HIBERNATE:
- g_value_set_boolean (value, helper->auth_hibernate);
- break;
- case PROP_CAN_SUSPEND:
- g_value_set_boolean (value, helper->can_suspend);
- break;
- case PROP_CAN_HIBERNATE:
- g_value_set_boolean (value, helper->can_hibernate);
- break;
- case PROP_CAN_RESTART:
- g_value_set_boolean (value, helper->can_restart);
- break;
- case PROP_CAN_SHUTDOWN:
- g_value_set_boolean (value, helper->can_shutdown);
- break;
- case PROP_USER_CAN_SUSPEND:
- g_value_set_boolean (value, helper->can_suspend && helper->auth_suspend);
- break;
- case PROP_USER_CAN_HIBERNATE:
- g_value_set_boolean (value, helper->can_hibernate && helper->auth_hibernate);
- break;
- case PROP_USER_CAN_RESTART:
- g_value_set_boolean (value, helper->can_restart && helper->auth_restart);
- break;
- case PROP_USER_CAN_SHUTDOWN:
- g_value_set_boolean (value, helper->can_shutdown && helper->auth_shutdown);
- break;
- case PROP_REQUIRE_PASSWORD:
- g_value_set_boolean (value, helper->require_password);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-xfsm_shutdown_helper_finalize (GObject *object)
-{
- XfsmShutdownHelper *helper;
- gint status;
-
- helper = XFSM_SHUTDOWN_HELPER (object);
-
-#ifdef ENABLE_POLKIT
- if (helper->polkit_proxy)
- g_object_unref (helper->polkit_proxy);
-#endif
-
- if (helper->system_bus)
- dbus_g_connection_unref (helper->system_bus);
-
- if (helper->infile != NULL)
- fclose (helper->infile);
-
- if (helper->outfile != NULL)
- fclose (helper->outfile);
-
- if (helper->pid > 0)
- waitpid (helper->pid, &status, 0);
-
- g_free (helper->sudo);
-
- G_OBJECT_CLASS (xfsm_shutdown_helper_parent_class)->finalize (object);
-}
-
-/**
- * xfsm_shutdown_helper_upower_sleep:
- * @helper: a #XfsmShutdownHelper,
- * @action: 'Hibernate' or 'Suspend'
- * @error: a #GError
- *
- **/
-#ifdef ENABLE_UPOWER
-static gboolean
-xfsm_shutdown_helper_upower_sleep (XfsmShutdownHelper *helper,
- const gchar *action,
- GError **error)
-{
- DBusGProxy *proxy;
- GError *error_local = NULL;
- const gchar *name, *path, *iface;
- gboolean ret;
-
- if (helper->devkit_is_upower)
- {
- name = "org.freedesktop.UPower";
- path = "/org/freedesktop/UPower";
- iface = "org.freedesktop.UPower";
- }
- else
- {
- name = "org.freedesktop.DeviceKit.Power";
- path = "/org/freedesktop/DeviceKit/Power";
- iface = "org.freedesktop.DeviceKit.Power";
- }
-
- g_message (G_STRLOC ": Using %s to %s", name, action);
-
- proxy = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- name,
- path,
- iface,
- &error_local);
-
- if (!proxy)
- {
- g_warning ("Failed to create proxy for %s : %s", name, error_local->message);
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
-
- ret = dbus_g_proxy_call (proxy, action, &error_local,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
- g_object_unref (proxy);
-
- if (!ret)
- {
- /* DBus timeout?*/
- if (g_error_matches (error_local, DBUS_GERROR, DBUS_GERROR_NO_REPLY))
- {
- g_error_free (error_local);
- return TRUE;
- }
- else
- {
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-#endif /*ENABLE_UPOWER*/
-
-/**
- * xfsm_shutdown_helper_console_kit_shutdown:
- * @helper: a #XfsmShutdownHelper,
- * @action: 'Stop' for shutdown and 'Restart' for reboot.
- * @error: a #GError
- *
- **/
-#ifdef ENABLE_CONSOLE_KIT
-static gboolean
-xfsm_shutdown_helper_console_kit_shutdown (XfsmShutdownHelper *helper,
- const gchar *action,
- GError **error)
-{
- DBusGProxy *proxy;
- GError *error_local = NULL;
- gboolean ret;
-
- g_message (G_STRLOC ": Using ConsoleKit to %s", action);
-
- proxy = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
- &error_local);
-
- if (!proxy)
- {
- g_warning ("Failed to create proxy for 'org.freedesktop.ConsoleKit' : %s", error_local->message);
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
-
- ret = dbus_g_proxy_call (proxy, action, &error_local,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
- g_object_unref (proxy);
-
- if (!ret)
- {
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
-
- return TRUE;
-}
-#endif /*ENABLE_CONSOLE_KIT*/
-
-/**
- * xfsm_shutdown_helper_hal_send:
- * @helper: a #XfsmShutdownHelper,
- * @action: 'Reboot' 'Shutdown' 'Hibernate' 'Suspend'
- * @error: a #GError
- *
- **/
-#ifdef ENABLE_HAL
-static gboolean
-xfsm_shutdown_helper_hal_send (XfsmShutdownHelper *helper,
- const gchar *action,
- GError **error)
-{
- DBusGProxy *proxy;
- GError *error_local = NULL;
- gboolean ret;
- gint return_code;
-
- g_message (G_STRLOC ": Using ConsoleKit to %s", action);
-
- proxy = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.Hal",
- "/org/freedesktop/Hal/devices/computer",
- "org.freedesktop.Hal.Device.SystemPowerManagement",
- &error_local);
- if (!proxy)
- {
- g_warning ("Failed to create proxy for 'org.freedesktop.Hal' : %s", error_local->message);
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
-
- if (!g_strcmp0 (action, "Suspend"))
- {
- gint seconds = 0;
- ret = dbus_g_proxy_call (proxy, action, &error_local,
- G_TYPE_INT, seconds,
- G_TYPE_INVALID,
- G_TYPE_INT, &return_code,
- G_TYPE_INVALID);
- }
- else
- {
- ret = dbus_g_proxy_call (proxy, action, &error_local,
- G_TYPE_INVALID,
- G_TYPE_INT, &return_code,
- G_TYPE_INVALID);
- }
-
- g_object_unref (proxy);
-
- if (!ret)
- {
- /* A D-Bus timeout? */
- if (g_error_matches (error_local, DBUS_GERROR, DBUS_GERROR_NO_REPLY))
- {
- g_error_free (error_local);
- return TRUE;
- }
- else
- {
- g_set_error (error, 1, 0, "%s", error_local->message);
- g_error_free (error_local);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-#endif /*ENABLE_HAL*/
-
-/**
- * xfsm_shutdown_helper_sudo_send:
- *
- *
- **/
-static gboolean
-xfsm_shutdown_helper_sudo_send (XfsmShutdownHelper *helper,
- const gchar *action,
- GError **error)
-{
- gchar response[256];
-
- fprintf (helper->outfile, "%s\n", action);
- fflush (helper->outfile);
-
- g_message (G_STRLOC ": Using sudo to %s", action);
-
- if (ferror (helper->outfile))
- {
- if (errno == EINTR)
- {
- /* probably succeeded but the helper got killed */
- return TRUE;
- }
-
- g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Error sending command to shutdown helper: %s"),
- strerror (errno));
- return FALSE;
- }
-
- if (fgets (response, 256, helper->infile) == NULL)
- {
- if (errno == EINTR)
- {
- /* probably succeeded but the helper got killed */
- return TRUE;
- }
-
- g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Error receiving response from shutdown helper: %s"),
- strerror (errno));
-
- return FALSE;
- }
-
- if (strncmp (response, "SUCCEED", 7) != 0)
- {
- g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
- _("Shutdown command failed"));
-
- return FALSE;
- }
- return TRUE;
-}
-
-/**
- * xfsm_shutdown_helper_new:
- *
- **/
-XfsmShutdownHelper *
-xfsm_shutdown_helper_new (void)
-{
- XfsmShutdownHelper *xfsm_shutdown_helper = NULL;
-
- xfsm_shutdown_helper = g_object_new (XFSM_TYPE_SHUTDOWN_HELPER, NULL);
-
- return xfsm_shutdown_helper;
-}
-
-/**
- * xfsm_shutdown_helper_send_password:
- *
- * Send password to sudo
- *
- **/
-gboolean xfsm_shutdown_helper_send_password (XfsmShutdownHelper *helper, const gchar *password)
-{
- gssize result;
- gchar buffer[1024];
- gsize failed;
- gsize length;
- gsize bytes;
- gint fd;
-
- g_return_val_if_fail (password != NULL, FALSE);
- g_return_val_if_fail (helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_SUDO, FALSE);
- g_return_val_if_fail (helper->require_password, FALSE);
-
- g_snprintf (buffer, 1024, "%s\n", password);
- length = strlen (buffer);
- bytes = fwrite (buffer, 1, length, helper->outfile);
- fflush (helper->outfile);
- bzero (buffer, length);
-
- if (bytes != length)
- {
- fprintf (stderr, "Failed to write password (bytes=%lu, length=%lu)\n", (long)bytes, (long)length);
- return FALSE;
- }
-
- if (ferror (helper->outfile))
- {
- fprintf (stderr, "Pipe error\n");
- return FALSE;
- }
-
- fd = fileno (helper->infile);
-
- for (failed = length = 0;;)
- {
- result = read (fd, buffer + length, 256 - length);
-
- if (result < 0)
- {
- perror ("read");
- return FALSE;
- }
- else if (result == 0)
- {
- if (++failed > 20)
- return FALSE;
- continue;
- }
- else if (result + length >= 1024)
- {
- fprintf (stderr, "Too much output from sudo!\n");
- return FALSE;
- }
-
- length += result;
- buffer[length] = 0;
-
- if (length >= 15)
- {
- if (strncmp (buffer + (length - 15), "XFSM_SUDO_PASS ", 15) == 0)
- {
- return FALSE;
- }
- else if (strncmp (buffer + (length - 15), "XFSM_SUDO_DONE ", 15) == 0)
- {
- helper->require_password = FALSE;
- break;
- }
- }
- }
-
- return TRUE;
-}
-
-/**
- * xfsm_shutdown_helper_shutdown:
- *
- *
- **/
-gboolean xfsm_shutdown_helper_shutdown (XfsmShutdownHelper *helper, GError **error)
-{
- g_return_val_if_fail (!error || !*error, FALSE);
-
-#ifdef ENABLE_CONSOLE_KIT
- if ( helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_CONSOLE_KIT )
- {
- return xfsm_shutdown_helper_console_kit_shutdown (helper, "Stop", error);
- }
-#endif
-
-#ifdef ENABLE_HAL
- if ( helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_HAL )
- {
- return xfsm_shutdown_helper_hal_send (helper, "Shutdown", error);
- }
-#endif
-
- /*Use Sudo mode*/
- return xfsm_shutdown_helper_sudo_send (helper, "POWEROFF", error);
-
-}
-
-/**
- * xfsm_shutdown_helper_restart:
- *
- *
- **/
-gboolean xfsm_shutdown_helper_restart (XfsmShutdownHelper *helper, GError **error)
-{
- g_return_val_if_fail (!error || !*error, FALSE);
-
-#ifdef ENABLE_CONSOLE_KIT
- if ( helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_CONSOLE_KIT )
- {
- return xfsm_shutdown_helper_console_kit_shutdown (helper, "Restart", error);
- }
-#endif
-
-#ifdef ENABLE_HAL
- if ( helper->shutdown_backend == XFSM_SHUTDOWN_BACKEND_HAL )
- {
- return xfsm_shutdown_helper_hal_send (helper, "Reboot", error);
- }
-#endif
-
- return xfsm_shutdown_helper_sudo_send (helper, "REBOOT", error);
-
-}
-
-/**
- * xfsm_shutdown_helper_suspend:
- *
- **/
-gboolean xfsm_shutdown_helper_suspend (XfsmShutdownHelper *helper, GError **error)
-{
- g_return_val_if_fail (!error || !*error, FALSE);
-
-#ifdef ENABLE_UPOWER
- if ( helper->sleep_backend == XFSM_SLEEP_BACKEND_UPOWER )
- {
- return xfsm_shutdown_helper_upower_sleep (helper, "Suspend", error);
- }
-#endif
-
-#ifdef ENABLE_HAL
- if ( helper->sleep_backend == XFSM_SLEEP_BACKEND_HAL )
- {
- return xfsm_shutdown_helper_hal_send (helper, "Suspend", error);
- }
-#endif
-
- g_set_error (error, 1, 0, "%s", _("Suspend failed, no backend supported"));
-
- return FALSE;
-}
-
-/**
- * xfsm_shutdown_helper_hibernate:
- *
- **/
-gboolean xfsm_shutdown_helper_hibernate (XfsmShutdownHelper *helper, GError **error)
-{
- g_return_val_if_fail (!error || !*error, FALSE);
-
-#ifdef ENABLE_UPOWER
- if ( helper->sleep_backend == XFSM_SLEEP_BACKEND_UPOWER )
- {
- return xfsm_shutdown_helper_upower_sleep (helper, "Hibernate", error);
- }
-#endif
-
-#ifdef ENABLE_HAL
- if ( helper->sleep_backend == XFSM_SLEEP_BACKEND_HAL )
- {
- return xfsm_shutdown_helper_hal_send (helper, "Hibernate", error);
- }
-#endif
-
- g_set_error (error, 1, 0, "%s", _("Hibernate failed, no backend supported"));
-
- return FALSE;
-}
-
-/**
- * xfsm_shutdown_helper_send_command:
- *
- **/
-gboolean xfsm_shutdown_helper_send_command (XfsmShutdownHelper *helper,
- XfsmShutdownType shutdown_type,
- GError **error)
-{
- g_return_val_if_fail (!error || !*error, FALSE);
-
- switch (shutdown_type)
- {
- case XFSM_SHUTDOWN_HALT:
- return xfsm_shutdown_helper_shutdown (helper, error);
- case XFSM_SHUTDOWN_REBOOT:
- return xfsm_shutdown_helper_restart (helper, error);
- case XFSM_SHUTDOWN_HIBERNATE:
- return xfsm_shutdown_helper_hibernate (helper, error);
- case XFSM_SHUTDOWN_SUSPEND:
- return xfsm_shutdown_helper_suspend (helper, error);
- default:
- g_warn_if_reached ();
- break;
- }
-
- g_set_error (error, 1, 0, "%s", _("Shutdown Command not found"));
-
- return FALSE;
-}