# /etc/rc - System startup script run by init before going multiuser.

exec >/dev/log
exec 2>/dev/log
exec </dev/null

umask 022
TERM="${TERM-minix}"
PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin:/sbin
RC_TZ=/etc/rc.timezone
export TERM PATH

usage()
{
    echo >&2 "Usage: $0 [-saf] start|stop|down"
    exec intr sh
}

up()
{
    # Function to dynamically start a system service
    opt=""
    prefix=$(expr "$1 " : '\(-\)')
    if [ "$prefix" = "-" ];
    then
         opt=$1
         shift
    fi
    service=$1
    shift

    service $opt up /sbin/$service "$@"
}

edit()
{
    # Function to dynamically edit system service settings
    opt=""
    prefix=$(expr "$1 " : '\(-\)')
    if [ "$prefix" = "-" ];
    then
         opt=$1
         shift
    fi
    service=$1
    shift

    # Assume binaries are always in /usr/sbin
    service $opt edit /usr/sbin/$service -label $service "$@"
}

while getopts 'saf' opt
do
    case $opt in
    s)	sflag=t ;;	# Single user
    a)	aflag=t ;;	# Ask for /usr
    f)	fflag=t ;;	# Force a full file system check
    *)	usage
    esac
done
shift `expr $OPTIND - 1`

case "$#:$1" in
1:start|1:stop|1:down)
    action=$1
    ;;
*)  usage
esac

case $action in
start)
    echo -n "Multiuser startup in progress ..."

    # National keyboard?
    test -f /etc/keymap && loadkeys /etc/keymap

    # options for fsck. default is -r, which prompts the user for repairs.
    fsckopts="`sysenv fsckopts`"
    if [ ! "$fsckopts" ]
    then	fsckopts=-r
    fi

    if [ "`sysenv debug_fkeys`" != 0 ]
    then
        up -n is -period 5HZ
    fi
    echo

    # Set timezone.
    export TZ=GMT0
    if [ -f "$RC_TZ" ]
    then . "$RC_TZ"
    fi

    # Try to read the hardware real-time clock, otherwise do it manually.
    readclock || intr date -q

    # Initialize files.
    printroot >/etc/mtab		# /etc/mtab keeps track of mounts
    >/etc/utmp				# /etc/utmp keeps track of logins

    # /etc/fstab lists the root, tmp and usr devices.
    . /etc/fstab

    # Unmount now defunct ramdisk
    umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk"

    # Use MFS binary only from kernel image?
    if [ "`sysenv bin_img`" = 1 ]
    then
        bin_img="-i "
    fi

    # Are we booting from CD?
    bootcd="`/bin/sysenv bootcd`"

    # If booting from CD, /usr has to be mounted readonly.
    # Also, $usr won't be specified correctly in the
    # fstab (the CD could be anywhere), so we decide
    # where it is based on sysenv (set by FS when probing for CD).
    if [ "$bootcd" = 1 ]
    then	
    		#imagedev="`/bin/sysenv cdproberoot`"
    		#usrdev="`expr $imagedev + 1`"
    		usr_roflag="-r"
    		usr="$cddev"p2
    		echo "Setting /usr on cd is $usr"
    fi
 

    # Mount the /usr partition unless this is a single floppy Minix.
    if [ ! -d /usr/bin ]
    then
	if [ "$aflag" -o "$usr" = unknown ]
	then
	    # We need to ask what the /usr du jour is.
	    intr sh -c '
		echo -n "Finish the name of device to mount as /usr: /dev/"
		read usr
		echo "usr=/dev/$usr" >/tmp/usr'
	    . /tmp/usr
	fi

	mount $bin_img $usr_roflag $usr /usr || {
	    echo "\
Please try to mount something else as /usr, then hit CTRL-D to continue startup.
Mount $usr /usr failed -- Single user."
	    intr sh
	}
	rm -f /tmp/usr
    fi

    # Check if the system crashed.
    if shutdown -C
    then
	echo
	echo "The system was not properly shut down.  Checking file systems."
	fflag=t
    fi

    if [ "$fflag" ]
    then
	umount $usr
	echo "fsck.mfs / - $root"
	intr fsck.mfs $fsckopts $root
	echo "fsck.mfs /usr - $usr"
	intr fsck.mfs $fsckopts $usr
	if [ ! -z "$home" ]
	then	echo "fsck.mfs /home - $home"
		intr fsck.mfs $fsckopts $home
	fi
	mount $bin_img $usr /usr
    fi

    # Edit settings for boot system services
    if [ "`sysenv skip_boot_config`" != 1 ]
    then
	edit rs
	edit vm
	edit pm
	edit sched
	edit vfs
	edit ds
	edit tty
	edit memory
	edit -p log
	edit -c pfs
	edit init
    fi

    if [ ! -z "$home" ]
    then mount $bin_img $home /home || echo "WARNING: couldn't mount $home on /home"
    fi

    # This file is necessary for above 'shutdown -C' check.
    # (Silence stderr in case of running from cd.)
    touch /usr/adm/wtmp 2>/dev/null

    if [ "$sflag" ]
    then
	echo "Single user."
	intr sh
    fi

    case "`printroot -r`":$bootcd in
    /dev/ram:)
	# Remove boot-only things to make space,
	# unless booting from CD, in which case we need them.
	rm -rf /boot
	# put the compiler on ram
	cp /usr/lib/em* /usr/lib/cpp* /lib
    esac

    # Things should be alright now.
    ;;
down|stop)
    sync
    # Tell RS server we're going down.
    service shutdown
    ;;
esac

# Further initialization.
test -f /usr/etc/rc && sh /usr/etc/rc $action
test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action

# Any messages?
test "$action" = start -a -f /etc/issue && cat /etc/issue

exit 0
