Index: chapter07/rc.sgml
===================================================================
--- chapter07/rc.sgml	(revision 6370fa6cff0ec2a8ac8d50d1595ec9500f6631c9)
+++ chapter07/rc.sgml	(revision 6370fa6cff0ec2a8ac8d50d1595ec9500f6631c9)
@@ -0,0 +1,253 @@
+<sect1 id="ch07-rc">
+<title>Creating the rc script</title>
+
+<para>
+The first main bootscript is the <filename>/etc/init.d/rc</filename> script. 
+Create a new file <filename>/etc/init.d/rc</filename> containing the
+following: </para>
+
+<literallayout>
+
+<userinput>cat &gt; rc &lt;&lt; "EOF"</userinput>
+#!/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
+
+#
+# Include the functions declared in the /etc/init.d/functions file
+#
+
+source /etc/init.d/functions
+
+#
+# The print_error_msg function prints an error message when an unforseen
+# error occured that wasn't trapped for some reason by a evaluate_retval
+# call or error checking in different ways.
+
+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
+        echo
+        echo "Press a key to continue..."
+        read
+}
+
+#
+# If you uncomment the debug variable below none of the scripts will be
+# executed, just the script name and parameters will be echo'ed to the
+# screen so you can see how the scripts are called by rc.
+#
+
+# Un-comment the following for debugging.
+# debug=echo
+
+#
+# Start script or program.
+# 
+startup() {
+
+$debug $*
+
+}   
+
+#
+# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
+#
+
+trap ":" INT QUIT TSTP
+
+#
+# Now find out what the current and what the previous runlevel are. The
+# $RUNLEVEL variable is set by init for all it's children. This script
+# runs as a child of init.
+#
+
+runlevel=$RUNLEVEL
+
+#
+# Get first argument. Set new runlevel to this argument. If no runlevel
+# was passed to this script we won't change runlevels.
+#
+
+[ "$1" != "" ] && runlevel=$1
+if [ "$runlevel" = "" ]
+then
+        echo "Usage: $0 &lt;runlevel&gt;" &gt;&2
+        exit 1
+fi
+
+#
+# The same goes for $PREVLEVEL (see above for $RUNLEVEL). previous will
+# be set to the previous run level. If $PREVLEVEL is not set it means
+# that there is no previous runlevel and we'll set previous to N.
+#
+
+previous=$PREVLEVEL
+[ "$previous" = "" ] && previous=N
+
+export runlevel previous
+
+#
+# Is there an rc directory for the new runlevel?
+#
+
+if [ -d /etc/rc$runlevel.d ]
+
+then
+
+#
+# If so, first collect all the K* scripts in the new run level.
+#
+
+        if [ $previous != N ]
+        then
+                for i in /etc/rc$runlevel.d/K*
+                do
+                [ ! -f $i ] && continue
+
+#
+# the suffix variable will contain the script name without the leading
+# Kxxx
+#
+
+                        suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9][0-9]}
+#
+# If there is a start script for this K script in the previous runlevel
+# determine what it's full path is
+#
+            previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
+#
+# If there was no previous run level it could be that something was
+# started in rcS.d (sysinit level) so we'll determine the path for that
+# possibility as well.
+#
+
+                        sysinit_start=/etc/rcS.d/S[0-9][0-9][0-9]$suffix
+
+#
+# Stop the service if there is a start script in the previous run level 
+# or in the sysinit level. If previous_start or sysinit_start do not 
+# exist the 'continue' command is run which causes the script to abort
+# this iteration of the for loop and continue with the next iteration.
+# This boils down to that it won't run the commands after the next two
+# lines and start over from the top of this for loop. See man bash for
+# more info on this.
+#
+
+                        [ ! -f $previous_start ] && 
+                        [ ! -f $sysinit_start ] && continue
+
+#
+# If we found previous_start or sysinit_start, run the K script
+#
+
+                        startup $i stop
+                        error_value=$?
+#
+# If the return value of the script is not 0, something went wrong with
+# error checking inside the script. the print_error_msg function will be
+# called and the message plus the return value of the K script will be
+# printed to the screen
+
+#
+
+                        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][0-9]}
+                        stop=/etc/rc$runlevel.d/K[0-9][0-9][0-9]$suffix
+                previous_start=/etc/rc$previous.d/S[0-9][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; abort this
+# iteration and start the next one.
+#
+
+                        [ -f $previous_start ] && [ ! -f $stop ] && 
+                        continue
+                fi
+
+                case "$runlevel" in
+                        0|6)
+
+#
+# levels 0 and 6 are halt and reboot levels. We don't really start
+# anything here so we call with the 'stop' parameter
+#
+
+                                startup $i stop
+                                error_value=$?
+#
+# If the return value of the script is not 0, something went wrong with
+# error checking inside the script. the print_error_msg function will be
+# called and the message plus the return value of the K script will be
+# printed to the screen
+#
+
+                                if [ $error_value != 0 ]
+                                then
+                                        print_error_msg
+                                fi
+                                ;;
+                        *)
+                                startup $i start
+                                error_value=$?
+#
+# If the return value of the script is not 0, something went wrong with
+# error checking inside the script. the print_error_msg function will be
+# called and the message plus the return value of the K script will be
+# printed to the screen
+#
+
+                                if [ $error_value != 0 ]
+                                then
+                                        print_error_msg
+                                fi
+                                ;;
+                esac
+        done
+fi
+
+# End /etc/init.d/rc
+<userinput>EOF</userinput>
+
+</literallayout>
+
+</sect1>
+
