#! /bin/bash # Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. # All rights reserved. # # Authors: Christian Zoz # Timo Hoenig # # /etc/init.d/acpid # and its symbolic link # /usr/sbin/rcacpid # # LSB compliant service control script; see http://www.linuxbase.org/spec/ # ### BEGIN INIT INFO # Provides: acpid # Required-Start: $local_fs # Required-Stop: # Default-Start: 2 3 5 # Default-Stop: 0 1 6 # Short-Description: Listen and dispatch ACPI events from the kernel # Description: acpid reads events from /proc/acpi/event and dispatches # them (by SuSE default) to other "users" like powersaved, HAL and IAL. # Actions for those events are (by SUSE default) configured in the # powersaved configuration. # Additionally this start script loads all needed modules. ### END INIT INFO # Check for missing binaries (stale symlinks should not happen) ACPID_BIN=/sbin/acpid test -x $ACPID_BIN || exit 5 # Shell functions sourced from /etc/rc.status: # rc_check check and set local and overall rc status # rc_status check and set local and overall rc status # rc_status -v ditto but be verbose in local rc status # rc_status -v -r ditto and clear the local rc status # rc_status -s display "skipped" and exit with status 3 # rc_status -u display "unused" and exit with status 3 # rc_failed set local and overall rc status to failed # rc_failed set local and overall rc status to # rc_reset clear local rc status (overall remains) # rc_exit exit appropriate to overall rc status # rc_active checks whether a service is activated by symlinks # rc_splash arg sets the boot splash screen to arg (if active) . /etc/rc.status # Reset status of this service rc_reset # Return values acc. to LSB for all commands but status: # 0 - success # 1 - generic or unspecified error # 2 - invalid or excess argument(s) # 3 - unimplemented feature (e.g. "reload") # 4 - user had insufficient privileges # 5 - program is not installed # 6 - program is not configured # 7 - program is not running # 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) # # Note that starting an already running service, stopping # or restarting a not-running service as well as the restart # with force-reload (in case signaling is not supported) are # considered a success. ACPI_MODULES="" DEFAULT_ACPI_MODULES="ac battery button fan processor thermal" ACPI_LAPTOP_MODULES_PROBE="asus_acpi ibm_acpi toshiba_acpi sony_acpi pcc_acpi dock bay" ACPI_LAPTOP_MODULES_FILE="/var/lib/acpi/laptop_modules" ARCH=`uname -i` case $ARCH in ia64) DEFAULT_ACPI_MODULES="button fan processor thermal" ACPI_LAPTOP_MODULES_PROBE="" # avoid even occassional probing of laptop modules! ACPI_LAPTOP_MODULES_USER="NONE" ;; esac [ -f /etc/sysconfig/powersave/common ] && . /etc/sysconfig/powersave/common [ -f /etc/sysconfig/acpi ] && . /etc/sysconfig/acpi [ -f /etc/sysconfig/powersave/cpufreq ] && . /etc/sysconfig/powersave/cpufreq case "$1" in start) if [ ! -d /proc/acpi ] ; then echo -n "acpid: no ACPI support in kernel" rc_status -s rc_exit fi echo -n "acpid: loading ACPI modules ( " if [ "$ACPI_MODULES" != "NONE" ]; then # load ACPI modules for m in ${ACPI_MODULES:-$DEFAULT_ACPI_MODULES}; do grep -wq $m /proc/modules || { modprobe -s $m && echo -n "$m " || rc_status; } done fi echo -n ") " rc_status -v if [ -n "$ACPI_LAPTOP_MODULES_USER" ]; then if [ "$ACPI_LAPTOP_MODULES_USER" != "NONE" ]; then echo -n "acpid: loading ACPI laptop modules ( " # Load modules defined by user for m in ${ACPI_LAPTOP_MODULES_USER}; do grep -wq $m /proc/modules || { modprobe -s $m && echo -n "$m " || rc_status; } done echo -n ") " rc_status -v fi else if [ /boot/vmlinuz -ot "$ACPI_LAPTOP_MODULES_FILE" ]; then echo -n "acpid: loading ACPI laptop modules ( " # Load modules defined by system probe while read m; do grep -wq $m /proc/modules || { modprobe -s $m && echo -n "$m " || rc_status; } done < $ACPI_LAPTOP_MODULES_FILE echo -n ") " rc_status -v else # First run, or kernel has been updated. We have to probe which # modules load successfully. For this, we do respect # LOAD_UNSUPPORTED_MODULES_AUTOMATICALLY. echo "acpid: probing laptop ACPI modules " touch "$ACPI_LAPTOP_MODULES_FILE" for m in $ACPI_LAPTOP_MODULES_PROBE; do if modprobe $MODPROBE_OPTS -s $m; then # pcc_acpi and sony_acpi can always be loaded. # remove them if the system does not support them. case $m in sony_acpi) if [ ! -r /proc/acpi/sony/brightness ] ; then grep -wq $m /proc/modules && rmmod sony_acpi; continue fi ;; pcc_acpi) if [ ! -r /proc/acpi/panasonic -a ! -r /proc/acpi/pcc ] ; then grep -wq $m /proc/modules && rmmod pcc_acpi; continue fi ;; asus_acpi) if [ ! -r /proc/acpi/asus ] ; then grep -wq $m /proc/modules && rmmod asus_acpi; continue fi ;; esac echo $m >> $ACPI_LAPTOP_MODULES_FILE fi done echo -n "acpid: added " while read m; do echo -n "$m " done < $ACPI_LAPTOP_MODULES_FILE echo -n "to $ACPI_LAPTOP_MODULES_FILE" rc_status -v; fi fi echo -n "Starting acpid " startproc $ACPID_BIN rc_status -v ;; stop) echo -n "Shutting down acpid " killproc -TERM $ACPID_BIN rc_status -v ;; try-restart) $0 status if test $? = 0; then $0 restart else rc_reset # Not running is not a failure. fi rc_status ;; restart) $0 stop $0 start rc_status ;; force-reload|reload) echo -n "Reload service acpid " killproc -HUP $ACPID_BIN rc_status -v ;; status) echo -n "Checking for service acpid " PID=`checkproc -v $ACPID_BIN` if rc_status ; then case `cat /proc/$PID/cmdline` in *events.ignore) rc_failed 3; esac fi rc_status -v ;; probe) test $ACPID_CONFIG -nt /var/run/acpid.pid && echo restart ;; *) echo "Usage: $0" \ "{start|stop|status|try-restart|restart|force-reload|reload|probe}" exit 1 ;; esac rc_exit