1#!/bin/sh 2 3EVENT=${1:-short-press} 4 5TIMEOUT=3 # s 6PIDFILE="/tmp/$(basename $0).pid" 7LOCKFILE=/tmp/.power_key 8 9short_press() 10{ 11 logger -t $(basename $0) "[$$]: Power key short press..." 12 13 if type pm-suspend &>/dev/null; then 14 SUSPEND_CMD="pm-suspend" 15 else 16 SUSPEND_CMD="echo -n mem > /sys/power/state" 17 fi 18 19 if [ ! -f $LOCKFILE ]; then 20 logger -t $(basename $0) "[$$]: Prepare to suspend..." 21 22 touch $LOCKFILE 23 sh -c "$SUSPEND_CMD" 24 { sleep 2 && rm $LOCKFILE; }& 25 fi 26} 27 28long_press() 29{ 30 logger -t $(basename $0) "[$$]: Power key long press (${TIMEOUT}s)..." 31 32 logger -t $(basename $0) "[$$]: Prepare to power off..." 33 34 poweroff 35} 36 37logger -t $(basename $0) "[$$]: Received power key event: $@..." 38 39case "$EVENT" in 40 press) 41 # Lock it 42 exec 3<$0 43 flock -x 3 44 45 start-stop-daemon -K -q -p $PIDFILE || true 46 start-stop-daemon -S -q -b -m -p $PIDFILE -x /bin/sh -- \ 47 -c "sleep $TIMEOUT; $0 long-press" 48 49 # Unlock 50 flock -u 3 51 ;; 52 release) 53 # Avoid race with press event 54 sleep .5 55 56 start-stop-daemon -K -q -p $PIDFILE && short_press 57 ;; 58 short-press) 59 short_press 60 ;; 61 long-press) 62 long_press 63 ;; 64esac 65