aboutsummaryrefslogtreecommitdiffstats
path: root/chapter07/rc.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'chapter07/rc.sgml')
-rw-r--r--chapter07/rc.sgml253
1 files changed, 253 insertions, 0 deletions
diff --git a/chapter07/rc.sgml b/chapter07/rc.sgml
new file mode 100644
index 000000000..3aba51da3
--- /dev/null
+++ b/chapter07/rc.sgml
@@ -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>
+