diff options
author | Victor Lowther <victor.lowther@gmail.com> | 2008-02-05 16:09:04 -0600 |
---|---|---|
committer | Victor Lowther <victor.lowther@gmail.com> | 2008-02-07 17:26:50 -0600 |
commit | 558c2fbfb3157a0d18d66dd8b6b34a2c24c61164 (patch) | |
tree | f7a7d8007c38c6d2b501d4898e6587da63eeda8c | |
parent | 8df496aeffe3a7114fa01912d7605693c5bc64b9 (diff) |
Simplify hook implementation.
modified: pm/HOWTO.hooks
modified: pm/functions.in
modified: pm/sleep.d/Makefile.am
deleted: pm/sleep.d/zzz
* Merge the functionality of find_hooks and run_hooks. This results in
a new run_hooks function which is much simpler than the old one and is
much more resistant to breaking due to odd filenames.
* Actually implements the functionality mentioned in README where you
can create a nonexecutable file in /etc/pm/(sleep|power).d that will
prevent the copy in /usr/lib/pm-utils/(sleep|power).d from running.
* Undoes the "nonzero exit code means do not run on resume" and
auto-reverse pseudofeatures I added in the POSIX series. If anyone likes
them, they can be added back at the cost of either passing a function to
run_hooks or maintaining a global variable.
* Merges the functionality that was in zzz back into pm_main. Although
zzz was a slightly funny name, upon further reflection it was a bad idea
and makes it harder to implement some partitioning of functionality that
will be needed if/when the hooks are split into their own project.
* Updates the documentation to reflect these changes.
-rw-r--r-- | pm/HOWTO.hooks | 16 | ||||
-rw-r--r-- | pm/functions.in | 65 | ||||
-rw-r--r-- | pm/sleep.d/Makefile.am | 3 | ||||
-rwxr-xr-x | pm/sleep.d/zzz | 10 |
4 files changed, 32 insertions, 62 deletions
diff --git a/pm/HOWTO.hooks b/pm/HOWTO.hooks index 482af72..43fe40d 100644 --- a/pm/HOWTO.hooks +++ b/pm/HOWTO.hooks @@ -26,20 +26,8 @@ All hooks are run in lexical sort order according to the C locale. SLEEP.D SPECIFIC NOTES For any given sleep/wakeup cycle, the hooks in sleep.d are run twice: -Once in C lexical sort order before the system goes to sleep, and -Once in reverse C lexical sort order when the system wakes up. - -If a hook does not need to be run when waking up, it SHOULD return a non-zero -exit code -- this will signal the hook-running infrastructure to skip that -hook when waking up. - -Similarly, if your hook only needs to run on system with certain specific -configurations (such as the (0|9)5led hooks, which are IBM specific), -or relies on certain specific commands that are not guaranteed to be present -(such as the 10NetworkManager hook, which relies on D-Bus and Network Manager -both being present), you SHOULD test for those conditions first and you SHOULD -return a non-zero exit code if your hook is not applicable to the system it -is running on. +* Once in C lexical sort order before the system goes to sleep, and +* Once in reverse C lexical sort order when the system wakes up. CONVENIENCE FUNCTIONS diff --git a/pm/functions.in b/pm/functions.in index a9f0c1b..996c8dd 100644 --- a/pm/functions.in +++ b/pm/functions.in @@ -104,49 +104,38 @@ command_exists() return $? } -find_hooks() { +run_hooks() { # $1 = type of hook to find. + # $2 = paramaters to pass to hooks. + # $3 = if present and equal to "reverse", run hooks backwards. # Currently only power and sleep are meaningful. local syshooks="${PM_UTILS_ETCDIR}/$1.d" local phooks="${PM_UTILS_LIBDIR}/$1.d" + local sort="sort" local base - - for base in $(for f in $syshooks/*[!~] $phooks/*[!~]; - do [ -f "$f" ] && echo ${f##*/} ; done | sort | uniq) ; + local hook + local oifs="${IFS}" + # the next two lines are not a typo or a formatting error! + local nifs=" +" + IFS="${nifs}" # tolerate spaces in filenames. + [ "$3" = "reverse" ] && sort="sort -r" + for base in $(IFS="${oifs}"; for f in $syshooks/*[!~] $phooks/*[!~]; + do [ -f "$f" ] && echo ${f##*/} ; done | ${sort} | uniq) ; do - if [ -x "$syshooks/$base" ]; then - echo $syshooks/$base - elif [ -x "$phooks/$base" ]; then - echo $phooks/$base + if [ -f "$syshooks/$base" ]; then + hook="$syshooks/$base" + elif [ -f "$phooks/$base" ]; then + hook="$phooks/$base" fi + [ -x "${hook}" ] && { + IFS="${oifs}" + echo "$(date): running ${hook} $2" + "${hook}" $2 + IFS="${nifs}" + } done -} - -run_hooks() { - # $1 = hooks to run - # $2 = parameters to pass to hooks - # $3 = if $3 = "reverse", then also run the hooks that ran sucessfully - # backwards with parameters in $4 - # $4 = parameters to pass to scripts when running backwards - echo "$(date): running $1 hooks." - local hooks="$1" - local params="$2" - shift; shift - local revhooks - local file - for file in $(find_hooks "${hooks}"); do - echo "===== $(date): running hook: $file $params =====" - "$file" $params && revhooks="${file}${revhooks:+" ${revhooks}"}" - done - echo "$(date): done running $hooks:$params hooks." - if [ "x$1" = "xreverse" ]; then - echo "$(date): running $hooks hooks backwards." - for file in $revhooks; do - echo "===== $(date): running hook :$file $2 =====" - "${file}" $2 - done - echo "$(date): done running $hooks:$2 backwards" - fi + IFS="${oifs}" } get_power_status() @@ -200,7 +189,11 @@ pm_main() rm -f "$INHIBIT" - run_hooks sleep "$1" reverse "$2" + run_hooks sleep "$1" + command_exists "do_$1" && [ ! -e "${INHIBIT}" ] && { \ + sync; "do_$1" + } + run_hooks sleep "$2" reverse return 0 } diff --git a/pm/sleep.d/Makefile.am b/pm/sleep.d/Makefile.am index 5092a42..256ee0b 100644 --- a/pm/sleep.d/Makefile.am +++ b/pm/sleep.d/Makefile.am @@ -13,8 +13,7 @@ sleep_SCRIPTS = \ 90clock \ 94cpufreq \ 95led \ - 99video \ - zzz + 99video EXTRA_DIST=$(sleep_SCRIPTS) diff --git a/pm/sleep.d/zzz b/pm/sleep.d/zzz deleted file mode 100755 index 202e3a0..0000000 --- a/pm/sleep.d/zzz +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -. "${PM_FUNCTIONS}" -[ -e "${INHIBIT}" ] && return 1 -sync;sync;sync; -case $1 in - suspend|hibernate|suspend_hybrid) "do_$1" ;; - resume|thaw) exit 0 ;; - *) exit 1 ;; -esac -exit $? |