[Pm-utils] [PATCH 3/7] Made a copy of functions.in called pm-functions.in
Victor Lowther
victor.lowther at gmail.com
Sat Feb 9 21:24:47 PST 2008
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
More information about the Pm-utils
mailing list