#!/bin/sh
#
# RC script for murasaki
#   Copyright (c) by Shuu Yamaguchi <shuu@dotAster.com>
#
#   $Id: rc.murasaki,v 2.23 2004/04/07 14:38:02 shuu Exp shuu $
#
#   Can be freely distributed and used under the terms of the GNU GPL.
#
# chkconfig: 345 06 99
# description: RC script for Murasaki

CONF_DIR=/etc/murasaki
INIT_DIR=/sbin
SCRIPT_DIR=/usr/lib/murasaki
ADD_PRELOAD=${CONF_DIR}/add.preload
REMOVE_PRELOAD=${CONF_DIR}/remove.preload
AUTOSETUP=${SCRIPT_DIR}/auto_setup
MURASAKI_HOTPLUG=/sbin/hotplug.murasaki
MURASAKI_PRELOAD=${CONF_DIR}/murasaki.preload
DEFAULT_HOTPLUG=/sbin/hotplug
PROC_HOTPLUG=/proc/sys/kernel/hotplug
PROC_MODPROBE=/proc/sys/kernel/modprobe
MODPROBE=modprobe
MODPROBE_OPT=-s
LOCK_FILE=/var/lock/subsys/murasaki
PCMCIA_INIT_CMD=murasaki_init.pcmcia_socket
PCMCIA_LOCK_FILE=${CONF_DIR}/.pcmcia_socket.lock
#############################################
# OVERWRITE:true/false:if you want to setup automatically on every boot,
# 			you choose 'true'
#           You should choice 'true' as OVERWRITE and use "add.preload"/
#            "remove.preload" to select appropriate preloaded modules.
OVERWRITE=true			
#
# MURASAKI_BEEP:on/off:if you like to beep when your PC boots, you set 'on'
MURASAKI_BEEP=off
#
# INIT_CMD: if you want to initialize hotplugable devices on booting,
#		you put them into INIT_CMD.
#      You also use /etc/murasaki/murasaki.conf.
INIT_CMD="pci usb ieee1394 pcmcia_socket"
#############################################

########################## export
PATH=$PATH:/sbin:/usr/sbin;export PATH
export MURASAKI_BEEP
########################## function
initialize(){
	if [ -z "$INIT_CMD" ];then
		return
	fi
	rm -f ${PCMCIA_LOCK_FILE}
	for dev in $INIT_CMD
	do
		if [ -x  ${INIT_DIR}/murasaki_init.${dev} ];then
			${INIT_DIR}/murasaki_init.${dev}
		fi
	done
}

pcmcia_stop(){
	${PCMCIA_INIT_CMD} stop
}

rm_sysdir() {
	while read dev mnt fs other
	do
		if [ "$fs" = "sysfs" ];then
			rm -fr ${CONF_DIR}${mnt}
		fi
	done < /etc/mtab
}

build_preload() {
	if [ -s ${MURASAKI_PRELOAD} ];then
		PRELOAD=`cat ${MURASAKI_PRELOAD}`
	fi
	if [ -s ${ADD_PRELOAD} ];then
		PRELOAD="${PRELOAD} `cat ${ADD_PRELOAD}`"
	fi
	if [ -s ${REMOVE_PRELOAD} ];then
		REMOVE=`cat ${REMOVE_PRELOAD}`
		TMP_PRELOAD=${PRELOAD}
		PRELOAD=""
		for mm in ${TMP_PRELOAD}
		do
			FOUND=0
			for rr in ${REMOVE}
			do
				if [ "$rr" = "$mm" ];then
					FOUND=1	
				fi
			done
			if [ ${FOUND} -ne 1 ];then
				PRELOAD="$PRELOAD $mm"
			fi
		done
	fi
	
}

load_module()
{
	MODULE=""
	set -- $*

	while [ -n "$1" ]
	do
		if [ -z "${MODULE}" ];then
			MODULE=$1
		fi
		if [ -n "$2" ] && expr "$2" : '.*=' >/dev/null;then
			MODULE="${MODULE} $2"
		else
			${MODPROBE} ${MODPROBE_OPT} ${MODULE}
			MODULE=""
		fi
		shift
	done
}
########################## exec
# Desktop
MURASAKI_SCRIPT_DIR=${SCRIPT_DIR}
. ${SCRIPT_DIR}/func_desktop

case "$1" in
start)
	# When hotplug=off is specified on a kernel boot option,
	#  murasaki do nothing.
	if grep 'hotplug=off' /proc/cmdline >/dev/null 2>&1 ;then
		exit 0;
	fi
	if [ ! -f ${MURASAKI_PRELOAD} -o ${OVERWRITE} = 'true' ];then
		${AUTOSETUP} > ${MURASAKI_PRELOAD}
	fi
	rm_sysdir
	restore_fstab
	rm -f ${CONF_DIR}/lock*
	build_preload
	if [ "${PRELOAD}" != "" ];then
		load_module ${PRELOAD}
	fi
	touch ${LOCK_FILE}
	NAME=`cat ${PROC_MODPROBE}` 
	if [ ${MODPROBE} != `basename $NAME` ];then
		echo `which ${MODPROBE}` > ${PROC_MODPROBE}
	fi
	echo ${MURASAKI_HOTPLUG} > ${PROC_HOTPLUG}
	initialize
	echo ${DEFAULT_HOTPLUG} > ${PROC_HOTPLUG}
	ln -sf ${MURASAKI_HOTPLUG} /dev/.hotplug.agent
	;;
stop)
	rm -f ${LOCK_FILE}
	pcmcia_stop
	restore_fstab
	#echo ${DEFAULT_HOTPLUG} > ${PROC_HOTPLUG}
	ln -sf /bin/true /dev/.hotplug.agent
	;;
restart)
	$0 stop
	$0 start
	;;
*)
	echo "Usage: $0 {start|stop|restart}"
	;;
esac
