#!/bin/sh
#
# acpid		Starts the acpi daemon
#
# chkconfig:	345 44 56
# description:	Listen and dispatch ACPI events from the kernel
# processname:	acpid
#
# pidfile:	/var/run/acpid.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Initial values (just in case):
LAPTOP_MODULES=""
VARIOUS_MODULES=""
ASUS_LAPTOP=""
TOSHIBA_LAPTOP=""
MODULES=""

# Configuration file.
. /etc/sysconfig/acpid

# As the name says. If the kernel supports modules,
# it'll try to load the ones listed in "MODULES".
load_modules() {
	[ -f /proc/modules ] || return 0

	if [ "$MODULES" = "all" ]; then
		MODULES=$(sed -rn 's#^kernel/(drivers/acpi|drivers/misc/.*_acpi)/([^/]+/)*(.*)\.ko\.gz:.*#\3#p' /lib/modules/$(uname -r)/modules.dep)
	else
		# assemble from old lists
		MODULES="$MODULES $LAPTOP_MODULES"
		MODULES="$MODULES $VARIOUS_MODULES"
		if is_yes "$ASUS_LAPTOP"; then
			MODULES="$MODULES asus_acpi"
		fi
		if is_yes "$TOSHIBA_LAPTOP"; then
			MODULES="$MODULES toshiba_acpi"
		fi
		if is_yes "$IBM_LAPTOP"; then
			MODULES="$MODULES ibm_acpi"
		fi
		# strip spaces
		MODULES=$(echo ${MODULES})
	fi

	if [ -z "$MODULES" ]; then
		return
	fi

	# see if the modules are already loaded
	if [ "$(lsmod | grep -E '^('$(echo $MODULES | tr ' ' '|')')\b' | wc -l)" = "$(echo $MODULES | wc -w)" ]; then
		return
	fi

	show "Loading ACPI modules..."; busy
	modprobe --all $MODULES && ok || fail
}

# Start daemons.
start() {
	if [ -f /var/lock/subsys/acpid ]; then
		msg_already_running "ACPI Event Daemon"
		return
	fi

	load_modules

	if is_yes "$NETLINK"; then
		PROGRAM_ARGS="$PROGRAM_ARGS -n"
	fi
	if [ "$CLIENTMAX" ]; then
		PROGRAM_ARGS="$PROGRAM_ARGS -C $CLIENTMAX"
	fi

	# starting:
	msg_starting "ACPI Event Daemon"
	daemon /usr/sbin/acpid $PROGRAM_ARGS
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch /var/lock/subsys/acpid
}

# Stop daemons.
stop() {
	if [ ! -f /var/lock/subsys/acpid ]; then
		msg_not_running "ACPI Event Daemon"
		return
	fi

	msg_stopping "ACPI Event Daemon"
	killproc acpid
	rm -f /var/lock/subsys/acpid >/dev/null 2>&1
}

condrestart() {
	if [ ! -f /var/lock/subsys/acpid ]; then
		msg_not_running "ACPI Event Daemon"
		RETVAL=$1
		return
	fi

	stop
	start
}

reload() {
	if [ -f /var/lock/subsys/acpid ]; then
		msg_not_running "ACPI Event Daemon"
		RETVAL=7
		return
	fi

	msg_reloading "ACPI Event Daemon"
	killproc acpid -HUP
	RETVAL=$?
}

RETVAL=0
# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
  	stop
	;;
  restart)
	stop
	start
	;;
  try-restart)
	condrestart 0
	;;
  reload|force-reload)
	reload
	;;
  load-modules)
	load_modules
	;;
  status)
	status acpid
	;;
  *)
	msg_usage "$0 {start|stop|restart|try-restart|reload|force-reload|load-modules|status}"
	exit 3
esac

exit $RETVAL
