Creating the rc script

The first main bootscript is the /etc/init.d/rc script. Create a new file /etc/init.d/rc containing the following:



#!/bin/sh
# Begin /etc/init.d/rc
#
# By Jason Pearce  - jason.pearce@linux.org
# Modified by Gerard Beekmans - gerard@linuxfromscratch.org
# print_error_msg based on ideas by Simon Perreault - nomis80@yahoo.com

source /etc/init.d/functions

print_error_msg()
{

        echo
        $FAILURE
        echo -n "You should not read this error message. It means "
        echo "that an unforseen error "
        echo -n "took place and subscript $i exited with "
        echo "a return value "
        echo -n "of $error_value for an unknown reason. If you're able "
        echo "to trace this error down "
        echo -n "to a bug in one of the files provided by this book, "
        echo "please be so kind to "
        echo -n "inform us at lfs-discuss@linuxfromscratch.org"
        $NORMAL
        echo
}


# Un-comment the following for debugging.
# debug=echo

#
# Start script or program.

startup() {
case "$1" in
        *.sh)
                $debug sh "$@"
                ;;
        *)
                $debug "$@"
                ;;
esac
}   

# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
trap ":" INT QUIT TSTP

# Set onlcr to avoid staircase effect.
stty onlcr 0>&1

# Now find out what the current and what the previous runlevel are.
runlevel=$RUNLEVEL
# Get first argument. Set new runlevel to this argument.

[ "$1" != "" ] && runlevel=$1
if [ "$runlevel" = "" ]
then
        echo "Usage: $0 <runlevel>" >&2
        exit 1
fi

previous=$PREVLEVEL
[ "$previous" = "" ] && previous=N

export runlevel previous

# Is there an rc directory for this new runlevel?

if [ -d /etc/rc$runlevel.d ]
then
        # First, run the KILL scripts for this runlevel.
        if [ $previous != N ]
        then
                for i in /etc/rc$runlevel.d/K*
                do
                [ ! -f $i ] && continue

                        suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9]}
                        previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
                        sysinit_start=/etc/rcS.d/S[0-9][0-9]$suffix

                        # Stop the service if there is a start script
                        # in the previous run level.
                        [ ! -f $previous_start ] && 
                        [ ! -f $sysinit_start ] && continue

                        startup $i stop
                        error_value=$?
                        if [ $error_value != 0 ]
                        then
                                print_error_msg 
                        fi

                done
        fi

        # Now run the START scripts for this runlevel.
        for i in /etc/rc$runlevel.d/S*
        do
                [ ! -f $i ] && continue

                if [ $previous != N ]
        then
                        # Find start script in previous runlevel and
                        # stop script in this runlevel.
                        suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
                        stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
                        previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix

                        # If there is a start script in the previous
                        # level
                        # and _no_ stop script in this level, we don't
                        # have to re-start the service.
                        [ -f $previous_start ] && [ ! -f $stop ] && 
                        continue
                fi

                case "$runlevel" in
                        0|6)
                                startup $i stop
                                error_value=$?
                                if [ $error_value != 0 ]
                                then
                                        print_error_msg
                                fi
                                ;;
                        *)
                                startup $i start
                                error_value=$?
                                if [ $error_value != 0 ]
                                then
                                        print_error_msg
                                fi
                                ;;
                esac
        done
fi

# End /etc/init.d/rc