Hi again Christian,

Could you confirm that if you replace
/usr/share/acpi-support/suspendorhibernate by the attached file, that it
works?

Cheers,
Bart

Bart Samwel wrote:
> Hi Christian,
> 
> Christian Gogolin wrote:
>> the output of
>>
>> $ /usr/bin/dbus-send --session --dest=org.freedesktop.PowerManagement
>> --type=method_call --print-reply --reply-timeout=2000
>> /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Suspend
>>
>> when run as root is:
>>
>> Failed to open connection to session message bus: Did not receive a
>> reply. Possible causes include: the remote application did not send a
>> reply, the message bus security policy blocked the reply, the reply
>> timeout expired, or the network connection was broken.
>>
>> So I think I have a "similar but slightly different problem".
>>
>> I don't know if that matters, but I am using xmonad as window manager,
>> just like Nikolay A. Panov who reported #496911. My xorg version is
>> 1:7.3+15.
> 
> I guess the general problem is that I filter out the wrong kind of the
> error messages. I was hoping to be able to distinguish between local and
> remote errors other than "I don't know how to suspend", and I was doing
> that by trying to filter for DBus related errors. Here's what I know:
> 
> - All errors return an error code.
> - DBus connection errors do not start with "Error org.freedesktop".
> - DBus interface mismatch errors do start with "Error org.freedesktop",
> and return defined errors.
> - When I forcibly uninstall pm-utils I get:
> 
> Error org.freedesktop.DBus.GLib.UnmappedError.GpmControlError.Code0:
> General failure: No suspend method found
> 
> - When I replace /usr/sbin/pm-suspend by a script that does "exit 1", I
> get *no error message*, just like when it does "exit 0", and I get a
> return code of 0.
> 
> In effect, I think I should just take the return code of dbus-send
> instead of trying to filter error messages. If the message was received
> by pm-utils on the other end, even if it failed, I should look no
> further, and consider it a "succeeded suspend attempt". I'll put this in.
> 
> Cheers,
> Bart
> 
> 
> 
> 

#!/bin/sh
#
# How we handle suspend/hibernate is a bit complicated:
#
# If gnome-power-manager or klaptopdaemon are running, we send a fake key
# and that's it. The daemons may have policies that turn off suspend in
# response to suspend keys etc., so we don't want to do anything ourselves.
#
# If not, we follow the SUSPEND_METHODS setting.
#
#
# This script takes parameter "suspend" or "hibernate".
#
. /etc/default/acpi-support
. /usr/share/acpi-support/power-funcs
. /usr/share/acpi-support/device-funcs
. /usr/share/acpi-support/policy-funcs
. /usr/share/acpi-support/key-constants

DeviceConfig;

# The difference between suspend and hibernate
if [ "$1" = "suspend" ] ; then
        KEY=$KEY_SLEEP
        HIBERNATE_CMD=/usr/sbin/hibernate-ram
        PM_UTILS_CMD=/usr/sbin/pm-suspend
        DBUS_METHOD=Suspend
        DBUS_PARAMS="int32:0"
elif [ "$1" = "hibernate" ] ; then
        KEY=$KEY_SUSPEND
        HIBERNATE_CMD=/usr/sbin/hibernate-disk
        PM_UTILS_CMD=/usr/sbin/pm-hibernate
        DBUS_METHOD=Hibernate
        DBUS_PARAMS=
else
        echo "'Usage: '$0' (suspend|hibernate)'"
fi


#
# Backward compatibility
#

# Backward compatibility for setting USE_HIBERNATE_PACKAGE
if [ "$SUSPEND_METHODS" = "" ] &&
   [ "$USE_HIBERNATE_PACKAGE" = "true" ] &&
   [ -x "$HIBERNATE_CMD" ] ; then
        SUSPEND_METHODS="hibernate"
fi

# Backward compatibility for setups before SUSPEND_METHODS existed.
if [ "$SUSPEND_METHODS" = "" ] ; then
        # Legacy configuration -- use the built-in legacy suspend support. We
        # can NEVER change this explicitly, because it will break people's
        # working suspend setups, especially ones that depend on custom scripts
        # in /etc/acpi/suspend.d and /etc/acpi/resume.d.
        SUSPEND_METHODS="acpi-support"
fi


#
# Try the SUSPEND_METHODS in order.
#

for METHOD in $SUSPEND_METHODS; do
        case $METHOD in
        none)
                exit
                ;;
                
        dbus-pm)
                if [ -x /usr/bin/dbus-send ] ; then
                        # Call the power management daemon (which, if it is
                        # running, we probably don't know about, since we send
                        # keys if we detect one running that we know of).
                        if /usr/bin/dbus-send --session \
                          --dest=org.freedesktop.PowerManagement \
                          --type=method_call \
                          --print-reply \
                          --reply-timeout=2000 \
                          /org/freedesktop/PowerManagement \
                          org.freedesktop.PowerManagement.$DBUS_METHOD ;
                          then                    
                                # The other side exists, we have access to it,
                                # and it received the message. It may have
                                # failed (I tested this: if pm-suspend returns
                                # exit code 1, then the return code of dbus-send
                                # is still 0 and you get no errors), but that
                                # doesn't matter: the first method in the list
                                # that we can access is the one that has to do
                                # it.
                                exit
                        fi
                        # We got a DBUS error, which means that the other side
                        # does not exist or we don't have access to it. We
                        # continue by trying the next option.
                fi
                ;;
                
        dbus-hal)
                if [ -x /usr/bin/dbus-send ] ; then
                        # Call HAL directly.
                        if /usr/bin/dbus-send --system \
                          --dest=org.freedesktop.Hal \
                          --type=method_call \
                          --print-reply \
                          --reply-timeout=2000 \
                          /org/freedesktop/Hal/devices/computer \
                          
org.freedesktop.Hal.Device.SystemPowerManagement.$DBUS_METHOD $DBUS_PARAMS ;
                          then                    
                                # The other side exists, we have access to it,
                                # and it received the message. It may have
                                # failed (I tested this: if pm-suspend returns
                                # exit code 1, then the return code of dbus-send
                                # is still 0 and you get no errors), but that
                                # doesn't matter: the first method in the list
                                # that we can access is the one that has to do
                                # it.
                                exit
                        fi
                        # We got a DBUS error, which means that the other side
                        # does not exist or we don't have access to it. We
                        # continue by trying the next option.
                fi
                ;;
                
        pm-utils)
                if [ -x $PM_UTILS_CMD ] ; then
                        $PM_UTILS_CMD
                        exit
                fi
                ;;
                
        hibernate)
                if [ -x $HIBERNATE_CMD ] ; then
                        $HIBERNATE_CMD
                        exit            
                fi
                ;;
                
        acpi-support)
                if [ "$1" = "hibernate" ] ; then
                        if [ x$ACPI_HIBERNATE != xtrue ]; then
                          exit;
                        fi
                                        
                        # Unset video posting - it's not needed for suspend to 
disk
                        unset POST_VIDEO
                        unset USE_DPMS

                        . /etc/acpi/prepare.sh

                        echo -n $HIBERNATE_MODE >/sys/power/disk

                        if [ -x /usr/sbin/s2disk ]; then
                            /usr/sbin/s2disk
                        else
                            echo -n "disk" >/sys/power/state
                        fi

                        . /etc/acpi/resume.sh
                else    # $1 = suspend                  
                        if [ x$ACPI_SLEEP != xtrue ]; then
                          exit;
                        fi

                        if [ x$LOCK_SCREEN = xtrue ]; then
                            if pidof xscreensaver > /dev/null; then 
                                for x in /tmp/.X11-unix/*; do
                                    displaynum=`echo $x | sed 
s#/tmp/.X11-unix/X##`
                                    getXuser;
                                    if [ x"$XAUTHORITY" != x"" ]; then      
                                        export DISPLAY=":$displaynum"
                                        . /usr/share/acpi-support/screenblank
                                    fi
                                done
                            fi
                        fi



                        # Generic preparation code
                        . /etc/acpi/prepare.sh

                        if [ x$DISABLE_DMA = xtrue ] && [ -b /dev/hda ]; then
                          hdparm -d 0 /dev/hda
                        fi

                        echo -n $ACPI_SLEEP_MODE >/sys/power/state

                        if [ x$RESET_DRIVE = xtrue ] && [ -b /dev/hda ]; then
                            hdparm -w /dev/hda
                            hdparm -C /dev/hda
                            hdparm -C /dev/hda
                            hdparm -C /dev/hda
                            hdparm -d 1 /dev/hda
                        fi

                        if [ x$DISABLE_DMA = xtrue ] && [ -b /dev/hda ]; then
                          hdparm -d 1 /dev/hda
                        fi

                        # Generic wakeup code
                        . /etc/acpi/resume.sh   
                fi      
                exit
                ;;
        esac
done

Reply via email to