about summary refs log tree commit diff
path: root/zzz
blob: ff50d28aba3f8541f58471e25895789b7fb50827 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/sh
# zzz - really simple suspend script

USAGE="Usage: ${0##*/} [-nSzZR]
   -n   dry run (sleep for 5s instead of suspend/hibernate)
   -S   Low-power idle (ACPI S0)
   -z   suspend to RAM (ACPI S3) [DEFAULT for zzz(8)]
   -Z   hibernate to disk & power off (ACPI S4) [DEFAULT for ZZZ(8)]
   -R   hibernate to disk & reboot"

fail() { echo ${0##*/}: 1>&2 "$*"; exit 1; }

export ZZZ_MODE=suspend
export ZZZ_HIBERNATE_MODE=platform

case "$0" in
  *ZZZ) ZZZ_MODE=hibernate;;
esac

while getopts hnSzRZ: opt; do
  case "$opt" in
    n) ZZZ_MODE=noop;;
    S) ZZZ_MODE=standby;;
    z) ZZZ_MODE=suspend;;
    Z) ZZZ_MODE=hibernate;;
    R) ZZZ_MODE=hibernate; ZZZ_HIBERNATE_MODE=reboot;;
    [h?]) fail "$USAGE";;
  esac
done
shift $((OPTIND-1))

case "$ZZZ_MODE" in
  suspend) grep -q mem /sys/power/state || fail "suspend not supported";;
  hibernate) grep -q disk /sys/power/state || fail "hibernate not supported";;
esac

test -w /sys/power/state || fail "sleep permission denied"

(
flock -n 9 || fail "another instance of zzz is running"

printf "Zzzz... "

for hook in /etc/zzz.d/suspend/*; do
  [ -x "$hook" ] && "$hook"
done

case "$ZZZ_MODE" in
  standby) printf freeze >/sys/power/state || fail "standby failed";;
  suspend) printf mem >/sys/power/state || fail "suspend failed";;
  hibernate)
	echo $ZZZ_HIBERNATE_MODE >/sys/power/disk
	printf disk >/sys/power/state || fail "hibernate failed";;
  noop) sleep 5;;
esac

for hook in /etc/zzz.d/resume/*; do
  [ -x "$hook" ] && "$hook"
done

echo "yawn."
) 9</sys/power