I am preperation for config file loading changes and (ultimately) splitting
out the hooks into a separate package.
---
 pm/pm-functions.in |  303 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 303 insertions(+), 0 deletions(-)

diff --git a/pm/pm-functions.in b/pm/pm-functions.in
new file mode 100644
index 0000000..74fd0c5
--- /dev/null
+++ b/pm/pm-functions.in
@@ -0,0 +1,303 @@
+#!/bin/sh
+# vim:noexpandtab
+
+
+# Default values go here.  It is important to _not_ initialize some
+# variables here.  They are:
+#
+# PM_CMDLINE
+# RESUME_MODULES
+#
+# for great debugging!
+[ "${PM_DEBUG}" = "true" ] && set -x
+set -a
+PM_UTILS_LIBDIR="@PM-UTILS-LIBDIR@"
+PM_UTILS_ETCDIR="@PM-UTILS-SYSCONFDIR@"
+PM_UTILS_RUNDIR="/var/run/pm-utils"
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin:"${PM_UTILS_LIBDIR}"/bin
+HIBERNATE_MODE="platform"
+HIBERNATE_RESUME_POST_VIDEO=no
+INHIBIT="${PM_UTILS_RUNDIR}/inhibit"
+PM_LOGFILE="${PM_LOGFILE:=/var/log/pm-suspend.log}"
+SUSPEND_MODULES=""
+TEMPORARY_CPUFREQ_GOVERNOR="performance"
+LOCKDIR="${PM_UTILS_RUNDIR}/locks"
+STORAGEDIR="${PM_UTILS_RUNDIR}/storage"
+SLEEP_MODULE="kernel"
+SLEEP_FUNCTIONS="${PM_UTILS_LIBDIR}/module.d/${SLEEP_MODULE}"
+
+# Use c sort order
+export LC_COLLATE=C
+
+[ -O "${PM_UTILS_LIBDIR}"/defaults ] && . "${PM_UTILS_LIBDIR}"/defaults
+set +a
+
+
+source_configs()
+{
+       for cfg in "${PM_UTILS_ETCDIR}"/config.d/*[!~] ; do
+               [ -O "$cfg" ] || continue
+               set -a
+               . "${cfg}"
+               set +a
+       done
+}
+
+source_configs
+
+# try to take the lock.  Fail if we cannot get it.
+try_lock()
+{
+       # $1 = file to use as lockfile
+       # $2 (optional) content to write to the lockfile,
+       #               extra newline will be appended
+       # make sure the directory where the lockfile should be exists
+       mkdir -p "${LOCKDIR}"
+       local lock="${LOCKDIR}/${1##*/}"
+       # we use noclobber to make sure there are no race conditions
+       (set -o noclobber; echo "${2}" > "${lock}") 2> /dev/null || return 1
+       return 0
+}
+
+# spin waiting for the lock with optional timeout.  
+# return once we have it, or the timeout has expired
+spin_lock()
+{
+       # $1 = lockfile
+       # $2 = optional timeout
+       local elapsed=0
+       while ! try_lock $1; do
+               [ "x$2" != "x" ] && [ $(( $elapsed == $2 )) -ne 0 ] && return 1
+               elapsed=$(($elapsed + 1))
+               sleep 1;
+       done
+}
+
+# release the lock
+release_lock()
+{
+       # $1 = lockfile
+       # make sure it is ours first.i
+       local lock="${LOCKDIR}/${1##*/}"
+       rm -f "${lock}"
+       return $?
+}
+
+
+take_suspend_lock()
+{
+       VT=$(fgconsole)
+       chvt 63
+       try_lock "pm-utils.lock" || return 1
+       mkdir -p "${STORAGEDIR}"
+       return 0
+}
+
+remove_suspend_lock()
+{
+       rm -rf "${STORAGEDIR}"
+       chvt 1
+       chvt $VT
+       release_lock "pm-utils.lock"
+}
+
+
+command_exists()
+{
+       # $1 = command to test for.  It can be an executable in the path,
+       # a shell function, or a shell builtin.
+       type "$1" >/dev/null 2>&1
+       return $?
+}
+
+find_hooks() {
+       # $1 = type of hook to find.  
+       # Currently only power and sleep are meaningful.
+       local syshooks="${PM_UTILS_ETCDIR}/$1.d"
+       local phooks="${PM_UTILS_LIBDIR}/$1.d"
+       local base
+
+       for base in $(for f in "$syshooks/"*[!~] "$phooks/"*[!~];
+               do [ -O "$f" ] && echo ${f##*/} ; done | sort | uniq) ;
+       do
+               if [ -x "$syshooks/$base" ]; then
+                       echo $syshooks/$base
+               elif [ -x "$phooks/$base" ]; then
+                       echo $phooks/$base
+               fi
+       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
+}
+
+get_power_status()
+{
+       RETVAL=0
+       on_ac_power
+       case "$?" in
+               "0")
+                       echo "ac"
+                       ;;
+               "1")
+                       echo "battery"
+                       ;;
+               "255")
+                       echo "error"
+                       RETVAL=1
+                       ;;
+       esac
+       return $RETVAL
+}
+
+[ -O "${SLEEP_FUNCTIONS}" ] || { 
+       echo "Requested sleep module $SLEEP_MODULE not available."
+       exit 1
+}
+
+. "${SLEEP_FUNCTIONS}"
+
+init_logfile() {
+       if [ -h "$1" ]; then
+               echo "$1 is a symbolic link, refusing to overwrite."
+               return 1
+       elif [ -O "$1" ]; then
+               echo "We do not own $1, refusing to overwrite."
+               return 1
+       elif [ -z "$1" ]; then
+               echo "Please pass a filename to init_logfile."
+               return 1
+       fi
+       exec > "$1" 2>&1
+}
+
+pm_main()
+{
+       "check_$1" || {
+               echo "System does not support $1 sleep."
+               return 1
+       }
+       take_suspend_lock || exit 1
+       # make sure that our locks are unlocked no matter how the script exits
+       trap remove_suspend_lock 0
+       init_logfile "$PM_LOGFILE" 
+       rm -f "$INHIBIT"
+
+       run_hooks sleep "$1" reverse "$2"
+
+       return 0
+}
+
+_rmmod() {
+       if modprobe -r "$1"; then
+               touch "${STORAGEDIR}/module:$1"
+               return 0
+       else
+               echo "# could not unload '$1', usage count was $2"
+               return 1
+       fi
+}
+
+# this recursively unloads the given modules and all that depend on it
+# first parameter is the module to be unloaded
+modunload()
+{
+       local MOD D C USED MODS I
+       local UNL="$(echo $1 |tr - _)" RET=1 
+
+       while read MOD D C USED D; do
+               [ "$MOD" = "$UNL" ] || continue
+               if [ "$USED" = "-" ]; then
+                       # no dependent modules, just try to remove this one.
+                       _rmmod "$MOD" $C
+                       RET=$?
+               else
+                       # modules depend on this one.  try to remove them first.
+                       MODS="${USED%%*,}"
+                       while [ -n "${MODS}" ]; do
+                               # try to unload the last one first
+                               MOD="${MODS##*,}"
+                               modunload $MOD && RET=0
+                               # prune the last one from the list
+                               MODS="${MODS%,*}"
+                       done
+                       # if we unloaded at least one module, then let's
+                       # try again!
+                       [ $RET -eq 0 ] && modunload $MOD
+                       RET=$?
+               fi
+               return $RET
+       done < /proc/modules
+       # if we came this far, there was nothing to do, 
+       # the module is no longer loaded.
+       return 0
+}
+
+# reload all the modules in no particular order.
+modreload()
+{
+       for x in "${STORAGEDIR}"/module:* ; do
+               [ -O "${x}" ] && modprobe "${x##*:}" >/dev/null 2>&1
+       done
+}
+
+if ! command_exists service; then
+       service() {
+               if [ -x "/etc/init.d/$1" ]; then
+                       svc="$1"
+                       shift
+                       "/etc/init.d/$svc" "$@"
+               else
+                       echo "$1" $": unrecognized service" 1>&2
+                       return 1
+               fi
+       }
+fi
+
+stopservice()
+{
+       if service "$1" status 2>/dev/null | grep -c -q running; then
+               touch "${STORAGEDIR}/service:$1"
+               service "$1" stop
+       fi
+}
+
+restartservice()
+{
+       [ -O "${STORAGEDIR}/service:$1" ] && service "$1" start
+}
+
+savestate()
+{
+       echo "$2" > "${STORAGEDIR}/state:$1"
+}
+
+restorestate()
+{
+       [ -O "${STORAGEDIR}/state:${1}" ] && cat "${STORAGEDIR}/state:${1}"
+}
-- 
1.5.3.8

_______________________________________________
Pm-utils mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pm-utils

Reply via email to