#!/bin/bash
#
# sysfs		Set sysfs variables from /etc/sysfs.conf
#
# chkconfig: - 33 67
# description:	Set sysfs variables from /etc/sysfs.conf
# config: /etc/sysfs.conf
#
### BEGIN INIT INFO
# Provides:          sysfs
# Required-Start:
# Should-Start:      udev
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Set sysfs variables from /etc/sysfs.conf
# Description:       You can configure values for sysfs variables
#                    (such as power management defaults)
#                    and /sys file permissions in /etc/sysfs.conf.
### END INIT INFO

# Do not load RH compatibility interface.
WITHOUT_RC_COMPAT=1

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

CONFFILE=/etc/sysfs.conf
CONFDIR=/etc/sysfs.d
LOCKFILE=/var/lock/subsys/sysfs
RETVAL=0

[ -r "$CONFFILE" -o -d "$CONFDIR" ] || exit 0

load_conffile() {
    FILE="$1"
    sed  's/#.*$//; /^[[:space:]]*$/d; 
	  s/^[[:space:]]*\([^=[:space:]]*\)[[:space:]]*\([^=[:space:]]*\)[[:space:]]*=[[:space:]]*\(.*\)/\1 \2 \3/' \
	  "$FILE" | {
	while read f1 f2 f3; do
	    if [ "$f1" = "mode" -a -n "$f2" -a -n "$f3" ]; then
		if [ -f "/sys/$f2" ] || [ -d "/sys/$f2" ]; then
		    chmod "$f3" "/sys/$f2"
		else
		    echo "Unknown attribute: $f2" >&2
		fi
	    elif [ "$f1" = "owner" -a -n "$f2" -a -n "$f3" ]; then
		if [ -f "/sys/$f2" ]; then
		    chown "$f3" "/sys/$f2"
		else
		    echo "Unknown attribute: $f2" >&2
		fi
	    elif [ "$f1" -a -n "$f2" -a -z "$f3" ]; then
		if [ -f "/sys/$f1" ]; then
		    # Some fields need a terminating newline, others
		    # need the terminating newline to be absent :-(
		     printf "%s" "$f2" > "/sys/$f1" 2>/dev/null ||
			printf "%s\n" "$f2" > "/sys/$f1"
		else
		    echo "Unknown attribute: $f1" >&2
		fi
	    else
		echo "Syntax error in $FILE: '$f1' '$f2' '$f3'" >&2
	    fi
	done
    }
}

apply_sysfs_rules () {
	echo -n "Setting sysfs variables..."
	for file in "$CONFFILE" "$CONFDIR"/*.conf; do
		[ -r "$file" ] || continue
		load_conffile "$file" || RETVAL=$?
	done
	[ "$RETVAL" = 0 ] && touch "$LOCKFILE"
	return $RETVAL
}

# See how we were called.
case "$1" in
	start|reload|restart)
		apply_sysfs_rules && echo_success || echo_failure
		echo
		;;
	condrestart|condreload)
		if [ -e "$LOCKFILE" ]; then
			apply_sysfs_rules && echo_success || echo_failure
			echo
		fi
		;;
	status)
		echo -n "Subsystem was "
		[ -f "$LOCKFILE" ] || echo -n "not "
		echo "activated."
		;;
	stop|condstop)
		rm -f "$LOCKFILE"
		;;
	*)
		msg_usage "${0##*/} {start|stop|reload|restart|condstop|condrestart|condreload|status}"
		RETVAL=1
esac

exit $RETVAL
