# /etc/rc - System startup script run by init before going multiuser. # Are we booting from CD? bootcd="`/bin/sysenv bootcd`" exec >/dev/log exec 2>/dev/log exec &2 "Usage: $0 [-saf] autoboot|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 /service/$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 /service or /usr/pkg/service binlocation=/service/$service if [ ! -x $binlocation ] then binlocation=/usr/pkg/service/$service fi # Mostly to find init... if [ ! -x $binlocation ] then binlocation=/sbin/$service fi service $opt edit $binlocation -label $service "$@" } while getopts 'saf' opt do case $opt in s) sflag=t ;; # Single user a) aflag=t ;; # Ask for /usr f) fflag=-f ;; # Force a full file system check *) usage esac done shift `expr $OPTIND - 1` case "$#:$1" in 1:start|1:stop|1:down|1:autoboot) action=$1 ;; *) usage esac case $action in autoboot|start) # If booting from CD, we want some directories to be ramdisks if [ ! -z "$bootcd" ] then . /etc/rc.cd fi # National keyboard? test -f /etc/keymap && loadkeys /etc/keymap # options for fsck. default is -r, which prompts the user for repairs. optname=fsckopts fsckopts=-p if sysenv $optname >/dev/null then fsckopts="`sysenv $optname`" fi if [ "`sysenv debug_fkeys`" != 0 ] then up -n is -period 5HZ fi # Set timezone. export TZ=GMT0 if [ -f "$RC_TZ" ] then . "$RC_TZ" fi # Start real time clock driver & set system time, otherwise default date. up readclock.drv readclock -q || date 201301010000 # We are not shutting down. if [ -f /etc/nologin ] then rm -f /etc/nologin fi # Use MFS binary only from kernel image? if [ "`sysenv bin_img`" = 1 ] then bin_img="-i " fi # fsck + mount using /etc/fstab. fsck -x / $fflag $fsckopts mount -a # Unmount and free now defunct ramdisk umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk" ramdisk 0 /dev/imgrd || echo "Failed to free boot ramdisk" # Initialize files. >/var/run/utmp # /etc/utmp keeps track of logins >/var/run/utmpx # /etc/utmpx keeps track of logins # 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 pfs edit init # # Keep a copy around to recover the root FS from crashes # rootline=`cat /etc/mtab | grep "on / "` rootfs=fs_`echo "$rootline" | cut -d' ' -f1 | cut -d'/' -f3` roottype=`echo "$rootline" | cut -d' ' -f5` service -c edit /service/$roottype -label $rootfs fi if [ "$sflag" ] then echo "Single user. Press ^D to resume multiuser startup." intr sh echo fi echo "Multiuser startup in progress ..." 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 echo -n "Starting hotplugging infrastructure... " rm -f /var/run/devmand.pid devmand -d /etc/devmand -d /usr/pkg/etc/devmand & echo "done." # Things should be alright now. ;; down|stop) sync if [ -f /var/run/devmand.pid ] then kill -INT `cat /var/run/devmand.pid` # without this delay the following will # be printed in the console # RS: devman not running? sleep 1 fi # # usbd needs to be stopped exactly # at this stage(before stopping devman # and after stopping the services # stated by devmand) if [ -x /usr/pkg/etc/rc.d/usbd ] then /usr/pkg/etc/rc.d/usbd stop fi if [ -x /service/usbd ] then service down usbd fi # 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? if [ "$action" = start -o "$action" = autoboot ] then if [ -f /etc/issue ] then cat /etc/issue fi fi exit 0