#!/bin/sh
#
# rc.pcmcia 1.23 1998/07/18 18:49:26 (David Hinds)
#
# This is designed to work in BSD as well as SysV init setups.  See
# the HOWTO for customization instructions.
# Modified to comply with Debian's standards by Brian Mays
# <brian@debian.org>.

usage()
{
    echo "Usage: $0 {start|stop|restart|reload}"
}

cleanup()
{
    while read SN CLASS MOD INST DEV EXTRA ; do
	if [ "$SN" != "Socket" ] ; then
	    /etc/pcmcia/$CLASS stop $DEV 2> /dev/null
	fi
    done
}

# Allow environment variables to override all options
if [ "$PCMCIA" ] ; then readonly PCMCIA ; fi
if [ "$PCIC" ] ; then readonly PCIC ; fi
if [ "$PCIC_OPTS" ] ; then readonly PCIC_OPTS ; fi
if [ "$CORE_OPTS" ] ; then readonly CORE_OPTS ; fi
if [ "$CARDMGR_OPTS" ] ; then readonly CARDMGR_OPTS ; fi
if [ "$SCHEME" ] ; then readonly SCHEME ; fi

# Source PCMCIA configuration, if available
if [ -f /etc/pcmcia.conf ] ; then
    . /etc/pcmcia.conf
elif [ -f /etc/sysconfig/pcmcia ] ; then
    . /etc/sysconfig/pcmcia
else
    # Should be either i82365 or tcic
    PCIC=i82365
    # Put socket driver timing parameters here
    PCIC_OPTS=
    # Put pcmcia_core options here
    CORE_OPTS=
    # Put cardmgr options here
    CARDMGR_OPTS=
    # To set the PCMCIA scheme at startup...
    SCHEME=
fi
if [ "$PCMCIA" -a "$PCMCIA" != "yes" ] ; then exit 0 ; fi

EXITCODE=1
for x in "1" ; do

    if [ "$PCIC" = "" ] ; then
	echo "PCIC not defined in /etc/init.d/pcmcia!"
	break
    fi

    if [ $# -lt 1 ] ; then usage ; break ; fi
    action=$1

    case "$action" in

    'start')
	echo -n "Starting PCMCIA services:"
	SC=/var/run/pcmcia-scheme
	if [ -L $SC -o ! -O $SC ] ; then rm -f $SC ; fi
	if [ ! -f $SC ] ; then umask 022 ; echo -n > $SC ; fi
	if [ "$SCHEME" ] ; then umask 022 ; echo $SCHEME > $SC ; fi
	fgrep -q pcmcia /proc/devices
	if [ $? -ne 0 ] ; then
	    PC=/lib/modules/`uname -r`/pcmcia
	    if [ -d $PC ] ; then
		echo -n " modules"
		/sbin/insmod $PC/pcmcia_core.o $CORE_OPTS
		/sbin/insmod $PC/$PCIC.o $PCIC_OPTS
		/sbin/insmod $PC/ds.o
	    else
		echo " module directory $PC not found."
		break
	    fi
	fi
	if [ -s /var/run/cardmgr.pid ] && \
	   start-stop-daemon --stop --quiet --signal 0 \
	       --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr ; then
	    echo " cardmgr is already running."
	else
	    if [ -r /var/run/stab ] ; then
		cat /var/run/stab | cleanup
	    fi
	    echo " cardmgr."
	    start-stop-daemon --start --quiet --pidfile /var/run/cardmgr.pid \
		--exec /sbin/cardmgr -- $CARDMGR_OPTS
	fi
	if [ -d /var/lock/subsys ] ; then
	    touch /var/lock/subsys/pcmcia
	fi
	;;

    'stop')
	echo -n "Shutting down PCMCIA services:"
	PID=`cat /var/run/cardmgr.pid`
	start-stop-daemon --stop --quiet \
	    --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr
	echo -n " cardmgr"
	# Give cardmgr a few seconds to handle the signal
	start-stop-daemon --stop --quiet --signal 0 \
	       --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr && \
	sleep 2 && \
	start-stop-daemon --stop --quiet --signal 0 \
	       --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr && \
	sleep 2 && \
	start-stop-daemon --stop --quiet --signal 0 \
	       --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr && \
	sleep 2 && \
	start-stop-daemon --stop --quiet --signal 0 \
	       --pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr
	if fgrep -q "ds  " /proc/modules ; then
	    echo -n " modules"
	    /sbin/rmmod ds
	    /sbin/rmmod $PCIC
	    /sbin/rmmod pcmcia_core
	fi
	echo "."
	rm -f /var/lock/subsys/pcmcia
	EXITCODE=0
	;;

    'restart')
	$0 stop
	$0 start
	EXITCODE=0
	;;

    'reload')
	echo "Reloading $DESC configuration files."
	start-stop-daemon --stop --signal 1 --quiet \
		--pidfile /var/run/cardmgr.pid --exec /sbin/cardmgr
	;;

    *)
	usage
	;;

    esac

done

# Only exit if we're in our own subshell
if [ "${0##*/}" = "pcmcia" ] ; then
    exit $EXITCODE
fi
