Forráskód Böngészése

Moved bootscripts and udev-config to BOOK
Updated Makefile to automatically generate bootscript and udev-config tarballs
Updated licesnse to be the same as BLFS

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@8548 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

Bruce Dubbs 16 éve
szülő
commit
1c4800743d
98 módosított fájl, 9113 hozzáadás és 57 törlés
  1. 10 2
      Makefile
  2. 403 0
      appendices/creat-comm.xml
  3. 25 0
      appendices/license.xml
  4. 33 0
      appendices/mit-lic.xml
  5. 195 0
      appendices/scripts.xml
  6. 38 0
      aux-file-data.sh
  7. 927 0
      bootscripts/ChangeLog
  8. 29 0
      bootscripts/LICENSE
  9. 134 0
      bootscripts/Makefile
  10. 79 0
      bootscripts/README
  11. 26 0
      bootscripts/contrib/lsb-v3/ChangeLog
  12. 32 0
      bootscripts/contrib/lsb-v3/INSTALL
  13. 134 0
      bootscripts/contrib/lsb-v3/Makefile
  14. 105 0
      bootscripts/contrib/lsb-v3/README
  15. 8 0
      bootscripts/contrib/lsb-v3/etc/lsb-config
  16. 105 0
      bootscripts/contrib/lsb-v3/init.d/checkfs
  17. 113 0
      bootscripts/contrib/lsb-v3/init.d/cleanfs
  18. 111 0
      bootscripts/contrib/lsb-v3/init.d/console
  19. 32 0
      bootscripts/contrib/lsb-v3/init.d/halt
  20. 215 0
      bootscripts/contrib/lsb-v3/init.d/lfs-functions
  21. 84 0
      bootscripts/contrib/lsb-v3/init.d/localnet
  22. 99 0
      bootscripts/contrib/lsb-v3/init.d/modules
  23. 60 0
      bootscripts/contrib/lsb-v3/init.d/mountfs
  24. 45 0
      bootscripts/contrib/lsb-v3/init.d/mountkernfs
  25. 74 0
      bootscripts/contrib/lsb-v3/init.d/network
  26. 193 0
      bootscripts/contrib/lsb-v3/init.d/rc
  27. 34 0
      bootscripts/contrib/lsb-v3/init.d/reboot
  28. 49 0
      bootscripts/contrib/lsb-v3/init.d/sendsignals
  29. 61 0
      bootscripts/contrib/lsb-v3/init.d/setclock
  30. 57 0
      bootscripts/contrib/lsb-v3/init.d/swap
  31. 41 0
      bootscripts/contrib/lsb-v3/init.d/sysctl
  32. 71 0
      bootscripts/contrib/lsb-v3/init.d/sysklogd
  33. 92 0
      bootscripts/contrib/lsb-v3/init.d/template
  34. 81 0
      bootscripts/contrib/lsb-v3/init.d/udev
  35. 51 0
      bootscripts/contrib/lsb-v3/init.d/udev_retry
  36. 577 0
      bootscripts/contrib/lsb-v3/lsb/init-functions
  37. 306 0
      bootscripts/contrib/lsb-v3/lsb/manage-functions
  38. 28 0
      bootscripts/contrib/lsb-v3/sysconfig/createfiles
  39. 18 0
      bootscripts/contrib/lsb-v3/sysconfig/modules
  40. 93 0
      bootscripts/contrib/lsb-v3/sysconfig/network-devices/ifdown
  41. 87 0
      bootscripts/contrib/lsb-v3/sysconfig/network-devices/ifup
  42. 80 0
      bootscripts/contrib/lsb-v3/sysconfig/network-devices/services/ipv4-static
  43. 92 0
      bootscripts/contrib/lsb-v3/sysconfig/network-devices/services/ipv4-static-route
  44. 52 0
      bootscripts/contrib/lsb-v3/sysconfig/rc
  45. 69 0
      bootscripts/contrib/lsb-v3/sysconfig/rc.site
  46. 11 0
      bootscripts/contrib/lsb/Makefile
  47. 348 0
      bootscripts/contrib/lsb/lib/init-functions
  48. 45 0
      bootscripts/contrib/sysconfig/network-devices/services/mtu
  49. 131 0
      bootscripts/lfs/init.d/checkfs
  50. 110 0
      bootscripts/lfs/init.d/cleanfs
  51. 109 0
      bootscripts/lfs/init.d/console
  52. 61 0
      bootscripts/lfs/init.d/consolelog
  53. 769 0
      bootscripts/lfs/init.d/functions
  54. 28 0
      bootscripts/lfs/init.d/halt
  55. 54 0
      bootscripts/lfs/init.d/localnet
  56. 72 0
      bootscripts/lfs/init.d/modules
  57. 54 0
      bootscripts/lfs/init.d/mountfs
  58. 44 0
      bootscripts/lfs/init.d/mountkernfs
  59. 73 0
      bootscripts/lfs/init.d/network
  60. 99 0
      bootscripts/lfs/init.d/rc
  61. 31 0
      bootscripts/lfs/init.d/reboot
  62. 52 0
      bootscripts/lfs/init.d/sendsignals
  63. 49 0
      bootscripts/lfs/init.d/setclock
  64. 50 0
      bootscripts/lfs/init.d/swap
  65. 39 0
      bootscripts/lfs/init.d/sysctl
  66. 57 0
      bootscripts/lfs/init.d/sysklogd
  67. 50 0
      bootscripts/lfs/init.d/template
  68. 77 0
      bootscripts/lfs/init.d/udev
  69. 45 0
      bootscripts/lfs/init.d/udev_retry
  70. 28 0
      bootscripts/lfs/sysconfig/createfiles
  71. 18 0
      bootscripts/lfs/sysconfig/modules
  72. 95 0
      bootscripts/lfs/sysconfig/network-devices/ifdown
  73. 89 0
      bootscripts/lfs/sysconfig/network-devices/ifup
  74. 82 0
      bootscripts/lfs/sysconfig/network-devices/services/ipv4-static
  75. 97 0
      bootscripts/lfs/sysconfig/network-devices/services/ipv4-static-route
  76. 18 0
      bootscripts/lfs/sysconfig/rc
  77. 29 13
      chapter01/changelog.xml
  78. 3 2
      general.ent
  79. 2 0
      index.xml
  80. 22 0
      make-aux-files.sh
  81. 7 7
      packages.ent
  82. 22 0
      process-scripts.sh
  83. 7 33
      prologue/bookinfo.xml
  84. 101 0
      udev-config/55-lfs.rules
  85. 3 0
      udev-config/61-cdrom.rules
  86. 199 0
      udev-config/ChangeLog
  87. 42 0
      udev-config/Makefile
  88. 3 0
      udev-config/contrib/debian/81-cdrom.rules
  89. 12 0
      udev-config/contrib/debian/83-cdrom-symlinks.rules
  90. 111 0
      udev-config/contrib/debian/write_cd_aliases
  91. 33 0
      udev-config/doc/05-udev-early.txt
  92. 94 0
      udev-config/doc/55-lfs.txt
  93. 86 0
      udev-config/doc/60-persistent-input.txt
  94. 95 0
      udev-config/doc/60-persistent-storage.txt
  95. 16 0
      udev-config/doc/61-cdrom.txt
  96. 69 0
      udev-config/doc/80-drivers.txt
  97. 18 0
      udev-config/doc/95-udev-late.txt
  98. 6 0
      udev-config/doc/README

+ 10 - 2
Makefile

@@ -12,7 +12,7 @@ else
   Q = @
 endif
 
-lfs: validxml profile-html
+lfs: maketar validxml profile-html
 	@echo "Generating chunked XHTML files..."
 	$(Q)xsltproc --nonet -stringparam chunk.quietly $(CHUNK_QUIET) \
 	  -stringparam rootid "$(ROOT_ID)" -stringparam base.dir $(BASEDIR)/ \
@@ -78,9 +78,17 @@ tmpdir:
 	$(Q)rm -f $(RENDERTMP)/lfs-pdf.fo
 
 validxml: tmpdir
+	@echo "Processing bootscripts..."
+	$(Q)sh process-scripts.sh $(RENDERTMP)
 	@echo "Validating the book..."
 	$(Q)xmllint --nonet --noent --xinclude --postvalid \
 	  -o $(RENDERTMP)/lfs-full.xml index.xml
+	$(Q)rm -f appendices/*.script
+	$(Q)sh aux-file-data.sh $(RENDERTMP)/lfs-full.xml
+
+maketar:
+	@echo "Making tarballs..."
+	$(Q)sh make-aux-files.sh $(RENDERTMP)
 
 profile-html: validxml
 	@echo "Generating profiled XML for XHTML..."
@@ -106,4 +114,4 @@ validate:
 all: lfs nochunks pdf dump-commands
 
 .PHONY : all dump-commands lfs nochunks pdf profile-html tmpdir validate \
-	 validxml wget-list
+	 validxml wget-list maketar

+ 403 - 0
appendices/creat-comm.xml

@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+   "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+  <!ENTITY % general-entities SYSTEM "../general.ent">
+  %general-entities;
+]>
+
+<sect1 id="CC" xreflabel="Creative Commons License">
+  <?dbhtml filename="creat-comm.html"?>
+
+  <title>Creative Commons License</title>
+
+  <para role='title'>Creative Commons Legal Code</para>
+
+  <para role='title'>Attribution-NonCommercial-ShareAlike 2.0</para>
+
+  <important>
+    <para>CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT
+    PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN
+    "AS-IS" BASIS.  CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION
+    PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS
+    USE.</para>
+  </important>
+
+  <para role='title'>License</para>
+
+  <para>THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+  COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+  COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+  AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.</para>
+
+  <para>BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
+  BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS
+  CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+  CONDITIONS.</para>
+
+  <orderedlist>
+    <?dbfo label-width="1.5em"?>
+    <listitem>
+      <para>Definitions</para>
+
+      <orderedlist>
+        <listitem>
+          <para>"Collective Work" means a work, such as a periodical issue, anthology or
+          encyclopedia, in which the Work in its entirety in unmodified form, along
+          with a number of other contributions, constituting separate and independent
+          works in themselves, are assembled into a collective whole. A work that
+          constitutes a Collective Work will not be considered a Derivative Work (as
+          defined below) for the purposes of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>"Derivative Work" means a work based upon the Work or upon
+          the Work and other pre-existing works, such as a translation, musical
+          arrangement, dramatization, fictionalization, motion picture version, sound
+          recording, art reproduction, abridgment, condensation, or any other form in
+          which the Work may be recast, transformed, or adapted, except that a work
+          that constitutes a Collective Work will not be considered a Derivative Work
+          for the purpose of this License. For the avoidance of doubt, where the Work
+          is a musical composition or sound recording, the synchronization of the Work
+          in timed-relation with a moving image ("synching") will be considered a
+          Derivative Work for the purpose of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>"Licensor" means the individual or entity that offers the
+          Work under the terms of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>"Original Author" means the individual or entity who created
+          the Work.</para>
+        </listitem>
+
+        <listitem>
+          <para>"Work" means the copyrightable work of authorship offered
+          under the terms of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>"You" means an individual or entity exercising rights under
+          this License who has not previously violated the terms of this License with
+          respect to the Work, or who has received express permission from the
+          Licensor to exercise rights under this License despite a previous
+          violation.</para>
+        </listitem>
+
+        <listitem>
+          <para>"License Elements" means the following high-level license
+          attributes as selected by Licensor and indicated in the title of this
+          License: Attribution, Noncommercial, ShareAlike.</para>
+        </listitem>
+
+      </orderedlist>
+    </listitem>
+
+    <listitem>
+      <para>Fair Use Rights. Nothing in this license is intended to reduce,
+      limit, or restrict any rights arising from fair use, first sale or other
+      limitations on the exclusive rights of the copyright owner under copyright law
+      or other applicable laws.</para>
+    </listitem>
+
+
+    <listitem>
+      <para>License Grant. Subject to the terms and conditions of this
+      License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+      perpetual (for the duration of the applicable copyright) license to exercise
+      the rights in the Work as stated below:</para>
+
+      <orderedlist>
+
+        <listitem>
+          <para>to reproduce the Work, to incorporate the Work into one or
+          more Collective Works, and to reproduce the Work as incorporated in the
+          Collective Works;</para>
+        </listitem>
+
+        <listitem>
+          <para>to create and reproduce Derivative Works;</para>
+        </listitem>
+
+        <listitem>
+          <para>to distribute copies or phonorecords of, display publicly,
+          perform publicly, and perform publicly by means of a digital audio
+          transmission the Work including as incorporated in Collective
+          Works;</para>
+        </listitem>
+
+        <listitem>
+          <para>to distribute copies or phonorecords of, display publicly,
+          perform publicly, and perform publicly by means of a digital audio
+          transmission Derivative Works;</para>
+        </listitem>
+
+      </orderedlist>
+
+      <para>The above rights may be exercised in all media and formats whether now
+      known or hereafter devised. The above rights include the right to make such
+      modifications as are technically necessary to exercise the rights in other
+      media and formats. All rights not expressly granted by Licensor are hereby
+      reserved, including but not limited to the rights set forth in Sections 4(e)
+      and 4(f).</para>
+    </listitem>
+
+    <listitem>
+      <para>Restrictions.The license granted in Section 3 above is
+      expressly made subject to and limited by the following
+      restrictions:</para>
+
+      <orderedlist>
+
+        <listitem>
+          <para>You may distribute, publicly display, publicly perform, or
+          publicly digitally perform the Work only under the terms of this License, and
+          You must include a copy of, or the Uniform Resource Identifier for, this
+          License with every copy or phonorecord of the Work You distribute, publicly
+          display, publicly perform, or publicly digitally perform. You may not offer
+          or impose any terms on the Work that alter or restrict the terms of this
+          License or the recipients' exercise of the rights granted hereunder. You may
+          not sublicense the Work. You must keep intact all notices that refer to this
+          License and to the disclaimer of warranties. You may not distribute, publicly
+          display, publicly perform, or publicly digitally perform the Work with any
+          technological measures that control access or use of the Work in a manner
+          inconsistent with the terms of this License Agreement. The above applies to
+          the Work as incorporated in a Collective Work, but this does not require the
+          Collective Work apart from the Work itself to be made subject to the terms of
+          this License. If You create a Collective Work, upon notice from any Licensor
+          You must, to the extent practicable, remove from the Collective Work any
+          reference to such Licensor or the Original Author, as requested. If You
+          create a Derivative Work, upon notice from any Licensor You must, to the
+          extent practicable, remove from the Derivative Work any reference to such
+          Licensor or the Original Author, as requested.</para>
+        </listitem>
+
+        <listitem>
+          <para>You may distribute, publicly display, publicly perform, or
+          publicly digitally perform a Derivative Work only under the terms of this
+          License, a later version of this License with the same License Elements as
+          this License, or a Creative Commons iCommons license that contains the same
+          License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike
+          2.0 Japan). You must include a copy of, or the Uniform Resource Identifier
+          for, this License or other license specified in the previous sentence with
+          every copy or phonorecord of each Derivative Work You distribute, publicly
+          display, publicly perform, or publicly digitally perform. You may not offer
+          or impose any terms on the Derivative Works that alter or restrict the terms
+          of this License or the recipients' exercise of the rights granted hereunder,
+          and You must keep intact all notices that refer to this License and to the
+          disclaimer of warranties. You may not distribute, publicly display, publicly
+          perform, or publicly digitally perform the Derivative Work with any
+          technological measures that control access or use of the Work in a manner
+          inconsistent with the terms of this License Agreement. The above applies to
+          the Derivative Work as incorporated in a Collective Work, but this does not
+          require the Collective Work apart from the Derivative Work itself to be made
+          subject to the terms of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>You may not exercise any of the rights granted to You in
+          Section 3 above in any manner that is primarily intended for or directed
+          toward commercial advantage or private monetary compensation. The exchange of
+          the Work for other copyrighted works by means of digital file-sharing or
+          otherwise shall not be considered to be intended for or directed toward
+          commercial advantage or private monetary compensation, provided there is no
+          payment of any monetary compensation in connection with the exchange of
+          copyrighted works.</para>
+        </listitem>
+
+        <listitem>
+          <para>If you distribute, publicly display, publicly perform, or
+          publicly digitally perform the Work or any Derivative Works or Collective
+          Works, You must keep intact all copyright notices for the Work and give the
+          Original Author credit reasonable to the medium or means You are utilizing by
+          conveying the name (or pseudonym if applicable) of the Original Author if
+          supplied; the title of the Work if supplied; to the extent reasonably
+          practicable, the Uniform Resource Identifier, if any, that Licensor specifies
+          to be associated with the Work, unless such URI does not refer to the
+          copyright notice or licensing information for the Work; and in the case of a
+          Derivative Work, a credit identifying the use of the Work in the Derivative
+          Work (e.g., "French translation of the Work by Original Author," or
+          "Screenplay based on original Work by Original Author"). Such credit may be
+          implemented in any reasonable manner; provided, however, that in the case of
+          a Derivative Work or Collective Work, at a minimum such credit will appear
+          where any other comparable authorship credit appears and in a manner at least
+          as prominent as such other comparable authorship credit.</para>
+        </listitem>
+
+
+        <listitem>
+          <para>For the avoidance of doubt, where the Work is a musical
+          composition:</para>
+
+          <orderedlist>
+
+            <listitem>
+              <para>Performance Royalties Under Blanket Licenses. Licensor
+              reserves the exclusive right to collect, whether individually or via a
+              performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the
+              public performance or public digital performance (e.g. webcast) of the
+              Work if that performance is primarily intended for or directed toward
+              commercial advantage or private monetary compensation.</para>
+            </listitem>
+
+            <listitem>
+              <para>Mechanical Rights and Statutory Royalties. Licensor
+              reserves the exclusive right to collect, whether individually or via a
+              music rights agency or designated agent (e.g. Harry Fox Agency),
+              royalties    for any phonorecord You create from the Work ("cover
+              version") and distribute, subject to the compulsory license created
+              by 17 USC Section 115 of the US Copyright Act (or the equivalent in
+              other jurisdictions), if Your distribution of such cover version is primarily
+              intended for or directed toward commercial advantage or private monetary
+              compensation.  6. Webcasting Rights and Statutory Royalties.  For the
+              avoidance of doubt, where the Work is a sound recording, Licensor
+              reserves the exclusive right to collect, whether individually or via a
+              performance-rights society (e.g. SoundExchange), royalties for the public
+              digital performance (e.g. webcast) of the Work, subject to the compulsory
+              license created by 17 USC Section 114 of the US Copyright Act (or the
+              equivalent in other jurisdictions), if Your public digital performance is
+              primarily intended for or directed toward commercial advantage or private
+              monetary compensation.</para>
+            </listitem>
+
+          </orderedlist>
+        </listitem>
+
+        <listitem>
+          <para>Webcasting Rights and Statutory Royalties. For the
+          avoidance of doubt, where the Work is a sound recording, Licensor reserves
+          the exclusive right to collect, whether individually or via a
+          performance-rights society (e.g.  SoundExchange), royalties for the public
+          digital performance (e.g. webcast) of the Work, subject to the compulsory
+          license created by 17 USC Section 114 of the US Copyright Act (or the
+          equivalent in other jurisdictions), if Your public digital performance is
+          primarily intended for or directed toward commercial advantage or private
+          monetary compensation.</para>
+        </listitem>
+
+      </orderedlist>
+    </listitem>
+
+    <listitem>
+      <para>Representations, Warranties and Disclaimer</para>
+
+      <para>UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+      OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
+      CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING,
+      WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A
+      PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
+      ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
+      SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH
+      EXCLUSION MAY NOT APPLY TO YOU.</para>
+    </listitem>
+
+    <listitem>
+      <para>Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
+      APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY
+      FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
+      ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN
+      ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</para>
+    </listitem>
+
+    <listitem>
+      <para>Termination</para>
+
+      <orderedlist>
+
+        <listitem>
+          <para>This License and the rights granted hereunder will terminate
+          automatically upon any breach by You of the terms of this License.
+          Individuals or entities who have received Derivative Works or Collective
+          Works from You under this License, however, will not have their licenses
+          terminated provided such individuals or entities remain in full compliance
+          with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any
+          termination of this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>Subject to the above terms and conditions, the license
+          granted here is perpetual (for the duration of the applicable copyright in
+          the Work).  Notwithstanding the above, Licensor reserves the right to release
+          the Work under different license terms or to stop distributing the Work at
+          any time; provided, however that any such election will not serve to withdraw
+          this License (or any other license that has been, or is required to be,
+          granted under the terms of this License), and this License will continue in
+          full force and effect unless terminated as stated above.</para>
+        </listitem>
+
+      </orderedlist>
+    </listitem>
+
+    <listitem>
+      <para>Miscellaneous</para>
+
+      <orderedlist>
+
+        <listitem>
+          <para>Each time You distribute or publicly digitally perform the
+          Work or a Collective Work, the Licensor offers to the recipient a license to
+          the Work on the same terms and conditions as the license granted to You under
+          this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>Each time You distribute or publicly digitally perform a
+          Derivative Work, Licensor offers to the recipient a license to the original
+          Work on the same terms and conditions as the license granted to You under
+          this License.</para>
+        </listitem>
+
+        <listitem>
+          <para>If any provision of this License is invalid or unenforceable
+          under applicable law, it shall not affect the validity or enforceability of
+          the remainder of the terms of this License, and without further action by the
+          parties to this agreement, such provision shall be reformed to the minimum
+          extent necessary to make such provision valid and
+          enforceable.</para>
+        </listitem>
+
+        <listitem>
+          <para>No term or provision of this License shall be deemed waived
+          and no breach consented to unless such waiver or consent shall be in writing
+          and signed by the party to be charged with such waiver or
+          consent.</para>
+        </listitem>
+
+        <listitem>
+          <para>This License constitutes the entire agreement between the
+          parties with respect to the Work licensed here. There are no understandings,
+          agreements or representations with respect to the Work not specified here.
+          Licensor shall not be bound by any additional provisions that may appear in
+          any communication from You. This License may not be modified without the
+          mutual written agreement of the Licensor and You.</para>
+        </listitem>
+
+
+      </orderedlist>
+    </listitem>
+  </orderedlist>
+
+  <important>
+    <para>Creative Commons is not a party to this License, and makes no warranty
+    whatsoever in connection with the Work. Creative Commons will not be liable to
+    You or any party on any legal theory for any damages whatsoever, including
+    without limitation any general, special, incidental or consequential damages
+    arising in connection to this license. Notwithstanding the foregoing two (2)
+    sentences, if Creative Commons has expressly identified itself as the Licensor
+    hereunder, it shall have all rights and obligations of Licensor.</para>
+
+    <para>Except for the limited purpose of indicating to the public that the Work is
+    licensed under the CCPL, neither party will use the trademark "Creative
+    Commons" or any related trademark or logo of Creative Commons without the prior
+    written consent of Creative Commons. Any permitted use will be in compliance
+    with Creative Commons' then-current trademark usage guidelines, as may be
+    published on its website or otherwise made available upon request from time to
+    time.</para>
+
+    <para>Creative Commons may be contacted at <ulink url='http://creativecommons.org/' />.</para>
+  </important>
+
+
+</sect1>

+ 25 - 0
appendices/license.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+  <!ENTITY % general-entities SYSTEM "../general.ent">
+  %general-entities;
+]>
+
+<appendix id="Licenses" xreflabel="Appendix E">
+  <?dbhtml dir="appendicies"?>
+  <?dbhtml filename="licenses.html"?>
+
+  <title>LFS Licenses</title>
+
+	<para>This book is licensed under the Creative Commons
+	Attribution-NonCommercial-ShareAlike 2.0 License.</para>
+
+	<para>Computer instructions may be extracted from the book under the MIT
+	License.</para>
+
+	
+	<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="creat-comm.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="mit-lic.xml"/>
+
+
+</appendix>

+ 33 - 0
appendices/mit-lic.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+   "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+  <!ENTITY % general-entities SYSTEM "../general.ent">
+  %general-entities;
+]>
+
+<sect1 id="MIT" xreflabel="MIT License">
+  <?dbhtml filename="mit.html" ?>
+
+  <title>The MIT License</title>
+
+  <para>Copyright &copy; &copyrightdate; Gerard Beekmans</para>
+
+  <para>Permission is hereby granted, free of charge, to any person obtaining a copy
+	of this software and associated documentation files (the "Software"), to deal
+	in the Software without restriction, including without limitation the rights
+	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+	copies of the Software, and to permit persons to whom the Software is
+	furnished to do so, subject to the following conditions:</para>
+
+  <para>The above copyright notice and this permission notice shall be included in
+	all copies or substantial portions of the Software.</para>
+
+  <para>HE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+	THE SOFTWARE.</para>
+
+</sect1>

+ 195 - 0
appendices/scripts.xml

@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+  <!ENTITY % general-entities SYSTEM "../general.ent">
+  <!ENTITY checkfs            SYSTEM "checkfs.script"> 
+  <!ENTITY cleanfs            SYSTEM "cleanfs.script"> 
+  <!ENTITY console            SYSTEM "console.script"> 
+  <!ENTITY functions          SYSTEM "functions.script"> 
+  <!ENTITY consolelog         SYSTEM "consolelog.script"> 
+  <!ENTITY halt               SYSTEM "halt.script"> 
+  <!ENTITY localnet           SYSTEM "localnet.script"> 
+  <!ENTITY modules            SYSTEM "modules.script"> 
+  <!ENTITY mountfs            SYSTEM "mountfs.script"> 
+  <!ENTITY mountkernfs        SYSTEM "mountkernfs.script"> 
+  <!ENTITY network            SYSTEM "network.script"> 
+  <!ENTITY reboot             SYSTEM "reboot.script"> 
+  <!ENTITY rc                 SYSTEM "rc.script"> 
+  <!ENTITY sendsignals        SYSTEM "sendsignals.script"> 
+  <!ENTITY setclock           SYSTEM "setclock.script"> 
+  <!ENTITY swap               SYSTEM "swap.script"> 
+  <!ENTITY sysctl             SYSTEM "sysctl.script"> 
+  <!ENTITY sysklogd           SYSTEM "sysklogd.script"> 
+  <!ENTITY template           SYSTEM "template.script"> 
+  <!ENTITY udev               SYSTEM "udev.script"> 
+  <!ENTITY udev_retry         SYSTEM "udev_retry.script"> 
+  <!ENTITY createfiles        SYSTEM "createfiles.script"> 
+  <!ENTITY modules_sys        SYSTEM "modules-sysinit.script"> 
+  <!ENTITY rc_sys             SYSTEM "rc-sysinit.script"> 
+  <!ENTITY ifup               SYSTEM "ifup.script"> 
+  <!ENTITY ifdown             SYSTEM "ifdown.script"> 
+  <!ENTITY ipv4_static        SYSTEM "ipv4-static.script"> 
+  <!ENTITY ipv4_static_route  SYSTEM "ipv4-static-route.script"> 
+  %general-entities;
+]>
+
+<appendix id="scripts" xreflabel="Appendix D">
+  <?dbhtml dir="scripts"?>
+  <?dbhtml filename="scripts.html"?>
+
+  <title>Boot and sysconfig scripts version-&lfs-bootscripts-version;</title>
+
+	<para>The scripts in this appendix are listed by the directory where they
+	normally reside.  The order is <filename
+	class='directory'>/etc/rc.d/init.d</filename>, <filename
+	class='directory'>/etc/sysconfig</filename>, <filename
+	class='directory'>/etc/sysconfig/network-devices</filename>, and <filename
+	class='directory'>/etc/sysconfig/network-devices/services</filename>.  Within
+	each section, the files are listed in the order they are normally called.
+	</para>
+
+  <sect1 id="rc" role="wrap">
+    <title>/etc/rc.d/init.d/rc</title>
+
+    <para>The <systemitem>rc</systemitem> script is the first script called by 
+    <application>init</application> and initiates the boot process.</para>
+
+    <screen>&rc;</screen> 
+  </sect1>
+
+  <sect1 id="functions" role="wrap">
+    <title>/etc/rc.d/init.d/functions</title>
+    <screen>&functions;</screen> 
+  </sect1>
+
+  <sect1 id="mountkernfs" role="wrap">
+    <title>/etc/rc.d/init.d/mountkernfs</title>
+    <screen>&mountkernfs;</screen> 
+  </sect1>
+
+  <sect1 id="consolelog" role="wrap">
+    <title>/etc/rc.d/init.d/consolelog</title>
+    <screen>&consolelog;</screen> 
+  </sect1>
+
+  <sect1 id="modules" role="wrap">
+    <title>/etc/rc.d/init.d/modules</title>
+    <screen>&modules;</screen> 
+  </sect1>
+
+  <sect1 id="udev" role="wrap">
+    <title>/etc/rc.d/init.d/udev</title>
+    <screen>&udev;</screen> 
+  </sect1>
+
+  <sect1 id="swap" role="wrap">
+    <title>/etc/rc.d/init.d/swap</title>
+    <screen>&swap;</screen> 
+  </sect1>
+
+  <sect1 id="setclock" role="wrap">
+    <title>/etc/rc.d/init.d/setclock</title>
+    <screen>&setclock;</screen> 
+  </sect1>
+
+  <sect1 id="checkfs" role="wrap">
+    <title>/etc/rc.d/init.d/checkfs</title>
+    <screen>&checkfs;</screen> 
+  </sect1>
+
+  <sect1 id="mountfs" role="wrap">
+    <title>/etc/rc.d/init.d/mountfs</title>
+    <screen>&mountfs;</screen> 
+  </sect1>
+
+  <sect1 id="udev_retry" role="wrap">
+    <title>/etc/rc.d/init.d/udev_retry</title>
+    <screen>&udev_retry;</screen> 
+  </sect1>
+
+  <sect1 id="cleanfs" role="wrap">
+    <title>/etc/rc.d/init.d/cleanfs</title>
+    <screen>&cleanfs;</screen> 
+  </sect1>
+
+  <sect1 id="console" role="wrap">
+    <title>/etc/rc.d/init.d/console</title>
+    <screen>&console;</screen> 
+  </sect1>
+
+  <sect1 id="localnet" role="wrap">
+    <title>/etc/rc.d/init.d/localnet</title>
+    <screen>&localnet;</screen> 
+  </sect1>
+
+  <sect1 id="sysctlscript" role="wrap">
+    <title>/etc/rc.d/init.d/sysctl</title>
+    <screen>&sysctl;</screen> 
+  </sect1>
+
+  <sect1 id="sysklogd" role="wrap">
+    <title>/etc/rc.d/init.d/sysklogd</title>
+    <screen>&sysklogd;</screen> 
+  </sect1>
+
+  <sect1 id="network" role="wrap">
+    <title>/etc/rc.d/init.d/network</title>
+    <screen>&network;</screen> 
+  </sect1>
+
+  <sect1 id="sendsignals" role="wrap">
+    <title>/etc/rc.d/init.d/sendsignals</title>
+    <screen>&sendsignals;</screen> 
+  </sect1>
+
+  <sect1 id="rebootscript" role="wrap">
+    <title>/etc/rc.d/init.d/reboot</title>
+    <screen>&reboot;</screen> 
+  </sect1>
+
+  <sect1 id="haltscript" role="wrap">
+    <title>/etc/rc.d/init.d/halt</title>
+    <screen>&halt;</screen> 
+  </sect1>
+
+  <sect1 id="template" role="wrap">
+    <title>/etc/rc.d/init.d/template</title>
+    <screen>&template;</screen> 
+  </sect1>
+
+  <sect1 id="rcsys" role="wrap">
+    <title>/etc/sysconfig/rc</title>
+    <screen>&rc_sys;</screen> 
+  </sect1>
+
+  <sect1 id="modulessys" role="wrap">
+    <title>/etc/sysconfig/modules</title>
+    <screen>&modules_sys;</screen> 
+  </sect1>
+
+  <sect1 id="createfiles" role="wrap">
+    <title>/etc/sysconfig/createfiles</title>
+    <screen>&createfiles;</screen> 
+  </sect1>
+
+  <sect1 id="ifup" role="wrap">
+    <title>/etc/sysconfig/network-devices/ifup</title>
+    <screen>&ifup;</screen> 
+  </sect1>
+
+  <sect1 id="ifdown" role="wrap">
+    <title>/etc/sysconfig/network-devices/ifdown</title>
+    <screen>&ifdown;</screen> 
+  </sect1>
+
+  <sect1 id="ipv4static" role="wrap">
+    <title>/etc/sysconfig/network-devices/services/ipv4-static</title>
+    <screen>&ipv4_static;</screen> 
+  </sect1>
+
+  <sect1 id="ipv4route" role="wrap">
+    <title>/etc/sysconfig/network-devices/services/ipv4-static-route</title>
+    <screen>&ipv4_static_route;</screen> 
+  </sect1>
+
+</appendix>

+ 38 - 0
aux-file-data.sh

@@ -0,0 +1,38 @@
+#!/bin/bash
+
+if [ $# -lt 1 ] ; then 
+  echo "This script needs the location of the xml file to update"
+  exit 1
+fi
+
+FILE=$1
+
+# Bootscript data
+bootscripts=$(ls lfs-bootscripts*.bz2)
+base=$(basename $bootscripts .tar.bz2)
+bootsize=$(ls -lk $bootscripts | cut -f5 -d" ")
+bootmd5=$(md5sum $bootscripts | cut -f1 -d" ")
+
+# Figure intalled size of bootscripts
+TOPDIR=$(pwd)
+TMP_DIR=$(mktemp -d /tmp/lfsbootfiles.XXXXXX)
+pushd $TMP_DIR > /dev/null
+tar -xf $TOPDIR/$bootscripts 
+bootinstallsize=$(du -sk $TMP_DIR | cut -f1)
+popd > /dev/null
+rm -rf $TMP_DIR
+
+sed -i -e s/BOOTSCRIPTS-SIZE/$bootsize/              \
+       -e s/BOOTSCRIPTS-INSTALL-KB/$bootinstallsize/ \
+			 -e s/BOOTSCRIPTS-MD5SUM/$bootmd5/ $FILE
+
+############
+
+# udev configuration tarball data
+udevconfig=$(ls udev-config*.bz2)
+udevsize=$(ls -lk $udevconfig | cut -f5 -d" ")
+udevmd5=$(md5sum $udevconfig | cut -f1 -d" ")
+
+sed -i -e s/UDEV-SIZE/$udevsize/ \
+       -e s/UDEV-MD5SUM/$udevmd5/ $FILE
+

+ 927 - 0
bootscripts/ChangeLog

@@ -0,0 +1,927 @@
+2008-05-21	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* lfs/init.d/udev, lfs/init.d/udev_retry: Use new udevadm program.
+
+2007-08-20	DJ Lucas <dj@linuxfromscratch.org>
+	* lfs/init.d/setclock: Added missing 'stop' argument to usage text
+
+2007-08-13	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/checkfs: Don't suppress error messages from the screen.
+
+2007-07-18	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* Makefile, lfs/init.d/consolelog: New bootscript controlling the
+	  kernel log level on the console. This is controlled by the LOGLEVEL
+	  variable in /etc/sysconfig/console.
+	* lfs/init.d/modules: Remove the log level handling since this is
+	  done in the consolelog script now.
+	* lfs/init.d/modules: Clean up the script by removing the file
+	  descriptor duplication and instead just redirecting
+	  /etc/sysconfig/modules to the input of the while loop.
+
+2007-06-16	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/mountfs, lfs/init.d/mountkernfs, lfs/init.d/setclock,
+	  lfs/init.d/modules, lfs/sysconfig/network-devices/if{up,down}:
+	  Don't suppress stderr during bootscripts unless necessary. This
+	  would prevent potentially critical messages from reaching the screen.
+
+2007-04-24	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/functions: When killproc is executed, it checks that
+	  the process is still running, sleeps if it is, then checks again.
+	  The sleep is 1 second in between checks. By sleeping for 0.1 seconds
+	  in between checks, killproc is much faster as it's wasting much
+	  less time sleeping in the normal case that the process has died
+	  after a short delay.
+
+2007-04-16	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/functions: Redirect stderr when using kill to suppress
+	  output.
+	* lfs/init.d/functions: killproc() was not handling the case where a
+	  pidfile is passed to the function. The logic with the signal to be
+	  used was causing issues with the handling of pidfiles. This has been
+	  fixes, and now killproc() will recheck the process if the signal
+	  was TERM (the default) or KILL.
+	* lfs/init.d/functions: statusproc() has been changed to use pidofproc()
+	  instead of the deprecated getpids(). Additionally, it now accepts
+	  the -p argument to specify a pidfile.
+	* lfs/init.d/functions: Currently, statusproc() always returns
+	  successfully, and the only way to know if the process is running
+	  is to parse the output. This changes statusproc() to return the
+	  status of pidofproc(), which will return unsuccessfully if the
+	  requested process is not running.
+	* lfs/init.d/functions: Changed reloadproc() to use pidofproc() and
+	  respect the -p argument for pidfiles.
+	* lfs/init.d/sysklogd: Remove a useless argument to reloadproc().
+
+2007-03-13	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/functions: If pidofproc() is passed the -p argument
+	  it can bomb testing a null variable with an integer expression.
+
+2007-02-22	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/mountfs, lfs/init.d/console, lfs/init.d/setclock,
+	  lfs/init.d/mountkernfs: &> redirection is not supported in POSIX.
+	  Fortunately, it's equivalent to >word 2>&1 according to bash(1).
+
+2007-02-22	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/console: POSIX says that shells only need to trap on
+	  signals. Trapping on ERR isn't always supported. Conditionals have
+	  been added to set the $failed variable in spots that seemed
+	  appropriate for checking errors.
+
+2007-02-22	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/functions: Use arithmetic expansion and string length,
+	  which are both mandated by POSIX, rather than spawning two processes
+	  every time boot_mesg() is called.
+
+2007-02-22	Dan Nicholson	<dnicholson@linuxfromscratch.org>
+	* lfs/init.d/functions: In order to provide an `echo' which provides
+	  handles the -e and -n options for all POSIX shells, a feature test
+	  is added which stores its result in $ECHO. /bin/echo will be used
+	  if the default echo is not capable. Changed the existing functions
+	  to reference $ECHO when needed.
+	* lfs/init.d/console: Use $ECHO when -en is needed.
+
+2007-02-03	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* ChangeLog: Rename from CHANGELOG, start using GNU style entries.
+
+	* Makefile: Move setclock before checkfs.  Fixes #1948.
+
+2006-11-25	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* lfs/init.d/udev_retry: Copy Debian's "copy generated rules" initscript
+	  code, to clean up when the rule_generator scripts run before / is
+	  writable.  (Since the rule_generator code is from Debian, I assume their
+	  cleanup code is appropriate.)
+
+2006-10-15	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* lfs/init.d/udev_retry: Fix to work with udev >= 099.
+
+n/a - June 2, 2006
+	* Removed console config file and makefile targets.
+	* Removed references to /dev/bug and bugreport in udevand 
+          udev_retry bootscripts. (DJ Lucas)
+n/a - April 17, 2006
+	* Updated udev script to use the new udevsettle program.
+	* Added udev_retry script for systems that have /usr on a different
+	  partition or for some other reason fail the initial replay. (Archaic)
+
+n/a - April 15, 2006
+	* Cleaned up contrib directory.  Removed: contrib/init.d, 
+          contrib/enhanced, contrib/livecd, contrib/hotplug, and raq2 
+	  patch. (DJ Lucas)
+
+n/a - April 14, 2006
+        * Merged changes from udev_update branch (DJ Lucas)
+	* Replaced a return with an exit and reversed comment changes in 
+          udev bootscript. (Dan Nicholson)
+	* Replaced walk_sysfs function in udev bootscript with new udevtrigger
+          program and move wait_for_uevents function inline. (DJ Lucas)
+	* Removed extra evaluate_retval in udev bootscript. (Ken Moffat)
+	* Wait for uevents to be processed in the udev script.  See ticket #1720
+	  for details. (Matthew Burgess)
+
+n/a - March 21, 2006
+        * Removed old references to boot_log function and arguments passed
+          to boot_mesg_flush in echo_* functions. (DJ Lucas)
+
+n/a - March 10, 2006
+	* Moved src argument to ipv4-static-route service script and 
+          removed from ipv4-static service script. (DJ Lucas)
+
+n/a - March 8. 2006
+	* Correct sourced path in checkfs script. (Matthew Burgess)
+
+n/a - December 31, 2005
+	* Replaced /etc/rc.d with ${rc_base} in checkfs. (Vincent Fretin)
+
+n/a - December 24, 2005
+	* Added UTF-8 support to console script. (Alexander E. Patrakov)
+
+n/a - September 11, 2005
+	* Removed text wraping and boot logging.
+	* Changed killproc to use warning if not running
+	* Changed 'print_status warning' to use old style output
+	* Fixed display error with LSB init-functions script
+	* Made above killproc/print_status changes in enhanced
+	  bootscripts.
+	* Made logger service configurable in enhanced 
+	  bootscripts. (DJ Lucas)
+
+n/a - August 14, 2005
+	* Added -s flag to pidofproc() for backwards 
+	  compatibility (DJ Lucas)
+	* Fixed erronous values returned by pidofproc() which 
+	  broke the functionality of statusproc (DJ Lucas)
+
+n/a - July 1, 2005
+	* Changed a == to a = in lfs/init.d/functions, in the boot_mesg
+	  function for ash compliancy (Nathan Coulson)
+
+n/a - June 26, 2005
+	* Removed consolelog script from contrib 
+	* Updated interactive rc script in contrib and added 
+	  README.rc-Interactive, added install target to the
+	  Makefile. (DJ Lucas)
+
+3.2.2 - May 29, 2005
+	* Tagged as 3.2.2 (Nathan Coulson)
+
+n/a - May 26, 2005
+	* Added minimal target for cross-lfs book (Jim Gifford)
+	* Fixed raq2 patch (Jim Gifford)
+
+3.2.1 - May 1, 2005
+	* Tagged as 3.2.1 (Nathan Coulson)
+
+n/a - April 17, 2005
+	* removed touch from hotplug bootscript (Matthew Burgess)
+	* moved commands around in localnet bootscript (Andrew Benton)
+
+3.2.0 - March 30, 2005
+	* Changed from syslog-ng to sysklogd (Archaic)
+	* Temporairly changed loadproc to return 0 if the program is
+	  already running (Nathan Coulson)
+	* Fixed (by reverting) ifup/ifdown/network (Nathan Coulson),
+	  Reported by Jim Gifford
+	* Fixed network up/down along with adding support of ONHOTPLUG
+	* Tagged as 3.2.0
+
+n/a - March 19, 2005
+	* Updated RaQ2 patch (Jim Gifford)
+	* Added net.agent for Hotplug of Network adapters in contrib
+	  (Jim Gifford)
+
+n/a - March 16, 2005
+	* Reverted the change from loadproc to start_daemon,
+	  Moved compatibility code into one single function.
+	  (Nathan Coulson)
+	* Readded the ONHOTPLUG option for ifup/ifdown (Nathan Coulson)
+	* Fixed killproc's output
+
+n/a - March 01, 2005
+	* Added CHECK_LINK variable in ifconfig.*/*, so if the
+	  interface does not exist, it will not fail.
+	  (Nathan Coulson)
+
+n/a - February 19, 2005
+	* Added evaluate_retval to the end of loadproc and killproc.
+	  lsb does not say that killproc should print [  OK  ],
+	  but required for compatibility.  (Nathan Coulson)
+
+n/a - February 9, 2005
+	* Accidently mounted /dev with 775 instead of 755, fixed
+	  (Reported by Alexander E. Patrakov)
+
+n/a - February 9, 2005
+	* Bugfix for /dev, now mounted with 755 permission
+
+n/a - February 8, 2005
+	* changed pidof, so it doesnt check the process id
+	  of running bootscripts, and to process shell scripts
+	  (Nathan Coulson)
+
+n/a - February 6, 2005
+	* Updated main functions file with lsb functions file
+	  Should now be LSB compliant (Nathan Coulson)
+
+n/a - January 10, 2005
+	* Moved ONBOOT check back to network (Nathan Coulson)
+	* Removed ONHOTPLUG check (Nathan Coulson)
+
+n/a - January 6, 2005
+	* fixed mountkernfs output (Nathan Coulson)
+	* reverted mountfs fakemounting (Nathan Coulson)
+
+n/a - January 5, 2005
+	* Attempted to simplify network bootup files (Nathan Coulson)
+	* Modified mountkernfs to use mountpoint (Nathan Coulson)
+	* Assuming sysfs is always mounted (Nathan Coulson)
+	* Moved fakemount to below mounting (Nathan Coulson)
+	* Removed -t noramfs from umount, as we now use tmpfs (Nathan Coulson)
+	* moved sysctl from mountkernfs to sysctl (Nathan Coulson)
+	* Added -q to sysctl (Nathan Coulson)
+
+n/a - January 2, 2005
+	* Fixed statusproc output. (DJ Lucas)
+
+3.1.0 - December 31, 2004
+	* fixed textoutput
+	* Tagged as 3.1.0
+
+n/a - December 30, 2004
+	* Fixed name of LSB Functions file
+	* Changed boot_mesg to act like echo instead of echo -n, boot_mesg now
+	  takes the -n argument if you do not wish to goto the next line
+
+3.0.1 - December 25, 2004
+	* Released as 3.0.1
+
+n/a - December 20, 2004
+	* Cleaned up header.
+	* Added RaQ2 Patch
+
+n/a - December 16, 2004
+	* Fixed a text typo in udev, tmpfs instead of ramfs (Steve Crosby)
+
+n/a - December 14, 2004
+	* Fixed a warning with find in cleanfs
+
+
+3.0 - December 8, 2004
+
+n/a - December 5, 2004
+	* Moved bootlog to use local2 service to avoide conflict with
+	  dhcpcd (DJ Lucas)
+
+3.0-rc1 - December 1, 2004
+	* rc-Interactive added (DJ Lucas)
+	* rc-Interactive moved to contrib (Nathan Coulson)
+
+n/a - November 27, 2004
+	* Moved bootlog to use local1 to avoid conflict with ppd (DJ Lucas)
+
+n/a - November 25, 2004
+	* Added consolelog to contrib/sysconfig (DJ Lucas)
+	* Rewrite of line wraping in boot_mesg and various fixes
+	  related to boot_mesg changes (DJ Lucas, Alexander Patrakov)
+	* syslog-ng is now installed by default (Jeremy Utley)
+	* hotplug is now installed by default (Jeremy Utley)
+	* udev now uses /sbin/hotplug as the default hotplug handler (Nathan Coulson)
+	* udev now mounts a tmpfs instead of a ramfs onto /dev,
+	  as suggested by Greg K-H (Nathan Coulson)
+	* Created contrib/lsb, and added a LSB compliant functions file
+	  (Nathan Coulson, and Alexander Patrakov)
+	* Modified find [requires find 4.2.3+] (Matthew Burgess)
+
+n/a - November 20, 2004
+	* Modifed modules script to return to previous kernel message
+	  level (DJ Lucas)
+
+n/a - November 02, 2004
+	* Added sysctl -p to mountkernfs (Matthew Burgess, DJ Lucas)
+
+n/a - October 07, 2004
+	* statusproc modified not to send data to bootlog (Nathan Coulson)
+	* Fixed halt commands in checkfs and udev (James Robertson)
+
+n/a - October 04, 2004
+	* Fixes to commit on 2004/09/30 (James Robertson)
+	* Revert a few changes until later (Nathan Coulson)
+	* Added a warning about switching from a 8bit font
+	  to a 9bit font (Alexander Patrakov)
+
+n/a - September 30, 2004
+	* Finished off boot_mesg() (James Robertson)
+	* Standardized all scripts to same variable format and other
+	  internal sh/bash function calls (James Robertson)
+	* Fully implemented boot_mesg across all scripts in sysconfig
+	  and init.d (James Robertson)
+
+n/a - September 26, 2004
+	* Added BOOTMESG_PREFIX variable, so users can optionally set a
+	  prefix for boot messages (James Robertson)
+	* Fixed localnet status, to use ip instead of ifconfig (Jim Gifford)
+	* Added consolelog to contrib (DJ Lucas)
+	* loadproc and killproc can have the -nomsg parameter to avoid
+	  calling evaluate_retval or print_status (Jim Gifford)
+	* boot_mesg no longer explicitly adds a \n onto end of lines
+	* Added a function called boot_mesg_flush, which can
+	  dump the BOOTMESG to the bootlog.  This helps avoid making
+	  everything have to end in OK/WARN/FAIL (Nathan Coulson)
+
+n/a - September 24, 2004
+	* Removed /dev/udev.tdb test
+
+n/a - September 23, 2004
+	* Fixed boot_log so it output's $@'s contents, not @$
+	* Added support for colors in boot_mesg (James Robertson)
+	* Modified udev's error checking
+	* Modified hotplug's error checking
+	* Converted checkfs's error handling to use boot_mesg with
+	  color support
+	* Added $INFO color to functions (James Robertson)
+
+n/a - September 22, 2004
+	* Removed the dependency on wl by replacing it with grep (Bryan Kadzban)
+	* Fixed getpids, to remove unused pids obtained from $PIDFILE
+	* Removed ${NORMAL} from echo "$BOOTMESG" in functions, and removed
+	   space added to each additional sentence tacked onto BOOTMESG
+	* boot_mesg now handles \n's properly, and does not dimish the size of
+	  the next line (James Robertson)
+	* boot_log has been added.  The echo_ functions commit the log,
+	  and then clear the BOOTMSG variable
+	* All scriptes have been converted to use boot_mesg
+
+n/a - September 21, 2004
+	* boot_mesg has been enhanced.  Subsequent calls will overwrite previous
+	  text, and it will wrap text basedupon the variable ${WCOL}. 
+	  (James Robertson)
+	* Fixed mtu optional service typo (Kevin P Fleming)
+	* Added SOURCE variable to ipv4-static-route (Kevin P Fleming)
+
+n/a - September 16, 2004
+	* nework interfaces are now brought down in reverse order
+
+n/a - September 15, 2004
+	* Added blue bracket, from dj's 3.0-pre1 bootscript package 
+	  [echo_failure, echo_warning, and echo_ok]
+	* Added a new function called boot_mesg, meant to replace the echo
+	  command.
+	  This will give us the posibility of doing logging at a later date
+	* Do not set COLUMNS if COLUMNS is already set
+	* Modified getpids, loadproc, killproc, reloadproc, and statusproc as
+	  done by DJ
+
+2.2.3 - September 04, 2004
+	* Tagged as 2.2.3
+
+n/a - September 04, 2004
+	* Added new script to contrib for syslog-ng, which is now part of
+	  LFS-Unstable, and a new Makefile target install-syslog-ng which
+	  removes the sysklogd links, and replaces them with syslog-ng (JU)
+
+2.2.2 - August 11, 2004
+	* Tagged as 2.2.2
+
+n/a - August 7, 2004
+	* Added missing error redirect (/dev/null) in getpids. (DJ)
+
+n/a - August 4, 2004
+	* Added MODE, DIRMODE, and CONFMODE variables to the makefile 
+	  to allow permissions to be set at install. (DJ)
+
+n/a - July 31, 2004
+	
+	* Moved PIDFILE check to getpids and removed arguments from
+	  killproc and reloadproc.  Signals are now set at begining of
+	  funtcions script with KILLDELAY. (DJ)
+	* Added a optional service script which can set the MTU for a given
+	  interface
+
+n/a - July 21, 2004
+
+	* Committed DJ Lucas's patch for the killproc function.  It no 
+	  longer requires arguments if PIDFILE is set
+	* added --backup to all sysconfig configuration files, so they are not
+	  replaced on a make install
+
+n/a - July 13, 2004
+
+	* Added the PEER variable to the ifconfig.*/* file, done by
+	  Kevin P. Fleming
+
+2.2.1 - July 12, 2004
+
+	* Tagged as 2.2.1
+
+n/a - July 12, 2004
+
+	* Hotplug was moved from rcsysinit.d to rc{1,2,3,4,5} to help bring
+	  up/down network interfaces started by hotplug.  This has been revoked
+	  at this time
+	* Networking interfaces are now brought down in reverse order
+	* Moved the ONBOOT check to within ifup/ifdown, so we can bring up/down
+	  the interfaces at boottime/shutdown properly, done by Kevin P. Fleming
+	* Use PREFIX instead of NETMASK for adding addresses in ipv4-static,
+	  done by Kevin P. Fleming
+	* Fix reversal of services inside ifconfig.* directories in ifdown,
+	  done by Kevin P. Fleming
+	* Add ipv4-static-route service, supplied by Kevin P. Fleming
+
+2.2.0 - July 12, 2004
+
+	* Tagged as 2.2.0
+
+n/a - July 11, 2004
+
+	* Minor script output changes
+	* Repaired networking scripts broken in previous commits
+
+n/a - July 10, 2004
+
+	* We now use the ip program [from iproute2] instead of ipconfig
+	  [net-tools] to bring up/down ethernet interfaces, and local
+	  connections, submitted by Jim Gifford
+	* Removed gateway backward compatibility
+	* Removed ifup-eth0 ifdown-eth0 compatibility
+	* Removed the "assume SERVICE=static if SERVICE is unset" compatibility
+	* Pass the IFCONFIG environmental variable to services, so they can
+	  locate the file with the parameters they must read
+	* Rename static to ipv4-static
+	* Stage1 for network configuration via directories, ifup and ifdown
+	  modified, and the static service modified
+	* Stage2 for network configuration via directories complete, network was
+	  modified to check within subdirectories for ONBOOT=yes.  Final Stage
+
+n/a - July 8, 2004
+
+	* Changed iso01 to lat1 everywhere in /etc/sysconfig/console. This
+	  fixes the problem with line-drawing characters.
+
+n/a - July 7, 2004
+
+	* Halted the computer, if unable to mount /dev as a ramfs
+
+n/a - July 6, 2004
+
+	* Moved the hotplug bootscript back to contrib, it will not be used in
+	  the testing branch of the lfs book at this time
+
+n/a - July 4, 2004
+
+	* Modified ifup and ifdown to be hotplug aware
+
+n/a - July 3, 2004
+
+	* Change the check for ONBOOT into a source within a subshell
+
+n/a - July 1, 2004
+
+	* Moved hotplug start to runlevels 3-5 from sysinit
+
+n/a - June 30, 2004
+
+	* Pass -depth in cleanfs
+
+n/a - June 29, 2004
+
+	* Made the grep for ONBOOT in the network script more exact
+
+2.1.2 - June 27, 2004
+
+	* Install the automatic module loading script by default
+	* Tagged as 2.1.2
+
+n/a - June 26, 2004
+
+	* Fixed font for UK in /etc/sysconfig/console
+
+n/a - June 23, 2004
+
+	* Fixed a typo in the hotplug installation procedure
+
+n/a - June 21, 2004
+
+	* Re-ordered the "mount" and "echo" commands in the udev script, to
+	  prevent a possible race
+	* Converted the udev script to use udevsend/udevd
+	* Moved removal of /fastboot and /forcefsck to just after the root fs
+	  becomes writable, and dropped the removal of /etc/nologin
+	* Cleaned and tweaked both the output and actions of cleanfs
+	* Removed the disabling of hotplug from sendsignals
+	* Removed anything that might call "rmmod" in hotplug, since rmmod is
+	  notoriously troublesome in the 2.6.x kernels, and call it with the
+	  stop argument from runlevels 0 and 6
+	* Fixed previous modifications to the udev and cleanfs scripts
+
+n/a - June 20, 2004
+
+	* Rolled back to the /dev/.udev.tdb check from 2.1.1, since the new
+	  one doesn't work as well, and the bug that caused it to change is
+	  now fixed
+
+n/a - June 18, 2004
+
+	* Updated sysconfig/console
+	* Fixed disabling hotplug in sendsignals
+	* hotplug is now installed by default
+
+n/a - June 15, 2004
+
+	* Reset /proc/sys/kernel/hotplug to /bin/true when running the "stop"
+	  command for hotplug
+	* Cleaned the output of the mountkernfs script
+	* Don't output "Creating files and directories" when it's a lie
+
+n/a - June 8, 2004
+
+	* Changed the location the optional module script is installed to
+	  /etc/rc.d/rcsysinit.d/S05modules.
+
+n/a - June 4, 2004
+
+	* Added a echo to the > /proc/sys/kernel/hotplug line, as > did not
+	  clear it
+
+n/a - June 3, 2004
+
+	* Added '> /proc/sys/kernel/hotplug' to sendsignals, to disable hotplug
+	  events, which may start up new daemons
+	* Added elementry bootup logging support.  If it can write to
+	  /var/log/boot.log, it will
+	* Removed logging support, it kept / from being remounted ro
+
+n/a - June 2, 2004
+
+	* Reorganize what goes on in the udev script
+	* Reorganize what goes on in the hotplug script
+	* Moved setting /sbin/hotplug as the default hotplug manager into the
+	  hotplug script
+
+n/a - June 1, 2004
+
+	* Removed usbfs from mountkernfs, and mountfs
+	* Edited the udev script, so it'll always set /proc/sys/kernel/hotplug
+
+n/a - May 24, 2004
+
+	* Added more example keymaps and font settings to /etc/sysconfig/console
+	* Install the /etc/sysconfig/console file by default
+
+n/a - May 23, 2004
+
+	* Changed the symlink for the optional modules script
+	* Removed depmod from the optional modules script
+
+n/a - May 20, 2004
+
+	* Removed the random script.  There is not a strong enough case for
+	  adding it to the lfs-bootscripts.
+
+n/a - May 19, 2004
+
+	* Added the random bootscript from blfs-bootscripts
+
+2.1.1 - May 18, 2004
+
+	* Fixed installation of modules configuration
+	* Tagged as 2.1.1
+
+n/a - May 16, 2004
+
+	* Added sysklogd configuration file
+	* Added example /etc/sysconfig/console file
+	* Do not attempt to populate /dev if that directory has already been
+	  set up earlier in bootup (such as on initramfs/initrd)
+	* Prevent excessive kernel output once klogd starts
+	* Added hotplug script
+
+n/a - May 15, 2004
+
+	* Namespace rework (enumeration of scripts is now cleaner)
+	* Removed directories: blfs, contrib/new-boot-0.2, contrib/rlv
+
+n/a - May 13, 2004
+
+	* Repaired the console script
+	* Added a check to cleanfs [createfiles], to make sure that we have
+	  a valid devicetype, if we have type=dev
+
+n/a - May 11, 2004
+
+	* Added usbfs to mountkernfs and mountfs
+
+n/a - May 6, 2004
+
+	* Don't use loadproc in localnet, it's not meant for that
+	* Quote tests of $PIDFILE, so that things behave when it's empty
+	* Removed unused kill -0 from killproc
+
+2.1.0 - May 4, 2004
+
+	* Update to the console script, prevent install of the console script
+	* Chgrp /var/run/utmp to group utmp if it exists.
+	* Moved udev from contrib to lfs
+	* Moved GATEWAY setup from /etc/rc.d/init.d/network to
+	  /etc/sysconfig/network-devices/services/static
+	* Use the contents of $PIDFILE, if it is set in the script
+	* Tagged as 2.1.0.
+
+n/a - April 30, 2004
+
+	* Moved the loadkeys script to console, and added setfont.  Contributed
+	  by Alexander E. Patrakov
+
+2.0.5 - April 29, 2004
+
+	* Added the heimdal init script.
+	* Tagged as 2.0.5
+
+2.0.4 - April 27, 2004
+
+	* Tagged as 2.0.4
+
+n/a - April 24, 2004
+
+	* Added a example script for /etc/sysconfig/createfiles
+	* Added a check for /sys before mounting sysfs
+	* Added -t noramfs to umount on /etc/rc.d/init.d/mountfs.
+	  This will prevent /dev from being unmounted, if /proc/mounts
+	  is symlinked to /etc/mtab
+
+n/a - April 18, 2004
+
+	* Small fix to a if statement in netfs
+
+n/a - April 17, 2004
+
+	* Added the lisa bootscript, lisa is part of the KDE Network package
+	* Add proper error checking to the mountfs script when writing out mtab
+	* Add more comments to the udev script, and conditionalize various
+	  things that should've been done this way in the first place
+	* Include a template module auto-loading configuration file instead of
+	  having syntax comments in the script itself
+
+n/a - April 12, 2004
+
+	* Added a automatic modules loading script to the contrib directory
+	  submitted by Zack
+	* Edited mountkernfs, so that if you can mount sysfs on /sys, it will
+	  be mounted at boottime.  Should not affect 2.4 systems
+	* Since all entries are added to /etc/mtab, we should not require
+	  the NO_FS variable.  It has been removed from mountfs
+	* Added the udev script into the contrib directory, submitted by Zack
+
+2.0.3 - April 8, 2004
+
+	* Updated cleanfs, so it can create devices.  Supplied by Zack
+	* Tagged as 2.0.3
+
+n/a - March 31, 2004
+
+	* Changed "Press Enter" on unknown error to white
+	* Moved S10swap to S20swap.  When udev is added, it has to be
+	  ran before swap is setup
+
+n/a - March 29, 2004
+
+	* Fixed the rc5.d symlink for ntp so it creates S26ntp instead
+	  of S26npt
+	* Moved S20mountkernfs to S00mountkernfs in rcsysinit.d.  Will help in
+	  the addition of udev in the future.
+
+n/a - March 27, 2004
+
+	* Changed gdm path from hardcoded to program name.  There are 2 spots
+	  gnome can be installed
+
+n/a - March 26, 2004
+
+	* Updated fam daemon script.  It now uses the famd daemon instead of fam
+
+n/a - March 24, 2004
+
+	* Removed mount command out of nfs.  the netfs script already handles
+	  this
+
+2.0.2 - March 24, 2004
+
+	* Edited cleanfs to solve a problem.  [if /tmp does not exist, it
+	  could run the find command on the root filesystem]
+	* Tagged as 2.0.2
+
+2.0.1 - March 24, 2004
+
+	* Found typo in BLFS MySQL Script.
+	* Tagged as 2.0.1
+
+2.0.0 - March 23, 2004
+
+	* Tagged as 2.0.0, no changes from 2.0.0-pre2
+
+2.0.0-pre2 - March 23, 2004
+
+	* Cleaned the /tmp directory on bootup.  find command supplied by Zack
+	* Added a script which can automatically create files and directories
+	  on startup.  [Handles files/directories, permissions, and user/group].
+	  Created by Zack
+	* Added blfs/init.d/fam script
+	* Tagged as 2.0.0-pre2
+
+n/a - March 20, 2004
+
+	* Added create-service-dir target and removed from create-dirs
+	* Changed service script install targets to use
+	  create-service-dir
+	* Added check for dhcpcd service script for stale pid file 
+	  Suggested by Jeremy
+	* Added ifconfig to ipx service script for hosting device not up
+
+n/a - March 19, 2004
+
+	* Added support for ETCDIR, and DESTDIR in the Makefile,
+	  compliments of Tushar
+	* Renamed mountproc to mountkernfs
+	* Updated the README file
+	* Coloured the print_error_message in functions red
+	* added stop to the setclock script
+	* changed echo > to > in cleanfs, suggested by winkie
+	* BLFS Scripts Added,  collected by Zack
+	* Edited killproc, so it checks for running pids, rather then
+	  the completion of the above kill command.  Suggested by Zack
+	* Added network services found in blfs, removed adsl.  Submitted by
+	  DJ.
+
+1.99.4 - March 17, 2004
+
+	* Fixed one last halt line in checkfs script
+	* Moved the directory structure around
+	* Tagged as development release 1.99.4
+
+n/a - February 28, 2004
+
+	* Added stty sane to the top of rc.d/init.d/rc.  Hopefully, this will
+	  fix the problems
+	* Also changed all instances of <ctrl-j> back to enter
+
+1.99.3 - February 23, 2004
+
+	* Tagged as development release 1.99.3
+
+n/a - February 19, 2004
+
+	* Fixed checkfs script, so it will no longer continue to boot after a
+	  failure in the init.d/checkfs script.  Tested with the help of Andre
+	  Müller.  Fix suggested by Zack
+
+n/a - February 7, 2004
+
+	* Added -s onto grep on network stop
+	* Replaced a few more enter's with ctrl-j
+
+1.99.2 - February 6, 2004
+
+	* Added -s onto grep in network start
+	* Tagged as development release 1.99.2
+
+n/a - February 4, 2004
+
+	* Fixed $WARNING $NORMAL and $ERROR lines, broken by changes in
+	  functions
+	* Changed above fixes to work with ash
+	* Fixed checkfs symlink in Makefile
+	* functions is no longer installed as executable
+	* Added a check to checkfs, for errors above 16.  These are caused by
+	  being unable to run fsck, either due to user input, or a unfunctional
+	  linux system
+
+1.99.1 - February 2, 2004
+
+	* Tagged as development release 1.99.1
+
+n/a - February 2, 2004:
+
+	* Added -d to umount in mountfs.
+	* Fixed network shutdown script
+	* Fixed Makefile rc.6 to reboot
+	* Added -s flag to grep command in rc.d/init.d/network -
+          suppresses an error if no ifconfig.* files exist
+
+n/a - January 30, 2004:
+
+	* Reorganized the network system to accept multiple services.
+	* Ash Compliancy
+	* Modified some scripts to follow template
+	* Reorganized functions, based upon Ash Compliancy Patch
+	* Added a sleep 5 to failure for evaulate_retval, and changed
+	  evaulate_retval to return true instead of false.  Instead, a
+	  exit 1 will indicate the script terminated abnormally, causing
+	  your system to wait until you hit ctrl-J
+	* Switched "Press enter to continue" to "Press <ctrl-j> to continue"
+	* replaced 3 with $KILLDELAY in sendsignals
+	* mountfs does not mount network filesystems [identified by _netdev
+	  in /etc/fstab]
+	* removed unneded touch out of cleanfs
+
+n/a - January 30, 2004:
+
+	* New maintainers for the lfs-bootscripts package are:
+	Jeremy Utley (jeremy@linuxfromscratch.org)
+	Nathan Coulson (nathan@linuxfromscratch.org)
+
+1.11 - February 3rd, 2003:
+
+	* /etc/mtab is now a real file and is handled correctly so there are
+	no errors even when the machine has crashed.
+
+1.10 - September 12th, 2002:
+
+	* Fixed up checkfs to work with non-ext2 filesystems too (such as
+	minix).
+
+1.9 - April 5th, 2002:
+
+	* reloadproc function had a missing '=' in the "failure 1" command (it
+	  should be failure=1)
+
+	* When script exists with unexpected value, you have to hit "Enter" to
+	  continue, not just a random key as printed on the screen.
+
+	* Moved K10sysklogd, K20sendsignals, K30mount and K40swap to
+	  K40sysklogd, K50sendsignals, K60mount, K70swap
+
+	* Changed the #!/bin/sh lines to #!/bin/bash - /bin/sh may not be
+	  linked to bash but to some other shell of your choice. These scripts
+	  are written to work with bash, so you can't just run them when
+	  /bin/sh -> csh or ash or whatever else tickles your fancy. This
+	  change should fix that.
+
+1.8 - March 14th, 2002:
+
+	* Fixed the getpids function call so PPID's would be taken into account
+	  properly.
+
+	* Added the 'contrib' directory with other people's bootscript
+	  implementations.
+
+1.7 - March 10th, 2002:
+
+	* Used code from Matthias Benkmann's simpleinit-msb @
+	  http://winterdrache.de/linux/newboot/index.html mainly for improved
+	  killproc function handling
+
+	* When a requested process isn't running, or is already running, a
+	  warning "Not running" or "Already running" will be displayed. This
+	  was out of allignment due to a missing $CURS_UP
+
+	* Removed "||exit" from ifup and ifdown scripts. They are useless.
+
+	* Changed the loadkeys script to run "loadkeys -d" and removed the need
+	  for the /etc/sysconfig/keyboard file. The kbd patch fixes the
+	  "loadkeys -d" behaviour.
+
+1.6 - February 26th, 2002:
+
+	* replaced -o %PPID with -o $PPID throughout the functions script. This
+	construct does what it's supposed to do (don't take PPID into account
+	because this would fail if a running daemon and the bootscript have
+	the same name).
+
+	* added 'restart' to the swap script
+
+	* instead of using 'echo -n' to supress newlines so the [ OK ] and
+	  related messages allign properly, substitute this with a single echo
+	  command that simply goes one line up before outputting anything. This
+	  also has the benefit that when programs have their own output (like
+	  swapon, fsck and loadkeys), there won't be an unwanted blank line
+	  between the program's output and the [ OK ] et all. messages.
+
+1.5 - February 2nd, 2002:
+
+	* added 'exit 1' to the statusproc function when there aren't enough
+	parameters passed to it (such as the name of process to check for)
+
+1.4 - February 2nd, 2002:
+
+	* when /fastboot is detected and the message about it is printed,
+	  don't run 'exit 1' else the rc script will cause a [FAILED] to
+	  be printed which is undesired in this case.
+
+1.3 - January 30th, 2002:
+	* network script: changed default route detection by using the same
+	  method as used when starting the script: check if the GATEWAY
+	  variable is set
+
+	* removed the emptying of /etc/mtab since it's a symlink to
+	 /proc/mounts now
+
+	* added the mountproc script which mounts the proc system. This is done
+	  because we need proc mounted even before the mountfs script is ran
+	  (now that /etc/mtab is a symlink to /proc/mounts)
+
+	* removed all absolute paths from command calls
+
+	* added umask 022 and PATH="/bin:/usr/bin:/sbin:/usr/sbin" to the
+	  functions script. Every file now sources this so that umask and PATH
+	  are set correctly
+
+1.2 - January 26th, 2002:
+	* network script: detect if a default route is set before removing it
+

+ 29 - 0
bootscripts/LICENSE

@@ -0,0 +1,29 @@
+Copyright (c) 1999-2002, Gerard Beekmans
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+	*	Redistributions in any form must retain the above copyright notice,
+		this list of conditions and the following disclaimer.
+
+	*	Neither the name of "Linux From Scratch" nor the names of its
+		contributors may be used to endorse or promote products derived from
+		this material without specific prior written permission.
+
+	*	Any material derived from Linux From Scratch must contain a
+		reference to the "Linux From Scratch" project.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
+IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+

+ 134 - 0
bootscripts/Makefile

@@ -0,0 +1,134 @@
+ETCDIR=/etc
+EXTDIR=${DESTDIR}${ETCDIR}
+MODE=754
+DIRMODE=755
+CONFMODE=644
+
+all: install
+
+create-dirs:
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc0.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc1.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc2.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc3.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc4.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc5.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc6.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rcsysinit.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc.d/init.d
+	install -d -m ${DIRMODE} ${EXTDIR}/sysconfig
+
+create-service-dir:
+	install -d -m ${DIRMODE} ${EXTDIR}/sysconfig/network-devices/services
+
+install: create-dirs create-service-dir
+	install -m ${MODE} lfs/init.d/checkfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/cleanfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${CONFMODE} lfs/init.d/functions ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/halt          ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/console       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/consolelog    ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/localnet      ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/modules       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/mountfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/mountkernfs   ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/network       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/rc            ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/reboot        ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/sendsignals   ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/setclock      ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/sysklogd	    ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/swap          ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/sysctl        ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/template      ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/udev          ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/udev_retry    ${EXTDIR}/rc.d/init.d/
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc0.d/K80network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc0.d/K90sysklogd
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc0.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rc0.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rc0.d/S80swap
+	ln -sf ../init.d/localnet    ${EXTDIR}/rc.d/rc0.d/S90localnet
+	ln -sf ../init.d/halt        ${EXTDIR}/rc.d/rc0.d/S99halt
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc1.d/K80network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc1.d/K90sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc2.d/K80network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc2.d/K90sysklogd
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc3.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc3.d/S20network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc4.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc4.d/S20network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc5.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc5.d/S20network
+	ln -sf ../init.d/network     ${EXTDIR}/rc.d/rc6.d/K80network
+	ln -sf ../init.d/sysklogd   ${EXTDIR}/rc.d/rc6.d/K90sysklogd
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc6.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rc6.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rc6.d/S80swap
+	ln -sf ../init.d/localnet    ${EXTDIR}/rc.d/rc6.d/S90localnet
+	ln -sf ../init.d/reboot      ${EXTDIR}/rc.d/rc6.d/S99reboot
+	ln -sf ../init.d/mountkernfs ${EXTDIR}/rc.d/rcsysinit.d/S00mountkernfs
+	ln -sf ../init.d/consolelog  ${EXTDIR}/rc.d/rcsysinit.d/S02consolelog
+	ln -sf ../init.d/modules     ${EXTDIR}/rc.d/rcsysinit.d/S05modules
+	ln -sf ../init.d/udev        ${EXTDIR}/rc.d/rcsysinit.d/S10udev
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rcsysinit.d/S20swap
+	ln -sf ../init.d/setclock    ${EXTDIR}/rc.d/rcsysinit.d/S25setclock
+	ln -sf ../init.d/checkfs     ${EXTDIR}/rc.d/rcsysinit.d/S30checkfs
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rcsysinit.d/S40mountfs
+	ln -sf ../init.d/udev_retry  ${EXTDIR}/rc.d/rcsysinit.d/S45udev_retry
+	ln -sf ../init.d/cleanfs     ${EXTDIR}/rc.d/rcsysinit.d/S50cleanfs
+	ln -sf ../init.d/console     ${EXTDIR}/rc.d/rcsysinit.d/S70console
+	ln -sf ../init.d/localnet    ${EXTDIR}/rc.d/rcsysinit.d/S80localnet
+	ln -sf ../init.d/sysctl      ${EXTDIR}/rc.d/rcsysinit.d/S90sysctl
+	if [ ! -f ${EXTDIR}/sysconfig/createfiles ]; then install -m ${CONFMODE} lfs/sysconfig/createfiles ${EXTDIR}/sysconfig/; fi
+	if [ ! -f ${EXTDIR}/sysconfig/modules     ]; then install -m ${CONFMODE} lfs/sysconfig/modules     ${EXTDIR}/sysconfig/; fi
+	if [ ! -f ${EXTDIR}/sysconfig/rc          ]; then install -m ${CONFMODE} lfs/sysconfig/rc          ${EXTDIR}/sysconfig/; fi
+	install                   -m ${MODE} lfs/sysconfig/network-devices/ifup   ${EXTDIR}/sysconfig/network-devices/
+	install                   -m ${MODE} lfs/sysconfig/network-devices/ifdown ${EXTDIR}/sysconfig/network-devices/
+	install                   -m ${MODE} lfs/sysconfig/network-devices/services/ipv4-static       ${EXTDIR}/sysconfig/network-devices/services/
+	install                   -m ${MODE} lfs/sysconfig/network-devices/services/ipv4-static-route ${EXTDIR}/sysconfig/network-devices/services/
+
+install-consolelog: create-dirs
+	install -m ${MODE} contrib/init.d/consolelog   ${EXTDIR}/rc.d/init.d
+	ln -sf ../init.d/consolelog  ${EXTDIR}/rc.d/rcsysinit.d/S00consolelog
+
+install-lsb-compliant:
+	make -C contrib/lsb
+
+install-service-mtu: create-service-dir
+	install -m ${MODE} contrib/sysconfig/network-devices/services/mtu ${EXTDIR}/sysconfig/network-devices/services
+
+minimal: create-dirs create-service-dir
+	install -m ${MODE} lfs/init.d/checkfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/cleanfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${CONFMODE} lfs/init.d/functions ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/halt          ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/localnet      ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/mountfs       ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/mountkernfs   ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/rc            ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/reboot        ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/sendsignals   ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/setclock      ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/swap          ${EXTDIR}/rc.d/init.d/
+	install -m ${MODE} lfs/init.d/udev          ${EXTDIR}/rc.d/init.d/
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc0.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rc0.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rc0.d/S80swap
+	ln -sf ../init.d/halt        ${EXTDIR}/rc.d/rc0.d/S99halt
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc6.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rc6.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rc6.d/S80swap
+	ln -sf ../init.d/reboot      ${EXTDIR}/rc.d/rc6.d/S99reboot
+	ln -sf ../init.d/mountkernfs ${EXTDIR}/rc.d/rcsysinit.d/S00mountkernfs
+	ln -sf ../init.d/udev        ${EXTDIR}/rc.d/rcsysinit.d/S10udev
+	ln -sf ../init.d/swap        ${EXTDIR}/rc.d/rcsysinit.d/S20swap
+	ln -sf ../init.d/setclock    ${EXTDIR}/rc.d/rcsysinit.d/S25setclock
+	ln -sf ../init.d/checkfs     ${EXTDIR}/rc.d/rcsysinit.d/S30checkfs
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc.d/rcsysinit.d/S40mountfs
+	ln -sf ../init.d/cleanfs     ${EXTDIR}/rc.d/rcsysinit.d/S50cleanfs
+	if [ ! -f ${EXTDIR}/sysconfig/rc          ]; then install -m ${CONFMODE} lfs/sysconfig/rc          ${EXTDIR}/sysconfig/; fi
+
+.PHONY: all create-dirs create-service-dir \
+	install install-service-mtu
+

+ 79 - 0
bootscripts/README

@@ -0,0 +1,79 @@
+Network Configuration:
+	Script Files:
+		rc.d/init.d/network
+		sysconfig/network-devices/ifup
+		sysconfig/network-devices/ifdown
+		sysconfig/network-devices/services/*
+
+	Configuration Files:
+		sysconfig/network-devices/ifconfig.*/*
+		Note: ifconfig.* could be either a file or directory,
+		      but the filename extention must be the same name
+					as the network interface you wish it to belong to.
+					The files within the directory will be processed
+					in alphanumerical order on boot, and reversed on
+					shutdown.
+		- SERVICE: which script to run in services directory.
+		- ONBOOT: if set to yes, this interface will be started on
+		          bootup, and stopped on shutdown
+		- ONHOTPLUG: if set to yes, this interface will be started
+		             and stopped on hotplug events.  This requires
+		             ifup and ifdown symlinked to /sbin, as well
+		             as the hotplug package
+
+		sysconfig/network
+		- HOSTNAME: Value of the system's hostname
+
+	Additional Configuration:
+		sysconfig/network-devices/ifconfig.*
+		ipv4-static:
+		- IP: static IP Address
+		- GATEWAY: Specifies the IP Address of the gateway server
+		- PREFIX: CIDR prefix of IP Address, defaults to 24 if not set
+		- PEER: IP Address of peer (for point-to-point connections and tunnels)
+		- BROADCAST: broadcast address
+		ipv4-static-route:
+		- TYPE: network (default type if not specified), default, host or
+		  unreachable
+		- IP: IP Address of target (for network, host and unreachable)
+		- PREFIX: CIDR prefix of target (for network, host and unreachable)
+		- GATEWAY: IP Address of gateway to reach target (for network and default)
+
+
+SetClock configuration:
+	Script Files:
+		rc.d/init.d/setclock
+
+	Configuration Files:
+		sysconfig/clock
+		- UTC: 1 assumes hwclock is in UTC
+		       0 assumes hwclock is in local time
+
+CleanFS configuration:
+	Script Files:
+		rc.d/init.d/cleanfs
+
+	Configuration Files:
+		/etc/sysconfig/createfiles
+		Each line is parsed, using space as a deliminator.
+		[NAME] [TYPE] [PERMISSIONS] [USER] [GROUP]
+		The below fields are currently only used on dev type.
+		([DEV TYPE] [MAJOR#] [MINOR#])
+		Name:
+			File/Directory/Device name
+		Type:
+			dir: creates a directory
+			file: creates a file
+			dev: creates a device
+		Permissions:
+			chmod the created file
+		User/Group:
+			chown the created file/dir to this user/group
+		Dev Type:
+			char:  character [needs MAJOR#, MINOR#]
+			block: block [needs MAJOR#, MINOR#]
+			pipe:  pipe
+		Major#:
+			Used by character and block devices.
+		Minor#:
+			Used by character and block devices.

+ 26 - 0
bootscripts/contrib/lsb-v3/ChangeLog

@@ -0,0 +1,26 @@
+ChangeLog
+
+20080531 - [dj] * Synced with LFS-Bootscrpts-20080531 (use udevadm)
+                * Added additional functions to manage_functions script.
+
+20080413 - [dj] * Added manage_functions script for use by scripts such as
+                  {install,remove}_initd or chkconfig, that need to parse the
+                  LSB headers.
+                * Cleaned up script headers to reflect real Start or Stop
+
+20080315 - [dj] * Corrected test for $pidfile in pidofproc()
+                * Replaced exit with return in statusproc() - (lfs-functions)
+
+20080315 - [dj] * Added missing 'stale pid file' checking for pidofproc()
+
+20080210 - [dj] * Updated documentation
+
+20070820 - [dj] * Synced with LFS-bootscripts
+
+20070705 - [dj] * Synced with LFS-bootscripts
+                * Removed 'stty' from the environment setup as it breaks 
+                  custom key configs when run from the CLI.
+
+20070218 - [dj] * Synced with LFS-bootscripts.
+
+20070206 - [dj] * Initial commit

+ 32 - 0
bootscripts/contrib/lsb-v3/INSTALL

@@ -0,0 +1,32 @@
+LSB-V3 Installation:
+
+Inline LFS installation:  make install &&
+                          sed -i.bak 's@/etc/rc.d@/etc@' /etc/inittab
+
+
+After LFS:  for file in /etc/rc.d /etc/sysconfig/rc /etc/sysconfig/modules \
+                /etc/sysconfig/createfiles
+              do
+                mv $file $file.bak
+              done &&
+            make install &&
+            sed -i.bak 's@/etc/rc.d@/etc@' /etc/inittab
+
+
+With existing scripts:  HERE=$PWD
+                        cp -a /etc/rc.d /etc/rc.d.bak &&
+                        mv /etc/rc.d/* /etc &&
+                        cd /etc/rc.d &&
+                        ln -s ../rc*.d . &&
+                        ln -s ../init.d . &&
+                        for file in /etc/rc.d /etc/syconfig/rc \
+                            /etc/sysconfig/modules /etc/sysconfig/createfiles
+                          do
+                            mv $file $file.bak
+                          done &&
+                        cd $HERE &&
+                        unset HERE &&
+                        make install &&
+                        sed -i.bak 's@/etc/rc.d@/etc/@' /etc/inittab
+                        
+That's it!

+ 134 - 0
bootscripts/contrib/lsb-v3/Makefile

@@ -0,0 +1,134 @@
+ETCDIR=/etc
+EXTDIR=${DESTDIR}${ETCDIR}
+MODE=754
+DIRMODE=755
+CONFMODE=644
+
+all: install
+
+create-dirs:
+	install -d -m ${DIRMODE} ${EXTDIR}/rc0.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc1.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc2.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc3.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc4.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc5.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rc6.d
+	install -d -m ${DIRMODE} ${EXTDIR}/rcsysinit.d
+	install -d -m ${DIRMODE} ${EXTDIR}/init.d
+	install -d -m ${DIRMODE} ${EXTDIR}/sysconfig
+	install -d -m ${DIRMODE} ${DESTDIR}/lib/lsb
+	install -d -m ${DIRMODE} ${EXTDIR}/lsb/state
+
+create-service-dir:
+	install -d -m ${DIRMODE} ${EXTDIR}/sysconfig/network-devices/services
+
+create-boottemp-dir:
+	install -d -m ${DIRMODE} ${EXTDIR}/init.d/boottemp
+
+install: create-dirs create-service-dir create-boottemp-dir
+	install -m ${MODE} init.d/checkfs           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/cleanfs           ${EXTDIR}/init.d/
+	install -m ${CONFMODE} init.d/lfs-functions ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/halt              ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/console           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/localnet          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/modules           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/mountfs           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/mountkernfs       ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/network           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/rc                ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/reboot            ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/sendsignals       ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/setclock          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/sysklogd          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/swap              ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/sysctl            ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/template          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/udev              ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/udev_retry        ${EXTDIR}/init.d/
+	install -m ${CONFMODE} lsb/init-functions   ${DESTDIR}/lib/lsb/
+	install -m ${CONFMODE} lsb/manage-functions ${DESTDIR}/lib/lsb/
+	install -m ${CONFMODE} etc/lsb-config       ${EXTDIR}/lsb/
+	ln -sf ../init.d/network     ${EXTDIR}/rc0.d/K80network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc0.d/K90sysklogd
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc0.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc0.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc0.d/S80swap
+	ln -sf ../init.d/localnet    ${EXTDIR}/rc0.d/S90localnet
+	ln -sf ../init.d/halt        ${EXTDIR}/rc0.d/S99halt
+	ln -sf ../init.d/network     ${EXTDIR}/rc1.d/K80network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc1.d/K90sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc2.d/K80network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc2.d/K90sysklogd
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc3.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc3.d/S20network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc4.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc4.d/S20network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc5.d/S10sysklogd
+	ln -sf ../init.d/network     ${EXTDIR}/rc5.d/S20network
+	ln -sf ../init.d/network     ${EXTDIR}/rc6.d/K80network
+	ln -sf ../init.d/sysklogd    ${EXTDIR}/rc6.d/K90sysklogd
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc6.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc6.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc6.d/S80swap
+	ln -sf ../init.d/localnet    ${EXTDIR}/rc6.d/S90localnet
+	ln -sf ../init.d/reboot      ${EXTDIR}/rc6.d/S99reboot
+	ln -sf ../init.d/mountkernfs ${EXTDIR}/rcsysinit.d/S00mountkernfs
+	ln -sf ../init.d/sysctl      ${EXTDIR}/rcsysinit.d/S05sysctl
+	ln -sf ../init.d/modules     ${EXTDIR}/rcsysinit.d/S10modules
+	ln -sf ../init.d/udev        ${EXTDIR}/rcsysinit.d/S15udev
+	ln -sf ../init.d/swap        ${EXTDIR}/rcsysinit.d/S20swap
+	ln -sf ../init.d/setclock    ${EXTDIR}/rcsysinit.d/S25setclock
+	ln -sf ../init.d/checkfs     ${EXTDIR}/rcsysinit.d/S30checkfs
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rcsysinit.d/S40mountfs
+	ln -sf ../init.d/udev_retry  ${EXTDIR}/rcsysinit.d/S45udev_retry
+	ln -sf ../init.d/cleanfs     ${EXTDIR}/rcsysinit.d/S50cleanfs
+	ln -sf ../init.d/console     ${EXTDIR}/rcsysinit.d/S70console
+	ln -sf ../init.d/localnet    ${EXTDIR}/rcsysinit.d/S80localnet
+	if [ ! -f ${EXTDIR}/sysconfig/createfiles ]; then install -m ${CONFMODE} sysconfig/createfiles ${EXTDIR}/sysconfig/; fi
+	if [ ! -f ${EXTDIR}/sysconfig/modules     ]; then install -m ${CONFMODE} sysconfig/modules     ${EXTDIR}/sysconfig/; fi
+	if [ ! -f ${EXTDIR}/sysconfig/rc          ]; then install -m ${CONFMODE} sysconfig/rc          ${EXTDIR}/sysconfig/; fi
+	if [ ! -f ${EXTDIR}/sysconfig/rc.site     ]; then install -m ${CONFMODE} sysconfig/rc.site     ${EXTDIR}/sysconfig/; fi
+	install                   -m ${MODE} sysconfig/network-devices/ifup   ${EXTDIR}/sysconfig/network-devices/
+	install                   -m ${MODE} sysconfig/network-devices/ifdown ${EXTDIR}/sysconfig/network-devices/
+	install                   -m ${MODE} sysconfig/network-devices/services/ipv4-static       ${EXTDIR}/sysconfig/network-devices/services/
+	install                   -m ${MODE} sysconfig/network-devices/services/ipv4-static-route ${EXTDIR}/sysconfig/network-devices/services/
+
+minimal: create-dirs create-service-dir create-boottemp-dir
+	install -m ${MODE} init.d/checkfs           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/cleanfs           ${EXTDIR}/init.d/
+	install -m ${CONFMODE} init.d/lfs-functions ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/halt              ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/localnet          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/mountfs           ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/mountkernfs       ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/rc                ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/reboot            ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/sendsignals       ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/setclock          ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/swap              ${EXTDIR}/init.d/
+	install -m ${MODE} init.d/udev              ${EXTDIR}/init.d/
+	install -m ${CONFMODE} lsb/init-functions   ${DESTDIR}/lib/lsb/
+	install -m ${CONFMODE} lsb/manage-functions ${DESTDIR}/lib/lsb/
+	install -m ${CONFMODE} etc/lsb-config       ${EXTDIR}/lsb/
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc0.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc0.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc0.d/S80swap
+	ln -sf ../init.d/halt        ${EXTDIR}/rc0.d/S99halt
+	ln -sf ../init.d/sendsignals ${EXTDIR}/rc6.d/S60sendsignals
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rc6.d/S70mountfs
+	ln -sf ../init.d/swap        ${EXTDIR}/rc6.d/S80swap
+	ln -sf ../init.d/reboot      ${EXTDIR}/rc6.d/S99reboot
+	ln -sf ../init.d/mountkernfs ${EXTDIR}/rcsysinit.d/S00mountkernfs
+	ln -sf ../init.d/udev        ${EXTDIR}/rcsysinit.d/S10udev
+	ln -sf ../init.d/swap        ${EXTDIR}/rcsysinit.d/S20swap
+	ln -sf ../init.d/setclock    ${EXTDIR}/rcsysinit.d/S25setclock
+	ln -sf ../init.d/checkfs     ${EXTDIR}/rcsysinit.d/S30checkfs
+	ln -sf ../init.d/mountfs     ${EXTDIR}/rcsysinit.d/S40mountfs
+	ln -sf ../init.d/cleanfs     ${EXTDIR}/rcsysinit.d/S50cleanfs
+	if [ ! -f ${EXTDIR}/sysconfig/rc          ]; then install -m ${CONFMODE} sysconfig/rc          ${EXTDIR}/sysconfig/; fi
+
+.PHONY: all create-dirs create-service-dir create-boottemp-dir \
+	install minimal 
+

+ 105 - 0
bootscripts/contrib/lsb-v3/README

@@ -0,0 +1,105 @@
+LSB-V3 README
+
+The scripts contianed in this directory are a complete rewrite of the
+boot scripts from LFS-6.1 (updated for LFS-SVN about 2008-04-13).  As is
+usually the case with a rewrite, there have been many changes:
+
+LSB Version 3.1 Compliant Scripts - Immediately noticable are the LSB headers
+in the rc.d scripts themselves.  Each script contains a usable header to
+allow for automating both the installation of, and determining proper
+execution order for the startup scripts.  These values can also be used
+directly in parallel boot setups.  Additionally, messages are displayed in
+one single write to the screen, after exit status is determined, so that
+they can be used in parallel setups.  I am not sure if this was the only
+barrier to auto language translation in the previous bootscripts.  Further,
+the messages are created from parts and only written to the screen in a
+single command, so maybe no help at all WRT translated boot messages.
+
+LSB 3.1 Omissions - Unfortunately, this package is not completely LSB
+compliant as it lacks install-initd and remove-initd programs.  The current
+popular flavor of these programs is written in Python, which, as you should
+know, is not installed until BLFS.  I began work on a bash implementation,
+and have provided the needed functions to parse the LSB headers in the
+manage-functions script (insalled by default into /lib/lsb).  Unfortunately,
+I have yet to complete the actual install-initd and remove-initd scripts,
+however, I do have an almost complete install-initd kept locally.  I am
+currently working on a separate script to completely rewrite the symlinks
+should LFS default values not prove sufficient when working with scripts in
+the wild.  I have not included either here because they are not yet complete
+or thoroughly tested, and due to the development process of lfs-bootscritps,
+would be included in a release tarball.  If you would like to assist with the
+development of these scripts, or would even just like to see what I have so
+far, please email me privately.  Of course, feel free to write your own if you
+do not like the manage-fucntions script (or bash).
+
+Distribution Independent - this original goal for the LFS scripts has been
+stretched even further by providing both a global rc config file that
+contains (generally) static values, and a new rc.site config file to allow
+customization of messages as diplayed to the end user during the boot
+process.  The format of messages printed to the screen is adjustable
+here.  As well, the other options that were available in the previous
+versions of the lfs-bootscripts, and additional options as discussed below,
+are configurable by the /etc/sysconfig/rc.site file.
+
+Single Environment - The rc script has been rewritten completely to allow a
+single source of the boot configuration per runlevel change.  This config
+is inherited from rc's environment as opposed to being sourced everytime a
+script is run.  This results in a negledgable decrease in boot time, but
+it is just better in principle.
+
+Boot Logging - The previous incarnation of the boot log didn't begin
+recording events until the root filesystem was mounted read/write.  This has
+been corrected by providing a tempfs mount immediately after init hands
+control to the rc script.  The bootlog is generated on the tempfs and then
+passed to the log file before login.  Additionally, shutdown events are no
+longer recorded in the bootlog.  They were pretty much useless and it really
+wasn't what I'd call a *boot* log.  Boot logging is on by default and is
+configurable in the /etc/sysconfig/rc.site file.
+
+Interactive Boot - This feature has been included by default, and is a
+little more polished than my previous attempt.  It does introduce a two
+second delay in the boot process (so that you have time to press a button
+to select interactive mode).  This time value, and the option prompt itself,
+is configurable in the /etc/sysconfig/rc.site file.
+
+RC_BASE - The base directory for the bootscripts is now /etc, not
+/etc/rc.d.  This is mostly to conform with mainstream distros, but other
+boot methods do expect that /etc/init.d is the location of bootscripts.
+Some distros provide a rc.d direcorty with symlinks to the rc*.d and init.d
+directories, I have not done that.  /etc is the location now, get your
+flying fingers accustomed to it!  Of course, this is still configurable in
+/etc/sysconfig/rc.site, and if the change is too great, I'll put it back.
+
+LSB Functions - The previous lfs-bootscripts sourced a functions file
+located at /etc/rc.d/init.d/functions.  This file has been renamed
+$distro-functions to segregate it from the old. The name is configurable
+by the rc.site configuration file.  Both old and new bootscripts can be
+used simultaneously in a SYS-V setup (with proper symlinks in place).
+LSB defined functions are used where possible, but the $distro-functions file
+provides, easy to use wraper functions that
+start/stop/reload/force-reload/restart programs, evaluate the numerical
+LSB return values, and print status messages to the screen.  Both LFS
+functions and LSB functions are documented directly in the scritps located
+at /etc/init.d/$distro-functions and /lib/lsb/init-functions respectively.
+
+Pretier - Yeah, I just couldn't handle all the grey text...  By default,
+successful boot messages are prefixed with a single green astrik character,
+warning messages with two yellow astirks, and failures are prefixed with
+three red astriks.  This just provides a second 'quick glance' status when
+watching the boot messages fly by.  Again, the prefixes are configurable (or
+completely removable) in the /etc/sysconfig/rc.site file.
+
+Complete Rewrite - Yep.  That doesn't mean that code wasn't reused when
+possible, so Alexander, Bryan, Dan, Gerard, Jeremy, Jim, Mathias, Matthew,
+Nathan, and countless other contributors (whose names I've forgotten and will
+promptly be reminded of (please)) are due credit for these as well.  That
+said, at very least, this is a complete reorganisation that I've tested to
+the best of my ability, but there probably are some hidden bugs that will
+come to lite when used more frequently.  Please give me a shout _when_ you
+find them.
+
+Thanks.
+
+-- DJ Lucas
+dj@linuxfromscratch.org
+

+ 8 - 0
bootscripts/contrib/lsb-v3/etc/lsb-config

@@ -0,0 +1,8 @@
+# Begin /etc/lsb/lsb-config
+
+rcbase="/etc/init.d"
+statedir="/etc/lsb/state"
+distro="LFS"
+
+# End /etc/lsb/lsb-config
+

+ 105 - 0
bootscripts/contrib/lsb-v3/init.d/checkfs

@@ -0,0 +1,105 @@
+#!/bin/sh
+# Begin /etc/init.d/checkfs
+
+### BEGIN INIT INFO
+# Provides:            checkfs
+# Required-Start:      udev swap $time
+# Should-Start:        lvm
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Checks local filesystems before mounting.
+# Description:         Checks local filesystmes before mounting.
+# X-LFS-Default-Start: S30
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        if [ -f /fastboot ]; then
+            echo "${INFO}/fastboot found!"
+            log_success_msg "Will not perform file system checks as requested."
+            exit 0
+        fi
+
+        mount -n -o remount,ro / >/dev/null
+        if [ ${?} != 0 ]
+        then
+            log_failure_msg "Mounting root file system in read-only mode"
+            echo "${FAILURE}FAILURE:\n"
+            echo -n "${FIALURE}Cannot check root filesystem because it "
+            echo "${FAILURE}could not be mounted"
+            echo "${FAILURE}in read-only mode.\n\n"
+            echo -n "${FAILURE}After you press Enter, this system will be "
+            echo "${FAILURE}halted and powered off.\n"
+            echo "${INFO}Press enter to continue...${NORMAL}"
+            read ENTER
+            /etc/rc.d/init.d/halt stop
+        fi
+
+        if [ -f /forcefsck ]
+        then
+            echo "${INFO}/forcefsck found!"
+            log_success_msg "${INFO}Forcing file system checks as requested."
+            options="-f"
+        else
+            options=""
+        fi
+
+        # Note: -a option used to be -p; but this fails e.g.
+        # on fsck.minix
+        fsck ${options} -a -A -C -T
+        error_value=${?}
+
+        if [ "${error_value}" = 0 ]
+        then
+            log_success_msg "Checking file systems..."
+        elif [ "${error_value}" = 1 ]
+        then
+            log_warning_msg "Checking file systems..."
+            echo "${WARNING}WARNING:\n"
+            echo "${WARNING}File system errors were found and have been"
+            echo "${WARNING}corrected.  You may want to double-check that"
+            echo "${WARNING}everything was fixed properly.${NORMAL}"
+        elif [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
+            log_warning_msg "Checking file systems..."
+            echo "${WARNING}WARNING:\n"
+            echo "${WARNING}File system errors were found and have been been"
+            echo "${WARNING}corrected, but the nature of the errors require"
+            echo "${WARNING}this system to be rebooted.\n"
+            echo "After you press enter, this system will be rebooted.\n"
+            echo "${INFO}Press Enter to continue...${NORMAL}"
+            read ENTER
+            reboot -f
+        elif [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
+            log_failure_msg "Checking file systems..."
+            echo "${FAILURE}FAILURE:\n"
+            echo "${FAILURE}File system errors were encountered that could"
+            echo "${FAILURE}not be fixed automatically.  This system cannot"
+            echo "${FAILURE}continue to boot and will therefore be halted"
+            echo "${FAILURE}until those errors are fixed manually by a"
+            echo "${FAILURE}System Administrator.\n"
+            echo "${FAILURE}After you press Enter, this system will be"
+            echo "${FAILURE}halted and powered off.\n"
+            echo "${INFO}Press Enter to continue...${NORMAL}"
+            read ENTER
+            /etc/rc.d/init.d/halt stop
+        elif [ "${error_value}" -ge 16 ]; then
+            log_failure_msg "Checking file systems..."
+            echo "${FAILURE}FAILURE:\n"
+            echo "${FAILURE}Unexpected Failure running fsck.  Exited with error"
+            echo "${FAILURE}code: ${error_value}.${NORMAL}"
+            exit ${error_value}
+        fi
+        ;;
+    *)
+        echo "Usage: ${0} {start}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/checkfs

+ 113 - 0
bootscripts/contrib/lsb-v3/init.d/cleanfs

@@ -0,0 +1,113 @@
+#!/bin/sh
+# Begin /etc/init.d/cleanfs
+
+### BEGIN INIT INFO
+# Provides:            cleanfs
+# Required-Start:      $local_fs
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:        
+# Short-Description:   Cleans temporary directories early in the boot process.
+# Description:         Cleans temporary directories /var/run, /var/lock, and
+#                      /tmp.  cleanfs also creates /var/run/utmp and any files 
+#                      defined in /etc/sysconfig/createfiles.
+# X-LFS-Default-Start: S50
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+# Function to create files/directory on boot.
+create_files()
+{
+    # Read in the configuration file.
+    exec 9>&0 < /etc/sysconfig/createfiles
+    while read name type perm usr grp dtype maj min junk
+    do
+        # Ignore comments and blank lines.
+        case "${name}" in
+            ""|\#*) continue ;;
+        esac
+
+        # Ignore existing files.
+        if [ ! -e "${name}" ]
+        then
+            # Create stuff based on its type.
+            case "${type}" in
+                dir)
+                    mkdir "${name}"
+                    ;;
+                file)
+                    :> "${name}"
+                    ;;
+                dev)
+                    case "${dtype}" in
+                        char)
+                            mknod "${name}" c ${maj} ${min}
+                            ;;
+                        block)
+                            mknod "${name}" b ${maj} ${min}
+                            ;;
+                        pipe)
+                            mknod "${name}" p
+                            ;;
+                        *) 
+                            echo -n "\n${WARNING}Unknown device type: ${dtype}"
+                            echo "${NORMAL}"
+                            ;;
+                    esac
+                    ;;
+                *)
+                    echo "\n${WARNING}Unknown type: ${type}${NORMAL}"
+                    continue
+                    ;;
+            esac
+
+            # Set up the permissions, too.
+            chown ${usr}:${grp} "${name}"
+            chmod ${perm} "${name}"
+        fi
+    done
+    exec 0>&9 9>&-
+}
+
+case "${1}" in
+    start)
+        message="Cleaning file systems: "
+
+        message="${message}${INFO} /tmp"
+        find /tmp -xdev -mindepth 1 ! -name lost+found \
+            -delete || failed=1
+
+        message="${message} /var/lock"
+        find /var/lock -type f -exec rm -f {} \; || failed=1
+
+        message="${message} /var/run${NORMAL}"
+        find /var/run ! -type d ! -name utmp -exec rm -f {} \; || failed=1
+
+        > /var/run/utmp
+        if grep -q '^utmp:' /etc/group ; then
+            chmod 664 /var/run/utmp
+            chgrp utmp /var/run/utmp
+        fi
+
+        (exit ${failed})
+        evaluate_retval standard
+
+        if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null
+        then
+            message="Creating files and directories..."
+            create_files
+            evaluate_retval standard
+        fi
+        ;;
+    *)
+        echo "Usage: ${0} {start}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/cleanfs

+ 111 - 0
bootscripts/contrib/lsb-v3/init.d/console

@@ -0,0 +1,111 @@
+#!/bin/sh
+# Begin $rc_base/init.d/console
+
+### BEGIN INIT INFO
+# Provides:            console
+# Required-Start:
+# Should-Start:        $local_fs
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Sets up a localised console.
+# Description:         Sets up fonts and language settings for the user's 
+#                      local as defined by /etc/sysconfig/console.
+# X-LFS-Default-Start: S70
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+MESSAGE="Setting up Linux console..."
+
+# Native English speakers probably don't have /etc/sysconfig/console at all
+if [ -f /etc/sysconfig/console ]
+then
+	. /etc/sysconfig/console
+fi
+
+is_true() {
+	[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
+}
+
+failed=0
+
+case "${1}" in
+	start)
+		# There should be no bogus failures below this line!
+		
+		# Figure out if a framebuffer console is used
+		[ -d /sys/class/graphics/fb0 ] && USE_FB=1 || USE_FB=0
+		
+		# Figure out the command to set the console into the
+		# desired mode
+		is_true "${UNICODE}" &&
+			MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||
+			MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a"
+		
+		# On framebuffer consoles, font has to be set for each vt in
+		# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
+		
+		! is_true "${USE_FB}" || [ -z "${FONT}" ] ||
+			MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
+
+		# Apply that command to all consoles mentioned in
+		# /etc/inittab. Important: in the UTF-8 mode this should
+		# happen before setfont, otherwise a kernel bug will
+		# show up and the unicode map of the font will not be
+		# used.
+		# FIXME: Fedora Core also initializes two spare consoles
+		# - do we want that?
+		
+		for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
+			grep -o '\btty[[:digit:]]*\b'`
+		do
+			openvt -f -w -c ${TTY#tty} -- \
+				/bin/sh -c "${MODE_COMMAND}" || failed=1
+		done
+
+		# Set the font (if not already set above) and the keymap
+		is_true "${USE_FB}" || [ -z "${FONT}" ] || 
+                        setfont $FONT || 
+                        failed=1
+		[ -z "${KEYMAP}" ] || 
+                        loadkeys ${KEYMAP} >/dev/null 2>&1 ||
+                        failed=1
+		[ -z "${KEYMAP_CORRECTIONS}" ] ||
+			loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
+                        failed=1
+
+		# Linux kernel generates wrong bytes when composing
+		# in Unicode mode. That's why we disable dead keys in Unicode
+		# mode by default. If you need them, download and apply
+		# http://www.linuxfromscratch.org/~alexander/patches/linux-2.6.12.5-utf8_input-2.patch
+		# After patching, add "-m charset_of_your_keymap" to the FONT
+		# variable and set BROKEN_COMPOSE=false
+		# in /etc/sysconfig/console
+
+		[ -n "$BROKEN_COMPOSE" ] || BROKEN_COMPOSE="$UNICODE"
+		! is_true "$BROKEN_COMPOSE" ||
+			echo "" | loadkeys -c >/dev/null 2>&1 ||
+                        failed=1
+		
+		# Convert the keymap from $LEGACY_CHARSET to UTF-8
+		[ -z "$LEGACY_CHARSET" ] ||
+			dumpkeys -c "$LEGACY_CHARSET" |
+                        loadkeys -u >/dev/null 2>&1 ||
+                        failed=1
+
+		# If any of the commands above failed, the trap at the
+		# top would set $failed to 1
+		( exit $failed )
+		evaluate_retval standard
+		;;
+	*)
+		echo $"Usage:" "${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/console

+ 32 - 0
bootscripts/contrib/lsb-v3/init.d/halt

@@ -0,0 +1,32 @@
+#!/bin/sh
+# Begin $RC_BASE/init.d/halt
+
+### BEGIN INIT INFO
+# Provides:            halt
+# Required-Start:
+# Should-Start:
+# Required-Stop:       localnet
+# Should-Stop:
+# Default-Start:       0
+# Default-Stop:
+# Short-Description:   Halts the system.
+# Description:         Halts the System.
+# X-LFS-Default-Start:
+# X-LFS-Default-Stop:  S99
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    stop)
+        log_success_msg "Halting System..."
+        halt -d -f -i -p
+        ;;
+    *)
+        echo "Usage: {stop}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/halt

+ 215 - 0
bootscripts/contrib/lsb-v3/init.d/lfs-functions

@@ -0,0 +1,215 @@
+# Begin /etc/init.d/lfs-functions
+# Provides LFS specific functions for LSB style bootscripts
+
+################################# chkstat() ###################################
+# chk_stat checks the status of a script by checking for both a binary file   #
+# to execute, and if set, a config file that may be needed for the program    #
+# to run successfully.  The calling script will exit with a return value of 5 #
+# if the binary does not exist, and a value of 6 if the needed config file is #
+# unavailable as per LSB requirements.  This function accepts zero, one, or   #
+# two string arguments.  If arguments are passed, the first must be a bin     #
+# file.  If a second argument is passed, it is interpreted as the config      #
+# file.  Optionally, zero arguments can be passed if BIN_FILE, and optinally  #
+# CONFIG_FILE are set in the calling script.                                  #
+###############################################################################
+chk_stat()
+{
+    if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
+        BIN_FILE="${1}"
+        if [ -z "${2}" ]; then
+            CONFIG_FILE=""
+        else
+            CONFIG_FILE="${2}"
+        fi
+    elif [ -z "${BIN_FILE}" ]; then
+            echo "Usage: 'chk_stat BIN_FILE CONFIG_FILE'"
+            exit 1 # Generic Error
+    fi
+
+    if [ ! -e "${BIN_FILE}" ]; then
+        log_failure_msg "${BIN_FILE} not installed" &&
+        exit 5
+    fi
+
+    if [ ! -z "${CONFIG_FILE}" ]; then
+        if [ ! -e "${CONFIG_FILE}" ]; then
+            log_failure_msg "${CONFIG_FILE} does not exist" &&
+            exit 6
+        fi
+    fi
+}
+
+################################ loadproc() ###################################
+# loadproc is just a wraper to start_daemon for simple scripts, which will    #
+# require no arguments if $BIN_FILE is set.                                   #
+###############################################################################
+loadproc()
+{
+    start_daemon "${BIN_FILE}" "${@}"
+}
+
+################################ endproc() ####################################
+# endproc, like loadproc, is just a wraper to killproc for simplicity and is  #
+# dependent on $BIN_FILE being set.                                           #
+###############################################################################
+endproc()
+{
+    killproc "${BIN_FILE}" "${@}"
+}
+
+############################### statusproc() ##################################
+# statusproc checks the status of a particular binary and displays the        #
+# appropriate message (running or not running) and exits on the return value  #
+# of pidofproc.  This function accepts two string arguments or zero arguments #
+# if BIN_FILE and MESSAGE are set, else it requires the bin file as the first #
+# argument, and the message as the second.  Both must be enclosed in quotes.  #
+###############################################################################
+statusproc()
+{
+    if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
+        BIN_FILE="${1}"
+        MESSAGE="${2}"
+    elif [ -z "${BIN_FILE}" -o -z "${MESSAGE}" ]; then
+        echo "Usage: 'statusproc BIN_FILE MESSAGE'"
+        exit 1 # Generic Error
+    fi
+
+    pidlist=`pidofproc "${BIN_FILE}"`
+    STATUS=$?
+    echo "Checking ${MESSAGE} status:"
+    if [ "${STATUS}" = "0" ]; then
+        log_success_msg "Running with PID(s) ${pidlist}"
+    else
+        
+        log_warning_msg "Not running!"
+    fi
+
+    return "${STATUS}"
+}
+
+############################### reloadproc() ##################################
+# reloadproc sends a HUP signal to the running program (relaod configuration) #
+# It optionally, using the -force switch, checks the status of a particular   #
+# program and starts it if it is not already running. This function accepts   #
+# one optional switch (must be the first argument), and either two, or zero   #
+# string arguments.  If BIN_FILE and MESSAGE are set in the script's          #
+# environment, it will use those values,  else it requires the bin file as    #
+# the first argument (following -force if used), and the message as the       #
+# second. Both must be enclosed in quotes. If the force option is used, it    #
+# follows the LSB definition of 'force-reload' - the program is started if    #
+# not already running.                                                        #
+###############################################################################
+reloadproc()
+{
+    local force="0"
+    if [ "${#}" -gt "0" -a "${1}" = "-force" ]; then
+        force="1"
+        shift 1
+    fi
+
+    if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
+        BIN_FILE="${1}"
+        MESSAGE="${2}"
+    elif [ -z "${BIN_FILE}" -o -z "${MESSAGE}" ]; then
+        echo "Usage: 'reloadproc BIN_FILE MESSAGE'"
+        exit 1 # Generic Error
+    fi
+
+    
+
+}
+
+############################## evaluate_retval() ###############################
+# evaluate_retval requires that you pass exactly one evaluation parameter of   #
+# (start, stop, other) based on the previous action that is being evaluated.   #
+# This function is intended for use with start_daemon and killproc to          #
+# interpret the LSB exit codes properly, othewise the checks only for success  #
+# or failure.                                                                  #
+################################################################################
+evaluate_retval()
+{
+    local error_value="${?}"
+
+    # Handle LSB defined return values
+    case "${1}" in
+
+      start)
+        case "${error_value}" in
+          0)
+            log_success_msg "Starting ${MESSAGE} "
+            return "${error_value}"
+          ;;
+          2)
+            log_failure_msg "Starting ${MESSAGE} Error: Invalid argument!"
+            return "${error_value}"
+          ;;
+          5)
+            log_failure_msg "Starting ${MESSAGE} Error: Not available!"
+            return "${error_value}"
+          ;;
+          *)
+            log_failure_msg "Starting ${MESSAGE} Error: General failure!"
+            return "${error_value}"
+          ;;
+        esac
+      ;;
+
+      stop)
+        case "${error_value}" in
+          0)
+            log_success_msg "Stopping ${MESSAGE} "
+            return "${error_value}"
+            ;;
+          2)
+            log_failure_msg "Stopping ${MESSAGE} Error: Invalid argument!"
+            return "${error_value}"
+            ;;
+          5)
+            log_failure_msg "Stopping ${MESSAGE} Error: Not available!"
+            return "${error_value}"
+            ;;
+          7)
+            log_warning_msg "Stopping ${MESSAGE} Warning: Not running!"
+            return "${error_value}"
+            ;;
+          *)
+            log_failure_msg "Stopping ${MESSAGE} Error: General failure!"
+            return "${error_value}"
+            ;;
+          esac
+       ;;
+
+       force-reload)
+         message="Forcefully reloading "
+       ;;
+
+       reload)
+         message="Reloading "
+       ;;
+
+       restart)
+         message="Restarting "
+       ;;
+
+       try-restart)
+         message="Trying restart "
+       ;;
+
+       standard)
+         # $message or $MESSAGE must be set, but not both in order
+         # to use the 'standard' target.
+       ;;
+    esac
+
+    # Print messages for the generic force-reload, reload, restart, 
+    # and try-restart targets
+    if [ "${error_value}" = "0" ]
+    then
+        log_success_msg "${message}${MESSAGE} "
+        return "${error_value}"
+    else
+        log_failure_msg "${message}${MESSAGE} "
+        return "${error_value}"
+    fi
+}
+

+ 84 - 0
bootscripts/contrib/lsb-v3/init.d/localnet

@@ -0,0 +1,84 @@
+#!/bin/sh
+# Begin /etc/init.d/localnet
+
+### BEGIN INIT INFO
+# Provides:            localnet
+# Required-Start:      $local_fs
+# Should-Start:
+# Required-Stop:       $network
+# Should-Stop:         swap
+# Default-Start:       sysinit 0 6
+# Default-Stop:
+# Short-Description:   Starts the local network.
+# Description:         Sets the hostname of the machine and starts the 
+#                      loopback interface.
+# X-LFS-Default-Start: S80
+# X-LFS-Default-Stop:  S90
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+. /etc/sysconfig/network
+
+case "${1}" in
+    start)
+        ip addr add 127.0.0.1/8 label lo dev lo
+        ip link set lo up
+        if [ "${?}" = "0" ]
+                then
+                     log_success_msg "Bringing up the loopback interface..."
+                else
+                     log_failure_msg "Bringing up the loopback interface..."
+                fi
+
+        hostname "${HOSTNAME}"
+        if [ "${?}" = "0" ]
+                then
+                     log_success_msg "Setting hostname to ${HOSTNAME}..."
+                else
+                     log_failure_msg "Setting hostname to ${HOSTNAME}..."
+                fi
+
+        ;;
+
+    stop)
+        ip link set lo down
+        if [ "${?}" = "0" ]
+                then
+                     log_success_msg "Bringing down the loopback interface..."
+                else
+                     log_failure_msg "Bringing down the loopback interface..."
+                fi
+
+        ;;
+
+    restart)
+        ip link set lo down
+                retval="${?}"
+                sleep 1
+        ip addr add 127.0.0.1/8 label lo dev lo
+                retval=$(( "${retval}" + "${?}" ))
+                ip link set lo up
+                retval=$(( "${retval}" + "${?}" ))
+                hostname "${HOSTNAME}"
+                retval=$(( "${retval}" + "${?}" ))
+                if [ "${retval}" = "0" ]
+                then
+                    log_success_msg "Restarting local network..."
+                else
+                    log_failure_msg "Restarting local network..."
+                fi
+        ;;
+
+    status)
+        log_success_msg "Hostname is: ${INFO}$(hostname)${NORMAL}"
+        ip link show lo
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop|restart|status}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/localnet

+ 99 - 0
bootscripts/contrib/lsb-v3/init.d/modules

@@ -0,0 +1,99 @@
+#!/bin/sh
+# Begin /etc/init.d/modules
+
+### BEGIN INIT INFO
+# Provides:            modules
+# Required-Start:      mountkernfs
+# Should-Start:        sysctl
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Loads required modules.
+# Description:         Loads modules listed in /etc/sysconfig/modules.
+# X-LFS-Default-Start: S10
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+# Assure that the kernel has module support.
+[ -e /proc/ksyms -o -e /proc/modules ] || exit 0
+
+case "${1}" in
+    start)
+
+        # Exit if there's no modules file or there are no
+        # valid entries
+        [ -r /etc/sysconfig/modules ] &&
+            egrep -qv '^($|#)' /etc/sysconfig/modules ||
+            exit 0
+
+        # If proc is mounted, find the current kernel
+        # message level 
+        if [ -f /proc/sys/kernel/printk ]; then
+            prev_msg=`cat /proc/sys/kernel/printk | \
+                sed 'l 1' | sed -n '2~0p' | \
+                sed 's/\\\//'`
+        else 
+            prev_msg="6"
+        fi
+
+        # Now set the message level to 1 so not to make too 
+        # much noise when loading modules
+        dmesg -n 1
+
+        # Only try to load modules if the user has actually given us
+        # some modules to load.
+        if egrep -qv '^(#|$)' /etc/sysconfig/modules 2>/dev/null
+        then
+
+            # Read in the configuration file.
+            exec 9>&0 < /etc/sysconfig/modules
+
+                message="${INFO}Loading modules:"
+
+                while read module args
+                do
+                    # Ignore comments and blank lines.
+                    case "${module}" in
+                        ""|\#*) continue ;;
+                    esac
+
+                    # Attempt to load the module, making
+                    # sure to pass any arguments provided.
+                    modprobe ${module} ${args} > /dev/null
+
+                    # Print the module name if successful,
+                    # otherwise take note.
+                    if [ ${?} -eq 0 ]; then
+                        message="${message}${NORMAL} ${module}"
+                    else
+                        failedmod="${failedmod} ${module}"
+                    fi
+                done
+
+                # Print a message about successfully loaded
+                # modules on the correct line.
+                log_success_msg "${message}"
+
+                # Print a failure message with a list of any
+                # modules that may have failed to load.
+                if [ "${failedmod}" ]; then
+                    log_failure_msg "${FAILURE}Failed to load modules:${failedmod}"
+                fi
+
+            exec 0>&9 9>&-
+
+        fi
+        # Set the kernel message level back to it's previous value.
+        dmesg -n "${prev_msg}"
+        ;;
+    *)
+        echo "Usage: ${0} {start}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/modules

+ 60 - 0
bootscripts/contrib/lsb-v3/init.d/mountfs

@@ -0,0 +1,60 @@
+#!/bin/sh
+# Begin /etc/init.d/mountfs
+
+### BEGIN INIT INFO
+# Provides:            $local_fs
+# Required-Start:      udev checkfs
+# Should-Start:        lvm
+# Required-Stop:       sendsignals
+# Should-Stop:
+# Default-Start:       sysinit 0 6
+# Default-Stop:
+# Short-Description:   Mounts and unmounts all local filesystems.
+# Description:         Remounts root filesystem read/write and mounts all
+#                      remaining local filesystems defined in /etc/fstab on
+#                      start.  Rmounts root filesystem read-only and unmounts
+#                      remaining filesystems on stop.
+# X-LFS-Default-Start: S40
+# X-LFS-Default-Stop:  S70
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        message="Remounting root file system in read-write mode..."
+        mount -n -o remount,rw / >/dev/null
+        evaluate_retval standard
+
+        # Remove fsck-related file system watermarks.
+        rm -f /fastboot /forcefsck
+
+        message="Recording existing mounts in /etc/mtab..."
+        > /etc/mtab
+        mount -f / || failed=1
+        mount -f /proc || failed=1
+        mount -f /sys || failed=1
+        (exit ${failed})
+        evaluate_retval standard
+
+        # This will mount all filesystems that do not have _netdev in
+        # their option list.  _netdev denotes a network filesystem.
+        message="Mounting remaining file systems..."
+        mount -a -O no_netdev >/dev/null
+        evaluate_retval standard
+        ;;
+
+    stop)
+        message="Unmounting all other currently mounted file systems..."
+        umount -a -d -r >/dev/null
+        evaluate_retval standard
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/mountfs

+ 45 - 0
bootscripts/contrib/lsb-v3/init.d/mountkernfs

@@ -0,0 +1,45 @@
+#!/bin/sh
+# Begin /etc/init.d/mountkernfs
+
+### BEGIN INIT INFO
+# Provides:            mountkernfs
+# Required-Start:
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Mounts /sys and /proc virtual (kernel) filesystems.
+# Description:         Mounts /sys and /proc virtual (kernel) filesystems.
+# X-LFS-Default-Start: S00
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        message="Mounting kernel-based file systems:"
+
+        if ! mountpoint /proc > /dev/null; then
+            message="${message}${INFO} /proc${NORMAL}"
+            mount -n /proc || failed=1
+        fi
+
+        if ! mountpoint /sys > /dev/null; then
+            message="${message}${INFO} /sys${NORMAL}"
+            mount -n /sys || failed=1
+        fi
+
+        (exit ${failed})
+        evaluate_retval standard
+        ;;
+
+    *)
+        echo "Usage: ${0} {start}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/mountkernfs

+ 74 - 0
bootscripts/contrib/lsb-v3/init.d/network

@@ -0,0 +1,74 @@
+#!/bin/sh
+# Begin /etc/init.d/network
+
+### BEGIN INIT INFO
+# Provides:            $network
+# Required-Start:      $syslog
+# Should-Start:        
+# Required-Stop:
+# Should-Stop:         $remote_fs
+# Default-Start:       3 4 5
+# Default-Stop:        0 1 2 6
+# Short-Description:   Starts and configures network interfaces.
+# Description:         Starts and configures network interfaces.
+# X-LFS-Default-Start: S20
+# X-LFS-Default-Stop:  K80
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+. /etc/sysconfig/network
+
+case "${1}" in
+	start)
+		# Start all network interfaces
+		for file in ${NETWORK_DEVICES}/ifconfig.*
+		do
+			interface=${file##*/ifconfig.}
+
+			# skip if $file is * (because nothing was found)
+			if [ "${interface}" = "*" ]
+			then
+				continue
+			fi
+
+			IN_BOOT=1 ${NETWORK_DEVICES}/ifup ${interface}
+		done
+		;;
+
+	stop)
+		# Reverse list
+		FILES=""
+		for file in ${NETWORK_DEVICES}/ifconfig.*
+		do
+			FILES="${file} ${FILES}"
+		done
+
+		# Stop all network interfaces
+		for file in ${FILES}
+		do
+			interface=${file##*/ifconfig.}
+
+			# skip if $file is * (because nothing was found)
+			if [ "${interface}" = "*" ]
+			then
+				continue
+			fi
+
+			IN_BOOT=1 ${NETWORK_DEVICES}/ifdown ${interface}
+		done
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|restart}"
+		exit 1
+		;;
+esac
+
+# End /etc/init.d/network

+ 193 - 0
bootscripts/contrib/lsb-v3/init.d/rc

@@ -0,0 +1,193 @@
+#!/bin/sh
+# Begin $RC_BASE/init.d/rc
+
+# Get the configuration file
+# All changes are to occur in the config file
+. /etc/sysconfig/rc
+
+# These 3 signals will not cause our script to exit
+trap "" INT QUIT TSTP
+
+# Simple sanity check - rc only takes one argument
+if [ "${#}" -ne 1 ]; then
+    echo "Usage: ${0} <runlevel>" >&2
+    exit 1
+fi
+
+# Do not use the RUNLEVEL and PREVLEVEL variables provided by init so 
+# that they can be modified and alternate directories (sysinit) can 
+# be used without affecting init
+runlevel="${1}"
+prevlevel="${PREVLEVEL}"
+
+# Just in case - some flavors of init don't set PREVLEVEL to 'N'
+if [ "${prevlevel}" = "" ]; then
+    prevlevel="N"
+fi
+
+# Mount a tmpfs to store boot accounting information
+if [ "${runlevel}" = "sysinit" -a "${TEMPFS_MOUNT}" != "" ]; then
+    mount -n -t tmpfs tmpfs "${TEMPFS_MOUNT}" -o mode=600
+fi
+
+# Provide an interactive prompt (if requested)
+if [ "${runlevel}" = "sysinit" -a "${iprompt}" = "yes" ]; then
+    # ash does not accept t and n flags for read
+    ls -l /bin/sh | grep "/ash"
+    if [ "${?}" -eq "0" ]; then
+        # We are using ash
+        echo -e -n "${WARNING}WARNING:  Either bash or zsh is required"
+        echo -e "${WARNING} for interactive startup.\n"
+        sleep 3
+    else
+        echo ""
+        # dcol and icol are spaces before the message to center the
+        # message on screen.
+        dcol=$(( $(( ${COLUMNS} - ${dlen} )) / 2 ))
+        icol=$(( $(( ${COLUMNS} - ${ilen} )) / 2 ))
+        echo -e "\\033[${dcol}G${welcome_message}"
+        echo -e "\\033[${icol}G${i_message}${NORMAL}"
+        echo ""
+        read -t "${itime}" -n 1 interactive 2>&1 > /dev/null
+        if [ "${interactive}" = "I" -o "${interactive}" = "i" ]; then
+            echo -n -e "${CURS_UP}"
+            echo -e "${INFO}Interactive boot selected...${NORMAL}"
+            echo "interactive=I" > "${TEMPFS_MOUNT}/.interactive-start"
+        fi
+    fi
+fi
+
+
+# Verify that the directory exists
+if [ ! -d "${RC_BASE}/rc${runlevel}.d" ]; then
+    echo -n "${WARNING}${RC_BASE}/rc${runlevel}.d does not exist."
+    echo "${NORMAL}"
+    exit 1
+fi
+
+# Source the interactive state file if it exists
+if [ "${runlevel}" != "sysinit" -a -f "${TEMPFS_MOUNT}/.interactive-start" ]; then
+    . "${TEMPFS_MOUNT}/.interactive-start"
+fi
+
+# Prompt for interactive startup after completing sysinit
+if [ "${interactive}" = "I" -a "${runlevel}" != "sysinit" -a \
+    "${runlevel}" != "0" -a "${runlevel}" != "6" ]; then
+    echo -n -e "Proceed with interactive starup of runlevel "
+    echo -n -e "${INFO}${runlevel}${NORMAL}?"
+    echo -n -e "(${FAILURE}y${NORMAL})es/(${FAILURE}n${NORMAL})o "
+    read -n 1 go_on
+    echo ""
+    if [ "${go_on}" = "n" ]; then
+        # don't continue
+        exit 0
+    fi
+fi
+
+
+# Attempt to stop all services started in the previous runlevel,
+# that are stopped in this runlevel
+if [ "${prevlevel}" != "N" ]; then
+    for link in $(ls -v ${RC_BASE}/rc${runlevel}.d/K* 2> /dev/null)
+    do
+        # Check to see if link is a valid symlink
+        if [ ! -f ${link} ]; then
+                echo -e "${WARNING}${link} is not a valid symlink."
+                continue # go on to the next K* link
+        fi
+
+        # Check to see if link is executable
+        if [ ! -x ${link} ]; then
+                echo -e "${WARNING}${link} is not executable, skipping."
+                continue # go on to the next K* link
+        fi
+
+        script=${link#$RC_BASE/rc$runlevel.d/K[0-9][0-9]}
+        prev_start=$RC_BASE/rc$prevlevel.d/S[0-9][0-9]$script
+        sysinit_start=$RC_BASE/rcsysinit.d/S[0-9][0-9]$script
+
+        if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; then
+            if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
+                echo -e -n "${WARNING}WARNING:\n\n${link} can't be"
+                echo -e "${WARNING} executed because it was not"
+                echo -e -n "${WARNING} not started in the previous"
+                echo -e "${WARNING} runlevel (${prevlevel})."
+                echo -e "${NORMAL}"
+                continue
+            fi
+        fi
+        ${link} stop
+        error_value=${?}
+
+        if [ "${error_value}" != "0" ]; then
+            print_error_msg
+        fi
+    done
+fi
+
+# Start all functions in this runlevel if they weren't started in
+# the previous runlevel
+for link in $( ls -v ${RC_BASE}/rc${runlevel}.d/S* 2> /dev/null)
+do
+    if [ "${prevlevel}" != "N" ]; then
+        script=${link#$RC_BASE/rc$runlevel.d/S[0-9][0-9]}
+        stop=$RC_BASE/rc$runlevel.d/K[0-9][0-9]$script
+        prev_start=$RC_BASE/rc$prevlevel.d/S[0-9][0-9]$script
+
+        [ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
+    fi
+
+    # Check to see if link is a valid symlink
+    if [ ! -f ${link} ]; then
+        echo -e "${WARNING}${link} is not a valid symlink."
+        continue # go on to the next K* link
+    fi
+
+    # Check to see if link is executable
+    if [ ! -x ${link} ]; then
+        echo -e "${WARNING}${link} is not executable, skipping."
+        continue # go on to the next K* link
+    fi
+
+    case ${runlevel} in
+        0|6)
+            ${link} stop
+        ;;
+
+        *)
+            if [ "${interactive}" = "I" -o "${interactive}" = "i" ]; then
+                echo -e -n "${WARNING}Start ${INFO}${link} ${WARNING}?"
+                echo -e -n "${NORMAL}(${FAILURE}y${NORMAL})es/(${FAILURE}n${NORMAL})o "
+                read -n 1 startit 2>&1 > /dev/null
+                echo ""
+                if [ "${startit}" = "y" -o "${startit}" = "Y" ]; then
+                    ${link} start
+                else
+                    echo -e -n "${WARNING}Not starting ${INFO}${link}"
+                    echo -e "${WARNING}.${NORMAL}\n"
+                fi
+            else
+                ${link} start
+            fi
+        ;;
+    esac
+    error_value=${?}
+
+    if [ "${error_value}" -gt "1" ]; then
+        print_error_msg
+    fi
+done
+
+# Strip apply time to the logs, strip out any color codes and dump 
+# the log to /var/log/boot.log
+if [ -f "${TEMPFS_MOUNT}/.bootlog" -a "${runlevel}" != "sysinit" ]; then
+    # Remove any color codes from the temp log file
+    sed -i 's@\\033\[[0-9];[0-9][0-9]m@@g' "${TEMPFS_MOUNT}/.bootlog"
+    #Fix the time and hostname
+    BTIMESPEC=$(echo `date +"%b %d %T"` `hostname`)
+    sed -i "s@^bootlog:@${BTIMESPEC} bootlog:@" "${TEMPFS_MOUNT}/.bootlog"
+    cat "${TEMPFS_MOUNT}/.bootlog" >> /var/log/boot.log
+    rm -f "${TEMPFS_MOUNT}/.bootlog"
+fi
+
+# End $RC_BASE/init.d/rc

+ 34 - 0
bootscripts/contrib/lsb-v3/init.d/reboot

@@ -0,0 +1,34 @@
+#!/bin/sh
+# Begin /etc/init.d/reboot
+
+### BEGIN INIT INFO
+# Provides:            reboot
+# Required-Start:
+# Should-Start:
+# Required-Stop:       localnet
+# Should-Stop:
+# Default-Start:       6
+# Default-Stop:
+# Short-Description:   Reboots the system.
+# Description:         Reboots the System.
+# X-LFS-Default-Start:
+# X-LFS-Default-Stop:  S99
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    stop)
+        log_success_msg "Restarting system..."
+        reboot -d -f -i
+        ;;
+
+    *)
+        echo "Usage: ${0} {stop}"
+        exit 1
+        ;;
+
+esac
+
+# End /etc/init.d/reboot

+ 49 - 0
bootscripts/contrib/lsb-v3/init.d/sendsignals

@@ -0,0 +1,49 @@
+#!/bin/sh
+# Begin /etc/init.d/sendsignals
+
+### BEGIN INIT INFO
+# Provides:            sendsignals
+# Required-Start:
+# Should-Start:
+# Required-Stop:       $syslog
+# Should-Stop:
+# Default-Start:       0 6
+# Default-Stop:
+# Short-Description:   Attempts to kill remaining processes.
+# Description:         Attempts to kill remaining processes.
+# X-LFS-Default-Start:
+# X-LFS-Default-Stop:  S60
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    stop)
+        message="Sending all processes the TERM signal..."
+        killall5 -15
+        error_value=${?}
+
+        sleep 3
+
+        (exit ${error_value})
+        evaluate_retval standard
+
+        message="Sending all processes the KILL signal..."
+        killall5 -9
+        error_value=${?}
+
+        sleep 3
+
+        (exit ${error_value})
+        evaluate_retval standard
+        ;;
+
+    *)
+        echo "Usage: ${0} {stop}"
+        exit 1
+        ;;
+
+esac
+
+# End /etc/init.d/sendsignals

+ 61 - 0
bootscripts/contrib/lsb-v3/init.d/setclock

@@ -0,0 +1,61 @@
+#!/bin/sh
+# Begin /etc/init.d/setclock
+
+### BEGIN INIT INFO
+# Provides:            $time
+# Required-Start:      udev
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:        
+# Short-Description:   Stores and restores time from the hardware clock
+# Description:         On boot, system time is obtained from hwclock.  The
+#                      hardware clock can also be set on shutdown.
+# X-LFS-Default-Start: S25
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+BIN_FILE="/sbin/hwclock"
+CONFIGFILE="/etc/sysconfig/clock"
+
+chk_stat
+
+. "${CONFIGFILE}"
+
+CLOCKPARAMS=
+
+case "${UTC}" in
+    yes|true|1)
+        CLOCKPARAMS="${CLOCKPARAMS} --utc"
+        ;;
+
+    no|false|0)
+        CLOCKPARAMS="${CLOCKPARAMS} --localtime"
+        ;;
+
+esac
+
+case ${1} in
+    start)
+        message="Setting system clock..."
+        ${BIN_FILE} --hctosys ${CLOCKPARAMS} >/dev/null
+        evaluate_retval standard
+        ;;
+
+    stop)
+        message="Setting hardware clock..."
+        ${BIN_FILE} --systohc ${CLOCKPARAMS} >/dev/null
+        evaluate_retval standard
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop}"
+        ;;
+
+esac
+
+# End /etc/init.d/setclock

+ 57 - 0
bootscripts/contrib/lsb-v3/init.d/swap

@@ -0,0 +1,57 @@
+#!/bin/sh
+# Begin /etc/init.d/swap
+
+### BEGIN INIT INFO
+# Provides:            swap
+# Required-Start:      mountkernfs udev
+# Should-Start:        lvm
+# Required-Stop:       $local_fs
+# Should-Stop:
+# Default-Start:       sysinit 0 6
+# Default-Stop:
+# Short-Description:   Mounts and unmounts swap partitions.
+# Description:         Mounts and unmounts swap partitions defined in 
+#                      /etc/fstab.
+# X-LFS-Default-Start: S20
+# X-LFS-Default-Stop:  S80
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        message="Activating all swap files/partitions..."
+        swapon -a
+        evaluate_retval standard
+        ;;
+
+    stop)
+        message="Deactivating all swap files/partitions..."
+        swapoff -a
+        evaluate_retval standard
+        ;;
+
+    restart)
+        swapoff -a
+        error_level="${?}"
+        sleep 1
+        swapon -a
+        error_level="$(( ${error_level} + ${?} ))"
+        (exit "${error_level}")
+        evaluate_retval restart
+        ;;
+
+    status)
+        log_success_msg "Retrieving swap status..."
+        echo
+        swapon -s
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop|restart|status}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/swap

+ 41 - 0
bootscripts/contrib/lsb-v3/init.d/sysctl

@@ -0,0 +1,41 @@
+#!/bin/sh
+# Begin /etc/init.d/sysctl
+
+### BEGIN INIT INFO
+# Provides:            sysctl
+# Required-Start:      udev
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Makes changes to the proc filesystem
+# Description:         Makes changes to the proc filesystem as defined in
+#                      /etc/sysctl.conf.  See 'man sysctl(8)'.
+# X-LFS-Default-Start: S05
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        if [ -f "/etc/sysctl.conf" ]; then
+            message="Setting kernel runtime parameters..."
+            sysctl -q -p
+            evaluate_retval standard
+        fi
+        ;;
+
+    status)
+        sysctl -a    
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|status}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/sysctl

+ 71 - 0
bootscripts/contrib/lsb-v3/init.d/sysklogd

@@ -0,0 +1,71 @@
+#!/bin/sh
+# Begin /etc/init.d/sysklogd
+
+### BEGIN INIT INFO
+# Provides:            $syslog
+# Required-Start:      localnet
+# Should-Start:
+# Required-Stop:       $network
+# Should-Stop:
+# Default-Start:       2 3 4 5
+# Default-Stop:        0 1 6
+# Short-Description:   Starts kernel and system log daemons.
+# Description:         Starts kernel and system log daemons.
+#                      /etc/fstab.
+# X-LFS-Default-Start: S10
+# X-LFS-Default-Stop:  K90
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+case "${1}" in
+    start)
+        MESSAGE="system log daemon..."
+        start_daemon /usr/sbin/syslogd -m 0
+        evaluate_retval start
+
+        MESSAGE="kernel log daemon..."
+        start_daemon /usr/sbin/klogd
+        evaluate_retval start
+        ;;
+
+    stop)
+        MESSAGE="kernel log daemon..."
+        killproc /usr/sbin/klogd
+        evaluate_retval stop
+
+        MESSAGE="system log daemon..."
+        killproc /usr/sbin/syslogd
+        evaluate_retval stop
+        ;;
+
+    force-reload)
+        MESSAGE="system log daemon config file..."
+        killproc -HUP `/usr/sbin/syslogd`
+        evaluate_retval reload
+        ;;
+
+    restart)
+        MESSAGE="system and kernel log deamons..."
+        failed=0
+        killproc /usr/sbin/klogd || failed=1
+        killproc /usr/sbin/syslogd || failed=1
+        start_daemon /usr/sbin/syslogd -m 0 || failed=1
+        start_daemon /usr/sbin/klogd || failed=1
+        (exit ${failed})
+        evaluate_retval restart
+        ;;
+
+    status)
+        statusproc /usr/sbin/syslogd
+        statusproc /usr/sbin/klogd
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop|force-reload|restart|status}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/sysklogd

+ 92 - 0
bootscripts/contrib/lsb-v3/init.d/template

@@ -0,0 +1,92 @@
+#!/bin/sh
+# Begin /etc/init.d/template
+
+### BEGIN INIT INFO
+# Provides:            template
+# Required-Start:
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:
+# Default-Stop:
+# Short-Description:
+# Description: 
+# X-LFS-Default-Start:
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:
+### END INIT INFO
+
+# Source the LSB init-functions, ours are pulled in from there.
+. /lib/lsb/init-functions
+
+# These are optional, but required for chk_stat.  They will be used in 
+# the rest of the functions if defined, else you must provide a program
+# name to control, and a message ('Starting Template Service...' 
+# or 'Stoping Template Service...') to evauate_retval.  See the 
+# documentaion in the lfs-fucntions file for more information.
+MESSAGE="Template Service"
+BIN_FILE="/some/path/to/template"
+CONFIGFILE="/etc/sysconfig/template.conf"
+
+# check that $BIN_FILE exists and is executable, and $CONFIGFILE exists.
+chk_stat
+
+# LSB Defined functions require that at least $BIN_FILE be passed to them,
+# where as lfs-functions will use the $BIN_FILE environment variable.
+# loadproc() and endproc() are just wrappers that pass everything on to 
+# the LSB defined functions.
+
+case "${1}" in
+    start)
+        #start_daemon "${BIN_FILE}" -arg1 -arg2 #... or:
+        loadproc -arg1 -arg2 -arg3 #...
+        evaluate_retval start
+        ;;
+
+    stop)
+        #killproc -TERM "${BIN_FILE}" or:
+        endproc
+        evaluate_retval stop
+        ;;
+
+    force-reload)
+        reloadproc -force
+        evaluate_retval force-reload
+        ;;
+
+    restart)
+        $0 stop
+        $0 start
+        ;;
+
+    status)
+        statusproc
+        ;;
+
+# reload and try-restart are optional per LSB requirements
+    reload)
+        reloadproc
+        evaluate_retval reload
+        ;;
+
+    try-restart)
+	# Since this is optional there is no lfs-function for this one...
+        # might be at a later time if used enough, but I doubt it usefullness.
+        pidofproc "${BIN_FILE}" > /dev/null
+        if [ "${?}" -ne "0" ]; then
+            MESSAGE="${MESSAGE}: Not Running"
+        else
+            $0 stop
+            $0 start
+            exit 0
+        fi
+        evaluate_retval try-restart
+        ;;
+
+    *)
+        echo "Usage: ${0} {start|stop|{force-}reload|{try-}restart|status}"
+        exit 1
+        ;;
+esac
+
+# End /etc/init.d/template

+ 81 - 0
bootscripts/contrib/lsb-v3/init.d/udev

@@ -0,0 +1,81 @@
+#!/bin/sh
+# Begin $rc_base/init.d/udev
+
+### BEGIN INIT INFO
+# Provides:            udev
+# Required-Start:      mountkernfs
+# Should-Start:
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Populated /dev with device nodes.
+# Description:         Mounts a tempfs on /dev and starts the udevd daemon.
+#                      Device nodes are created as defined by udev.
+# X-LFS-Default-Start: S15
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+MESSAGE="Populating /dev with device nodes..."
+
+case "${1}" in
+	start)
+		if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nUnable to create" ${FAILURE}
+			boot_mesg -n " devices without a SysFS filesystem"
+			boot_mesg -n "\n\nAfter you press Enter, this system"
+			boot_mesg -n " will be halted and powered off."
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			/etc/rc.d/init.d/halt stop
+		fi
+
+		# Mount a temporary file system over /dev, so that any devices
+		# made or removed during this boot don't affect the next one.
+		# The reason we don't write to mtab is because we don't ever
+		# want /dev to be unavailable (such as by `umount -a').
+		mount -n -t tmpfs tmpfs /dev -o mode=755
+		if [ ${?} != 0 ]; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nCannot mount a tmpfs" ${FAILURE}
+			boot_mesg -n " onto /dev, this system will be halted."
+			boot_mesg -n "\n\nAfter you press Enter, this system"
+			boot_mesg -n " will be halted and powered off."
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			/etc/rc.d/init.d/halt stop
+		fi
+
+		# Udev handles uevents itself, so we don't need to have
+		# the kernel call out to any binary in response to them
+		echo > /proc/sys/kernel/hotplug
+
+		# Copy static device nodes to /dev
+		cp -a /lib/udev/devices/* /dev
+
+		# Start the udev daemon to continually watch for, and act on,
+		# uevents
+		/sbin/udevd --daemon
+
+		# Now traverse /sys in order to "coldplug" devices that have
+		# already been discovered
+		/sbin/udevadm trigger
+
+		# Now wait for udevd to process the uevents we triggered
+		/sbin/udevadm settle
+		evaluate_retval standard
+		;;
+
+	*)
+		echo "Usage ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/udev

+ 51 - 0
bootscripts/contrib/lsb-v3/init.d/udev_retry

@@ -0,0 +1,51 @@
+#!/bin/sh
+# Begin $rc_base/init.d/udev_retry
+
+### BEGIN INIT INFO
+# Provides:            udev_retry
+# Required-Start:      udev
+# Should-Start:        $local_fs
+# Required-Stop:
+# Should-Stop:
+# Default-Start:       sysinit
+# Default-Stop:
+# Short-Description:   Replays failed uevents and creates additonal devices.
+# Description:         Replays any failed uevents that were skipped due to
+#                      slow hardware initialization, and creates those needed
+#                      device nodes
+# X-LFS-Default-Start: S45
+# X-LFS-Default-Stop:
+# X-LFS-Provided-By:   LFS
+### END INIT INFO
+
+. /lib/lsb/init-functions
+
+MESSAGE="Retrying failed uevents, if any..."
+
+case "${1}" in
+	start)
+
+                # From Debian: "copy the rules generated before / was mounted
+                # read-write":
+                for file in /dev/.udev/tmp-rules--*; do
+                        dest=${file##*tmp-rules--}
+                        [ "$dest" = '*' ] && break
+                        cat $file >> /etc/udev/rules.d/$dest
+                        rm -f $file
+                done
+
+                # Re-trigger the failed uevents in hope they will succeed now
+                /sbin/udevadm trigger --retry-failed
+
+		# Now wait for udevd to process the uevents we triggered
+		/sbin/udevadm settle
+		evaluate_retval standard
+		;;
+
+	*)
+		echo "Usage ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/udev_retry

+ 577 - 0
bootscripts/contrib/lsb-v3/lsb/init-functions

@@ -0,0 +1,577 @@
+# Begin /lib/lsb/init-funtions
+
+# Provides initialization funtions as defined by the Linux Standard Base
+# specification, version 3.1.0
+
+# Source rc configuration if not inherited from the environment
+if [ "${RC_BASE}" = "" ]; then
+    . /etc/sysconfig/rc
+fi
+
+# Source the distro functions file
+if [ "${DISTRO_MINI}" != "" ]; then
+    . "${RC_BASE}/init.d/${DISTRO_MINI}-functions"
+fi
+
+################################################################################
+# start_daemon()                                                               #
+# Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...]      #
+#                                                                              #
+# Purpose: This runs the specified program as a daemon                         #
+#                                                                              #
+# Inputs: -f: (force) run the program even if it is already running.           #
+#         -n nicelevel: specify a nice level. See 'man nice(1)'.               #
+#         -p pidfile: use the specified file to determine PIDs.                #
+#         pathname: the complete path to the specified program                 #
+#         args: additional arguments passed to the program (pathname)          #
+#                                                                              #
+# Return values (as defined by LSB exit codes):                                #
+#       0 - program is running or service is OK                                #
+#       1 - generic or unspecified error                                       #
+#       2 - invalid or excessive argument(s)                                   #
+#       5 - program is not installed                                           #
+################################################################################
+start_daemon()
+{
+    local force=""
+    local nice="0"
+    local pidfile=""
+    local pidlist=""
+    local retval=""
+
+    # Process arguments
+    while true
+    do
+        case "${1}" in
+
+            -f)
+                force="1"
+                shift 1
+                ;;
+
+            -n)
+                nice="${2}"
+                shift 2
+                ;;
+
+            -p)
+                pidfile="${2}"
+                shift 2
+                ;;
+
+            -*)
+                return 2
+                ;;
+
+            *)
+                program="${1}"
+                break
+                ;;
+        esac
+    done
+
+    # Check for a valid program
+    if [ ! -e "${program}" ]
+    then
+        return 5
+    fi
+
+    # Execute
+    if [ -z "${force}" ]
+    then
+        if [ -z "${pidfile}" ]
+        then
+            # determine the pid by discovery
+            pidlist=`pidofproc "${1}"`
+            retval="${?}"
+        else
+            # The PID file contains the needed PIDs
+            # Note that by LSB requirement, the path must be given to pidofproc,
+            # however, it is not used by the current implementation or standard.
+            pidlist=`pidofproc -p "${pidfile}" "${1}"`
+            retval="${?}"
+        fi
+
+        # return a value ONLY 
+        # It is the init script's (or distribution's functions) responsibilty
+        # to log messages!
+        case "${retval}" in
+
+            0)
+                # program is already running correctly, this is a 
+                # succesful start.
+                return 0
+                ;;
+
+            1)
+                # program is not running, but an invalid pid file exists
+                # remove the pid file and continue
+                rm -f "${pidfile}"
+                ;;
+
+            3)
+                # program is not running and no pidfile exists
+                # do nothing here, let start_deamon continue.
+                ;;
+
+            *)
+                # Others as returned by status values shall not be interpreted
+                # and returned as an unspecified error.
+                return 1
+                ;;
+        esac
+    fi
+
+    # do the start!
+    nice -n "${nice}" "${@}"
+
+}
+
+################################################################################
+# killproc()                                                                   #
+# Usage: killproc [-p pidfile] pathname [signal]                               #
+#                                                                              #
+# Purpose: Send control signals to running processes                           #
+#                                                                              #
+# Inputs: -p pidfile, uses the specified pidfile                               #
+#         pathname, pathname to the specified program                          #
+#         signal, send this signal to pathname                                 #
+#                                                                              #
+# Return values (as defined by LSB exit codes):                                #
+#       0 - program (pathname) has stopped/is already stopped or a             #
+#           running program has been sent specified signal and stopped         #
+#           successfully                                                       #
+#       1 - generic or unspecified error                                       #
+#       2 - invalid or excessive argument(s)                                   #
+#       5 - program is not installed                                           #
+#       7 - program is not running and a signal was supplied                   #
+################################################################################
+killproc()
+{
+    local pidfile
+    local program
+    local prefix
+    local progname
+    local signal="-TERM"
+    local fallback="-KILL"
+    local nosig
+    local pidlist
+    local retval
+    local pid
+    local delay="30"
+    local piddead
+    local dtime
+
+    # Process arguments
+    while true
+    do
+        case "${1}" in
+
+            -p)
+                pidfile="${2}"
+                shift 2
+                ;;
+ 
+             *)
+                 program="${1}"
+                 if [ -n "${2}" ]
+                 then
+                     signal="${2}"
+                     fallback=""
+                 else
+                     nosig=1
+                 fi
+
+                 # error on additional arguments
+                 if [ -n "${3}" ]
+                 then
+                     return 2
+                 else 
+                     break
+                 fi                 
+                 ;;
+        esac
+    done
+
+    # Check for a valid program
+    if [ ! -e "${program}" ]
+    then
+        return 5
+    fi
+
+    # Check for a valid signal
+    check_signal "${signal}"
+    if [ "${?}" != "0" ]
+    then
+        return 2
+    fi
+
+    # Get a list of pids
+    if [ -z "${pidfile}" ]
+    then
+        # determine the pid by discovery
+        pidlist=`pidofproc "${1}"`
+        retval="${?}"
+    else
+        # The PID file contains the needed PIDs
+        # Note that by LSB requirement, the path must be given to pidofproc,
+        # however, it is not used by the current implementation or standard.
+        pidlist=`pidofproc -p "${pidfile}" "${1}"`
+        retval="${?}"
+    fi
+
+    # return a value ONLY
+    # It is the init script's (or distribution's functions) responsibilty
+    # to log messages!
+    case "${retval}" in
+
+        0)
+            # program is running correctly
+            # do nothing here, let killproc continue.
+            ;;
+
+        1)
+            # program is not running, but an invalid pid file exists
+            # remove the pid file.
+            rm -f "${pidfile}"
+            # this is only a success if no signal was passed.
+            if [ -n "${nosig}" ]
+            then
+                return 0
+            else
+                return 7
+            fi
+            ;;
+
+        3)
+            # program is not running and no pidfile exists
+            # this is only a success if no signal was passed.
+            if [ -n "${nosig}" ]
+            then
+                return 0
+            else
+                return 7
+            fi
+            ;;
+
+        *)
+            # Others as returned by status values shall not be interpreted
+            # and returned as an unspecified error.
+            return 1
+            ;;
+    esac
+
+    # perform different actions for exit signals and control signals
+    check_sig_type "${signal}"
+    if [ "${?}" -eq "0" ] # signal is used to terminate the program
+    then
+        # account for empty pidlist (pid file still exists and nosignal was given)
+        if [ "${pidlist}" != "" ]; then
+            #kill the list of pids
+            for pid in ${pidlist}
+            do
+                kill -0 "${pid}" 2> /dev/null
+                if [ "${?}" -ne "0" ]; then
+                    # process is dead, continue to next and assume all is well
+                    continue
+                else
+                    kill "${signal}" "${pid}" 2> /dev/null
+                    # Wait up to ${delay}/10 seconds to for "${pid}" to 
+                    # terminate in 10ths of a second
+                    while [ "${delay}" != "0" ]
+                    do
+                        kill -0 "${pid}" 2> /dev/null || piddead="1"
+                        if [ "${piddead}" = "1" ]
+                        then
+                            break
+                        fi
+                        sleep 0.1
+                        delay="$(( ${delay} - 1 ))"
+                    done
+                    # If a fallback is set, and program is still running, then
+                    # use the fallback
+                    if [ -n "${fallback}" -a "${piddead}" != "1" ]
+                    then
+                        kill "${fallback}" "${pid}" 2> /dev/null
+                        sleep 1
+                        # Check again, and fail if still running
+                        kill -0 "${pid}" 2> /dev/null && return 1
+                    else
+                        # just check one last time and if still alive, fail
+                        sleep 1
+                        kill -0 "${pid}" 2> /dev/null && return 1
+                    fi
+                fi
+            done
+        fi
+
+        # Check for and remove stale PID files.
+        if [ -z "${pidfile}" ]
+        then
+            #find the basename of $program
+            prefix=`echo "${program}" | sed 's/[^/]*$//'`
+            progname=`echo "${program}" | sed "s@${prefix}@@"`
+            if [ -e "/var/run/${progname}.pid" ]
+            then
+                rm -f "/var/run/${progname}.pid" 2> /dev/null
+            fi
+        else
+            if [ -e "${pidfile}" ]
+            then
+                rm -f "${pidfile}" 2> /dev/null
+            fi
+        fi
+
+    # For signals that do not expect a program to exit, simply
+    # let kill do it's job, and evaluate kills return for value
+    else # check_sig_type - signal is not used to terminate program
+        for pid in ${pidlist}
+        do
+            kill "${signal}" "${pid}"
+            if [ "${?}" -ne "0" ]; then
+                return 1
+            fi
+        done
+    fi
+}
+
+################################################################################
+# pidofproc()                                                                  #
+# Usage: pidofproc [-p pidfile] pathname                                       #
+#                                                                              #
+# Purpose: This function returns one or more pid(s) for a particular daemon    #
+#                                                                              #
+# Inputs: -p pidfile, use the specified pidfile instead of pidof               #
+#         pathname, path to the specified program                              #
+#                                                                              #
+# Return values (as defined by LSB status codes):                              #
+#       0 - Success (PIDs to stdout)                                           #
+#       1 - Program is dead, PID file still exists (remaining PIDs output)     #
+#       3 - Program is not running (no output)                                 #
+################################################################################
+pidofproc()
+{
+
+local pidfile
+local program
+local prefix
+local progname
+local pidlist
+local lpids
+local exitstatus="0"
+
+    # Process arguments
+    while true
+    do
+        case "${1}" in
+
+            -p)
+                pidfile="${2}"
+                shift 2
+                ;;
+
+            *)
+                program="${1}"
+                if [ -n "${2}" ]
+                then
+                    # Too many arguments
+                    # Since this is status, return unknown
+                    return 4
+                else
+                    break
+                fi
+                ;;
+        esac
+    done
+
+    # If a PID file is not specified, try and find one.
+    if [ -z "${pidfile}" ]
+    then
+        # get the program's basename
+        prefix=`echo "${program}" | sed 's/[^/]*$//'`
+        progname=`echo "${program}" | sed "s@${prefix}@@"`
+        # if a PID file exists with that name, assume that is it.
+        if [ -e "/var/run/${progname}.pid" ]
+        then
+            pidfile="/var/run/${progname}.pid"
+        fi
+    fi
+
+    # if a PID file is set and exists, use it.
+    if [ -n "${pidfile}" -a -e "${pidfile}" ]
+    then
+        # use the value in the first line of the pidfile
+        pidlist=`/bin/head -n1 "${pidfile}"`
+        # This can optionally be written as 'sed 1q' to repalce 'head -n1'
+        # should LFS move /bin/head to /usr/bin/head
+    else
+        # use pidof
+        pidlist=`pidof "${program}"`
+    fi
+
+    # Figure out if all listed PIDs are running.
+    for pid in ${pidlist}
+    do
+        kill -0 ${pid} 2> /dev/null
+        if [ "${?}" = "0" ]; then
+            lpids="${pids}${pid} "
+        else
+            exitstatus="1"
+        fi
+    done
+
+    if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then
+        return 3
+    else
+        echo "${lpids}"
+        return "${exitstatus}"
+    fi
+}
+################################################################################
+# log_success_msg()                                                            #
+# Usage: log_success_msg [$MESSAGE | "message"]                                #
+#                                                                              #
+# Purpose: Print a successful status message to the screen and optionally      #
+#          a boot log file.                                                    #
+#                                                                              #
+# Inputs: accepts one string value, either a quoted string or optionally       #
+#         the value of $MESSAGE if set in the running environment.             #
+#                                                                              #
+# Return values: Not used                                                      #
+################################################################################
+log_success_msg()
+{
+    echo -n -e "${PREFIX_SUCCESS}${@}"
+    echo -e "${SET_COL}${BRACKET}[${SUCCESS}  OK  ${BRACKET}]${NORMAL}"
+    if [ "${BOOTLOG_ENAB}" = "yes" ]; then
+        if [ $( hostname ) = "(none)" ]; then
+            BTTIMESPEC=""
+        else
+            BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
+        fi
+        echo "${BTTIMESPEC}bootlog: ${@} Successful" >> "${TEMPFS_MOUNT}/.bootlog"
+    fi
+    return 0
+}
+
+################################################################################
+# log_failure_msg()                                                            #
+# Usage: log_failure_msg [$MESSAGE | "message"]                                #
+#                                                                              #
+# Purpose: Print a failure status message to the screen and optionally         #
+#          a boot log file.                                                    #
+#                                                                              #
+# Inputs: accepts one string value, either a quoted string or optionally       #
+#         the value of $MESSAGE if set in the running environment.             #
+#                                                                              #
+# Return values: Not used                                                      #
+################################################################################
+log_failure_msg()
+{
+    echo -n -e "${PREFIX_FAILURE}${@}"
+    echo -e "${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}"
+    if [ "${BOOTLOG_ENAB}" = "yes" ]; then
+        if [ $( hostname ) = "(none)" ]; then
+            BTTIMESPEC=""
+        else
+            BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
+        fi
+        echo "${BTTIMESPEC}bootlog: ${@} Failed!" >> "${TEMPFS_MOUNT}/.bootlog"
+    fi
+    return 0
+}
+
+################################################################################
+# log_warning_msg()                                                            #
+# Usage: log_warning_msg [$MESSAGE | "message"]                                #
+#                                                                              #
+# Purpose: Print a warning status message to the screen and optionally         #
+#          a boot log file.                                                    #
+#                                                                              #
+# Inputs: accepts one string value, either a quoted string or optionally       #
+#         the value of $MESSAGE if set in the running environment.             #
+#                                                                              #
+# Return values: Not used                                                      #
+################################################################################
+log_warning_msg()
+{
+    echo -n -e "${PREFIX_WARNING}${@}"
+    echo -e "${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}"
+    if [ "${BOOTLOG_ENAB}" = "yes" ]; then
+        if [ $( hostname ) = "(none)" ]; then
+            BTTIMESPEC=""
+        else
+            BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
+        fi
+        echo "${BTTIMESPEC}bootlog: ${@} Warning" >> "${TEMPFS_MOUNT}/.bootlog"
+    fi
+    return 0
+}
+
+################################################################################
+# check_signal()                                                               #
+# Usage: check_signal [ -{signal} | {signal} ]                                 #
+#                                                                              #
+# Purpose: Check for a valid signal.  This is not defined by any LSB draft,    #
+#          however, it is required to check the signals to determine if the    #
+#          signals chosen are invalid arguments to the other functions.        #
+#                                                                              #
+# Inputs: accepts a single string value in the form or -{signal} or {signal}   #
+#                                                                              #
+# Return values:                                                               #
+#       0 - Success (signal is valid                                           #
+#       1 - Signal is not valid                                                #
+################################################################################
+check_signal()
+{
+    local valsig
+
+    # Add error handling for invalid signals
+    valsig="-ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2"
+    valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN"
+    valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP"
+    valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9"
+    valsig="${valsig} -11 -13 -14 -15"
+
+    echo "${valsig}" | grep -- " ${1} " > /dev/null
+    if [ "${?}" = "0" ]
+    then
+        return 0
+    else
+        return 1
+    fi
+}
+
+
+################################################################################
+# check_sig_type()                                                             #
+# Usage: check_signal [ -{signal} | {signal} ]                                 #
+#                                                                              #
+# Purpose: Check if signal is a program termination signal or a control signal #
+#          This is not defined by any LSB draft, however, it is required to    #
+#          check the signals to determine if they are intended to end a        #
+#          program or simply to control it.                                    #
+#                                                                              #
+# Inputs: accepts a single string value in the form or -{signal} or {signal}   #
+#                                                                              #
+# Return values:                                                               #
+#       0 - Signal is used for program termination                             #
+#       1 - Signal is used for program control                                 #
+################################################################################
+check_sig_type()
+{
+    local valsig
+
+    # The list of termination signals (limited to generally used items)
+    valsig="-ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15"
+
+    echo "${valsig}" | grep -- " ${1} " > /dev/null
+    if [ "${?}" = "0" ]
+    then
+        return 0
+    else
+        return 1
+    fi
+}
+
+# End /lib/lsb/init-functions

+ 306 - 0
bootscripts/contrib/lsb-v3/lsb/manage-functions

@@ -0,0 +1,306 @@
+#!/bin/bash
+# Begin /lib/lsb/manage-functions
+
+# /lib/lsb/manage-functions contains the functions used by 
+# /lib/lsb/install_initd and /lib/lsb/remove_initd as well as additional helper
+# functions for use in programs that would provide functionality similar to
+# the RedHat chkconfig utility, for instance.
+
+# source the confif file
+. /etc/lsb/lsb-config
+
+# Define all arrays at script start to avoid scope issues
+# scriptlist is a list of valid scripts used as an index
+declare -a scriptlist
+# fullheaders is a complete set of valid LSB headers, stored in memory for 
+# each indexed script, to avoid multiple disk reads
+declare -a fullheaders
+
+###############################################################################
+# get_headers() - Obtains a valid list of scripts contained in ${rcbase} and  #
+#                 inserts the name of the script into the scriptlist[] array  #
+#                 for use by all other functions.  Additionally, it inserts   #
+#                 the entire LSB header information from each script into a   #
+#                 second array, fullheaders[], so that diskreads need only be #
+#                 done once                                                   #
+#                 Returns no value, but populates the variable ${scriptcount} #
+#                 and the arrays ${scriptlist} and ${fullheaders} for use     #
+#                 with other functions in this script.  This function is      #
+#                 called unconditionally at the end of this scrip and is      #
+#                 provided as a function only for the case that it needs to   #
+#                 be called again after other operations.                     #
+###############################################################################
+get_headers()
+{
+    echo -n "Retrieving script information from disk..."
+    count=1
+    for file in $(find -P /etc/init.d -xdev -perm -u=x | sed -n 2~1p \
+                      | sed "s@/etc/init.d/rc@@")
+    do
+        # determine if script is an LSB compliant script
+        grep "### BEGIN INIT INFO" $file > /dev/null
+        if test $? -gt "0"
+        then
+            # this is not a valid script and is ignored
+            # skip the rest of the loop
+            continue
+        fi
+        # determine basename using only bash (is basename a builtin?)
+        filename=$(echo "${file}" | sed "s@${rcbase}/@@")
+        # assign it to an array possition
+        scriptlist["${count}"]="${filename}"
+        # find the begining of the init info for the script
+        begin=$(grep -n "### BEGIN INIT INFO" "${file}" | cut -d: -f1)
+        # find the end of the init info for the script
+        end=$(grep -n "### END INIT INFO" "${file}" | cut -d: -f1)
+        # we'll use the difference between the values in the tail command
+        diff=$(( ${end} - ${begin} ))
+        # assign the entire LSB header information as a single string to the
+        # fullheaders[] array
+        fullheaders["${count}"]=$(head -n "${end}" "${file}" \
+                                    | tail -n "${diff}")
+        count=$(( ${count} + 1 ))
+        unset begin
+        unset end
+        unset diff
+        unset filename
+    done
+    # a number or array elements would be a nice regular variable assignment
+    scriptcount="${#scriptlist[@]}"
+    unset count
+    echo -e "Completed!"
+}
+
+###############################################################################
+# print_headers() - Presents a formatted list of all LSB compliant script     #
+#                   headers to stdout preceeded by script name for use in     #
+#                   other scripts                                             #
+###############################################################################
+print_headers()
+{
+    get_headers
+    count=1
+    while test "${count}" -lt "${scriptcount}"
+    do
+        echo "${scriptlist[$count]}"
+        echo "============================================================="
+        echo "${fullheaders[$count]}"
+        echo ""
+        echo ""
+        count="$(( ${count} + 1 ))"
+    done
+}
+
+###############################################################################
+# get_index() - Determines the array index of the specified script            #
+###############################################################################
+
+get_index()
+{
+    filename=$(echo "${1}" | sed "s@${rcbase}/@@")
+    count=1
+    while test "${count}" -lt "${scriptcount}"
+    do
+        echo "${scriptlist[${count}]}" | grep "${filename}" > /dev/null
+        if test "${?}" -ne "0"
+        then
+            count=$(( ${count} + 1 ))
+            continue
+        else
+            break
+        fi
+    done
+    if test "${filename}" == "${scriptlist[${count}]}"
+    then
+        echo "${count}"
+    else
+        echo "${1} is not a valid LSB init script."
+        exit 1
+    fi
+    unset filename
+    unset count
+}
+
+###############################################################################
+# get_lsb_value() - Obtains the LSB Value of $1 for index of script ($2).     #
+###############################################################################
+get_lsb_value()
+{
+    # Probably need some error checking in here
+    echo "${fullheaders[${2}]}" | \
+        grep "^# ${1}" | \
+        sed -e "s@# ${1}:@@" \
+            -e "s/^[ \t]*//"
+}
+
+###############################################################################
+# convert_lsb_required() - Converts LSB defined facilities (facility names    #
+#                          begining with a '$' character) into script names   #
+#                          for required start/stop                            #
+###############################################################################
+convert_lsb_required()
+{
+    local count=0
+    local provides=""
+    local reqfacility=""
+    local reqprovideslist=""
+
+    for reqfacility in $@
+    do
+        # find the requires and it's index and then find the script name 
+        # from the index.  Since this is required, exit if it is not found
+        ## If reqfacility is already in script name format, nothing needs to
+        ## be done, just echo it back out.  I can't think of an easy way to
+        ## do this right now, the scriptname will be the same as the provides
+        ## anyway, so just let it fly for now...it'll be correct, it just 
+        ## takes an extra couple of commands to get the same result.
+        ## Besides, this will do some extra sanity checking in case somebody
+        ## writes a script that isn't named the same as provides, though this
+        ## isn't LSB compliant.  Additionally, these same comments apply to
+        ## the convert_lsb_should() fucntion below.
+        count=0
+        while test ${count} -lt ${scriptcount}
+        do
+            count=$(( $count + 1 ))
+            provides="$( get_lsb_value Provides ${count} )"
+            if test "${provides}" = "${reqfacility}"
+            then
+                 reqprovideslist="${reqprovideslist} ${scriptlist[$count]}"
+                 break
+            fi
+            if test ${count} -eq ${scriptcount}; then
+                # If we've never broken out of the while loop, then this is an
+                # unrecoverable error since it is a required item.  Exit now!
+                echo "Error: unable to locate required facility ${reqfacility}!"
+                exit 5
+            fi
+        done
+    done
+    echo "${reqprovideslist}" | sed -e "s/^[ \t]*//" -e "s/^[ \t]*//"
+}
+
+###############################################################################
+# convert_lsb_should() - Converts LSB defined facilities (facility names      #
+#                        begining with a '$' character) into script names for #
+#                        should start/stop                                    #
+###############################################################################
+
+convert_lsb_should()
+{
+    local count=0
+    local provides=""
+    local optfacility=""
+    local optprovideslist=""
+
+    for optfacility in $@
+    do
+        # find the should and it's index and then find the script name 
+        # from the index.  Since this is not an error, simply warn if it
+        # is not found.
+        count=0
+        while test ${count} -lt ${scriptcount}
+        do
+            count=$(( $count + 1 ))
+            provides="$( get_lsb_value Provides ${count} )"
+            if test "${provides}" = "${optfacility}"
+            then
+                 optprovideslist="${optprovideslist} ${scriptlist[$count]}"
+                 break
+            fi
+            # No need to error or warn on should items, and it's messy if so!
+        done
+    done
+    echo "${optprovideslist}" | sed -e "s/^[ \t]*//" -e "s/[ \t]*$//"
+}
+
+get_headers
+
+###############################################################################
+# get_lsb_required_value() - Additional function to simplify repetitive tasks #
+#                            Obtains the LSB Value of $1 for index of script  #
+#                            ($2) and immediately converts LSB defined        #
+#                            facilities (beginning with a '$' character) to a #
+#                            script name.  If the script is not found, then   #
+#                            the function exits with an error as per          #
+#                            convert_lsb_required.                            #
+###############################################################################
+get_lsb_required_value()
+{
+    local reqval
+    # Probably need some error checking in here
+    reqval=`echo "${fullheaders[${2}]}" | \
+        grep "^# ${1}" | \
+        sed -e "s@# ${1}:@@" \
+            -e "s/^[ \t]*//"`
+
+    # If $reqval contains a '$' charcter, then convert it to a script name
+    echo "${reqval}" | grep "\\$" 2>&1 > /dev/null
+    if test "${?}" -eq "0"
+    then
+        reqval=`convert_lsb_required "${reqval}"`
+    fi
+    echo "${reqval}"
+}
+
+###############################################################################
+# get_lsb_should_value() - Additional function to simplify repetitive tasks   #
+#                          Obtains the LSB Value of $1 for index of script    #
+#                          ($2) and immediately converts LSB defined          #
+#                          facilities (beginning with a '$' character) to a   #
+#                          script name.  If the script is not found, the      #
+#                          value is removed from the list as it is optional.  #
+###############################################################################
+get_lsb_should_value()
+{
+    local optval
+    local listitem
+    local optitem
+    # Probably need some error checking in here
+    optval=`echo "${fullheaders[${2}]}" | \
+        grep "^# ${1}" | \
+        sed -e "s@# ${1}:@@" \
+            -e "s/^[ \t]*//"`
+
+    # If $optval contains a '$' charcter, then convert it to a script name
+    echo "${optval}" | grep "\\$" 2>&1 > /dev/null
+    if test "${?}" -eq "0"
+    then
+        optval=`convert_lsb_should "${optval}"`
+        # if we still have a "$" character, then it's not found and it should
+        # be removed from the list (and it's trailing space if one exists)
+        # since it is optional
+        echo "${optval}" | grep "\\$" 2>&1 > /dev/null
+        if test "${?}" -eq "0"
+        then
+            # Remove the value
+            for listitem in ${optval} 
+            do
+                echo "${listitem}" | grep "\\$"
+                if test "${?}" -eq "0"
+                then
+                    optval=`echo "${optval}" | sed -e 's@${listitem} @@' \
+                                                   -e 's@${listitem}@@' | \
+                                sed -e "s@# ${1}:@@" \
+                                    -e "s/^[ \t]*//"`
+                fi
+            done
+        fi    
+    fi
+    # If a should start value does not have a script associted with it, then
+    # remove it (or it and trailing space) from the list
+    for optitem in ${otpval}
+    do
+        grep "${optitem}" "${statedir}/enabled-scripts" 2>&1 > /dev/null
+        if test "${?}" -ne "0"
+        then
+            optval=`echo "${optval}" | sed -e 's@${otpitem} @@' \
+                                           -e 's@${optitem}@@' | \
+                        sed -e "s@# ${1}:@@" \
+                            -e "s/^[ \t]*//"`
+        fi
+    done        
+
+    echo "${optval}"
+}
+
+# End /lib/lsb/manage-functions

+ 28 - 0
bootscripts/contrib/lsb-v3/sysconfig/createfiles

@@ -0,0 +1,28 @@
+########################################################################
+# Begin /etc/sysconfig/createfiles
+#
+# Description : Createfiles script config file
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       : The syntax of this file is as follows:
+# 		if type is equal to "file" or "dir"
+#  		<filename> <type> <permissions> <user> <group>
+# 		if type is equal to "dev"
+#  		<filename> <type> <permissions> <user> <group> <devtype> <major> <minor>
+#
+# 		<filename> is the name of the file which is to be created
+# 		<type> is either file, dir, or dev.
+#   			file creates a new file
+#   			dir creates a new directory
+#   			dev creates a new device
+# 		<devtype> is either block, char or pipe
+#   			block creates a block device
+#   			char creates a character deivce
+#   			pipe creates a pipe, this will ignore the <major> and <minor> fields
+# 		<major> and <minor> are the major and minor numbers used for the device.
+########################################################################
+
+# End /etc/sysconfig/createfiles

+ 18 - 0
bootscripts/contrib/lsb-v3/sysconfig/modules

@@ -0,0 +1,18 @@
+########################################################################
+# Begin /etc/sysconfig/modules
+#
+# Description : Module auto-loading configuration
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       : The syntax of this file is as follows:
+#  		<module> [<arg1> <arg2> ...]
+#
+# Each module should be on it's own line, and any options that you want
+# passed to the module should follow it.  The line deliminator is either
+# a space or a tab.
+########################################################################
+
+# End /etc/sysconfig/modules

+ 93 - 0
bootscripts/contrib/lsb-v3/sysconfig/network-devices/ifdown

@@ -0,0 +1,93 @@
+#!/bin/sh
+########################################################################
+# Begin $NETWORK_DEVICES/ifdown
+#
+# Description : Interface Down
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.01
+#
+# Notes       : the IFCONFIG variable is passed to the scripts found
+#               in the services directory, to indicate what file the
+#               service should source to get environmental variables.
+#
+########################################################################
+
+. /lib/lsb/init-functions
+
+# Collect a list of configuration files for our interface
+if [ -n "${2}" ]; then
+    for file in ${@#$1}; do # All parameters except $1
+        FILES="${FILES} ${NETWORK_DEVICES}/ifconfig.${1}/${file}"
+    done
+elif [ -d "${NETWORK_DEVICES}/ifconfig.${1}" ]; then
+    FILES=`echo ${NETWORK_DEVICES}/ifconfig.${1}/*`
+else
+    FILES="${NETWORK_DEVICES}/ifconfig.${1}"
+fi
+
+# Reverse the order configuration files are processed in
+for file in ${FILES}; do
+    FILES2="${file} ${FILES2}"
+done
+FILES=${FILES2}
+
+# Process each configuration file
+for file in ${FILES}; do
+    # skip backup files
+    if [ "${file}" != "${file%""~""}" ]; then
+        continue
+    fi
+
+    if [ ! -f "${file}" ]; then
+        message="${file} is not a network configuration file or directory."
+        log_warning_msg
+    fi
+    (
+        . ${file}
+
+        # Will not process this service if started by boot, and ONBOOT
+        # is not set to yes
+        if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
+            continue
+        fi
+
+        # Will not process this service if started by hotplug, and 
+        # ONHOTPLUG is not set to yes
+        if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then
+            continue
+        fi
+    
+        # This will run the service script, if SERVICE is set
+        if [ -n "${SERVICE}" -a -x "${NETWORK_DEVICES}/services/${SERVICE}" ]; then
+            if ip link show ${1} > /dev/null 2>&1
+            then
+                IFCONFIG=${file} ${NETWORK_DEVICES}/services/${SERVICE} ${1} down
+            else
+                message="Interface ${1} doesn't exist."
+                log_warning_msg
+            fi
+        else
+            echo -e "${FAILURE}Unable to process ${file}.  Either"
+            echo -e "${FAILURE}the SERVICE variable was not set,"
+            echo -e "${FAILURE}or the specified service cannot be executed."
+            message=""
+            log_failure_msg
+        fi
+    )
+done
+
+if [ -z "${2}" ]; then
+    link_status=`ip link show $1`
+    if [ -n "${link_status}" ]; then
+        if echo "${link_status}" | grep -q UP; then
+            message="Bringing down the ${1} interface..."
+            ip link set ${1} down
+            evaluate_retval standard
+        fi
+    fi
+fi
+
+# End $NETWORK_DEVICES/ifdown

+ 87 - 0
bootscripts/contrib/lsb-v3/sysconfig/network-devices/ifup

@@ -0,0 +1,87 @@
+#!/bin/sh
+########################################################################
+# Begin $NETWORK_DEVICES/ifup
+#
+# Description : Interface Up
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       : the IFCONFIG variable is passed to the scripts found
+#               in the services directory, to indicate what file the
+#               service should source to get environmental variables.
+#
+########################################################################
+
+. /lib/lsb/init-functions 
+
+# Collect a list of configuration files for our interface
+if [ -n "${2}" ]; then
+    for file in ${@#$1} # All parameters except $1
+  do
+        FILES="${FILES} ${NETWORK_DEVICES}/ifconfig.${1}/${file}"
+    done
+elif [ -d "${NETWORK_DEVICES}/ifconfig.${1}" ]; then
+    FILES=`echo ${NETWORK_DEVICES}/ifconfig.${1}/*`
+else 
+    FILES="${NETWORK_DEVICES}/ifconfig.${1}"
+fi
+
+message="Bringing up the ${1} interface..."
+
+# Process each configruation file
+for file in ${FILES}; do
+    # skip backup files
+    if [ "${file}" != "${file%""~""}" ]; then
+        continue
+    fi
+
+    if [ ! -f "${file}" ]; then
+        log_warning_msg
+        message="${file} is not a network configuration file or directory."
+        log_warning_msg
+    fi
+
+    (
+        . ${file}
+
+        # Will not process this service if started by boot, and ONBOOT
+        # is not set to yes
+        if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
+            continue
+        fi
+        # Will not process this service if started by hotplug, and 
+        # ONHOTPLUG is not set to yes
+        if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" -a "${HOSTNAME}" != "(none)" ]; then
+             continue
+        fi
+
+        if [ -n "${SERVICE}" -a -x "${NETWORK_DEVICES}/services/${SERVICE}" ]; then
+            if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then
+                if ip link show ${1} > /dev/null 2>&1; then
+                    link_status=`ip link show ${1}`
+                    if [ -n "${link_status}" ]; then
+                        if ! echo "${link_status}" | grep -q UP; then
+                            ip link set ${1} up
+                            evaluate_retval standard
+                        fi
+                    fi
+                else
+                    message="${message}Interface ${1} doesn't exist."
+                    log_warning_msg
+                fi
+            fi
+            IFCONFIG=${file} ${NETWORK_DEVICES}/services/${SERVICE} ${1} up
+        else
+            echo -e "${FAILURE}Unable to process ${file}.  Either"
+            echo -e "${FAILURE}the SERVICE variable was not set,"
+            echo -e "${FAILURE}or the specified service cannot be executed."
+            message=""
+            log_failure_msg
+        fi
+    )
+done
+
+# End $NETWORK_DEVICES/ifup

+ 80 - 0
bootscripts/contrib/lsb-v3/sysconfig/network-devices/services/ipv4-static

@@ -0,0 +1,80 @@
+#!/bin/sh
+########################################################################
+# Begin $NETWORK_DEVICES/services/ipv4-static
+#
+# Description : IPV4 Static Boot Script
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#		Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /lib/lsb/init-functions
+. ${IFCONFIG}
+
+if [ -z "${IP}" ]; then
+	log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue."
+	exit 1
+fi
+
+if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
+	log_warning_msg "PREFIX variable missing from ${IFCONFIG}, assuming 24."
+	PREFIX=24
+	args="${args} ${IP}/${PREFIX}"
+elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
+	log_failure_msg "PREFIX and PEER both specified in ${IFCONFIG}, cannot continue."
+	exit 1
+elif [ -n "${PREFIX}" ]; then
+	args="${args} ${IP}/${PREFIX}"
+elif [ -n "${PEER}" ]; then
+	args="${args} ${IP} peer ${PEER}"
+fi
+
+if [ -n "${BROADCAST}" ]; then
+	args="${args} broadcast ${BROADCAST}"
+fi
+
+if [ -n "${SOURCE}" ]; then
+	args="${args} src ${SOURCE}"
+fi
+
+case "${2}" in
+	up)
+		MESSAGE="Adding IPv4 address ${IP} to the ${1} interface..."
+		ip addr add ${args} dev ${1}
+		evaluate_retval
+	
+		if [ -n "${GATEWAY}" ]; then
+			if ip route | grep -q default; then
+				log_warning_msg "Gateway already setup; skipping." ${WARNING}
+			else
+				MESSAGE="Setting up default gateway..."
+				ip route add default via ${GATEWAY} dev ${1}
+				evaluate_retval
+			 fi
+		fi
+	;;
+	
+	down)
+		if [ -n "${GATEWAY}" ];	then
+			MESSAGE="Removing default gateway..."
+			ip route del default
+			evaluate_retval
+		fi
+	
+		MESSAGE="Removing IPv4 address ${IP} from the ${1} interface..."
+		ip addr del ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	*)
+		echo "Usage: ${0} [interface] {up|down}"
+		exit 1
+	;;
+esac
+
+# End $NETWORK_DEVICES/services/ipv4-static

+ 92 - 0
bootscripts/contrib/lsb-v3/sysconfig/network-devices/services/ipv4-static-route

@@ -0,0 +1,92 @@
+#!/bin/sh
+########################################################################
+# Begin $NETWORK_DEVICES/services/ipv4-static-route
+#
+# Description : IPV4 Static Route Script
+#
+# Authors     : Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /lib/lsb/init-functions
+. ${IFCONFIG}
+
+case "${TYPE}" in
+	("" | "network")
+		need_ip=1
+		need_gateway=1
+	;;
+
+	("default")
+		need_gateway=1
+		args="${args} default"
+		desc="default"
+	;;
+
+	("host")
+		need_ip=1
+	;;
+
+	("unreachable")
+		need_ip=1
+		args="${args} unreachable"
+		desc="unreachable "
+	;;
+
+	(*)
+		boot_mesg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	;;
+esac
+
+if [ -n "${need_ip}" ]; then
+	if [ -z "${IP}" ]; then
+		boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+
+	if [ -z "${PREFIX}" ]; then
+		boot_mesg "PREFIX variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+	
+	args="${args} ${IP}/${PREFIX}"
+	desc="${desc}${IP}/${PREFIX}"
+fi
+
+if [ -n "${need_gateway}" ]; then
+	if [ -z "${GATEWAY}" ]; then
+		boot_mesg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+	args="${args} via ${GATEWAY}"
+fi
+
+case "${2}" in
+	up)
+		boot_mesg "Adding '${desc}' route to the ${1} interface..."
+		ip route add ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	down)
+		boot_mesg "Removing '${desc}' route from the ${1} interface..."
+		ip route del ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	*)
+		echo "Usage: ${0} [interface] {up|down}"
+		exit 1
+	;;
+esac
+
+# End $NETWORK_DEVICES/services/ipv4-static-route

+ 52 - 0
bootscripts/contrib/lsb-v3/sysconfig/rc

@@ -0,0 +1,52 @@
+# Begin /etc/sysconfig/rc
+
+# Author: DJ Lucas - dj@linuxfromscratch.org
+# Version: 1.0 LSB V.3.1
+
+# Global variable inherited by initscripts are in caps
+# Local variables for the rc script are in lowercase
+
+# Source site specific rc configuration
+. /etc/sysconfig/rc.site
+
+# This sets default terminal options.
+# stty sane - this has been removed as nobody recalls
+# the reason for it in the first place - if no problems arize,
+# then it will be removed completely at a later date.
+
+# Setup default values for the environment
+umask 022
+PATH="/bin:/sbin"
+
+# Find current screen size
+if [ -z "${COLUMNS}" ]; then
+        COLUMNS=$(stty size)
+        COLUMNS=${COLUMNS##* }
+fi
+
+# When using remote connections, such as a serial port, stty size returns 0
+if [ "${COLUMNS}" = "0" ]; then
+        COLUMNS=80
+fi
+
+## Measurements for positioning result messages
+COL=$((${COLUMNS} - 8))
+WCOL=$((${COL} - 2))
+
+# Set Cursur Position Commands, used via echo -e
+SET_COL="\\033[${COL}G"      # at the $COL char
+SET_WCOL="\\033[${WCOL}G"    # at the $WCOL char
+CURS_UP="\\033[1A\\033[0G"   # Up one line, at the 0'th char
+
+# Bootlogging and interactive startup require a valid tempfs mount
+# if this mount is not present, disable them
+if [ "${TEMPFS_MOUNT}" = "" -o ! -d "${TEMPFS_MOUNT}" ]; then
+    TEMPFS_MOUNT=""
+    iprompt=""
+    BOOTLOG_ENAB=""
+fi
+
+# Export the environment variables so they are inherited by the scripts
+export PATH SET_COL SET_WCOL CURS_UP TEMPFS_MOUNT BOOTLOG_ENAB RUNLEVEL
+
+# End /etc/sysconfig/rc

+ 69 - 0
bootscripts/contrib/lsb-v3/sysconfig/rc.site

@@ -0,0 +1,69 @@
+# Set base directory information
+RC_BASE="/etc"
+RC_FUNCTIONS="${RC_BASE}/init.d/lfs-functions"
+
+# Location of network device scripts and config files
+NETWORK_DEVICES="/etc/sysconfig/network-devices"
+
+# Directory to store boot process accounting information
+# Used for boot logging and interactive flag when rootfs
+# is not writable
+TEMPFS_MOUNT="${RC_BASE}/init.d/boottemp"
+
+# Bootlogging (requires a tempfs mount)
+BOOTLOG_ENAB="yes"
+
+# Distro Information
+DISTRO="Linux From Scratch" # The distro name
+DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address
+DISTRO_MINI="lfs" # Short name used in filenames for distro config
+
+# Define custom colors used in messages printed to the screen
+BRACKET="\\033[1;34m" # Blue
+FAILURE="\\033[1;31m" # Red
+INFO="\\033[1;36m"    # Cyan
+NORMAL="\\033[0;39m"  # Grey
+SUCCESS="\\033[1;32m" # Green
+WARNING="\\033[1;33m" # Yellow
+
+# Prefix boot messages for easier reading on framebuffer consoles
+PREFIX_SUCCESS=" ${SUCCESS}*${NORMAL} "
+PREFIX_WARNING="${WARNING}**${NORMAL} "
+PREFIX_FAILURE="${FAILURE}***${NORMAL}"
+
+# Export varialbles so that they are inherited by the initscripts
+export RC_BASE RC_FUNCTIONS NETWORK_DEVICES TEMPFS_MOUNT BOOTLOG_ENAB
+export DISTRO DISTRO_CONTACT DISTRO_MINI
+export BRACKET FAILURE INFO NORMAL SUCCESS WARNING
+export PREFIX_SUCCESS PREFIX_WARNING PREFIX_FAILURE
+
+# Interactive startup
+iprompt="yes" # Wether to display the interactive boot promp
+itime="2" # The ammount of time (in seconds) to display the prompt
+dlen="29" # The total length of the distro welcome string
+ilen="38" # The total length of the interactive message
+welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}"
+i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup"
+
+# Error message displayed when a script's exit value is not zero
+print_error_msg()
+{
+    # ${link} and ${error_value} are defined by the rc script
+    echo -e "${FAILURE}FAILURE:  You should not be reading this error message."
+    echo -e ""
+    echo -e -n "${FAILURE}It means that an unforseen error took place in"
+    echo -e -n "${INFO} ${link}"
+    echo -e "${FAILURE},"
+    echo -e "${FAILURE}which exited with a return value of ${error_value}."
+    echo -e ""
+    echo -e -n "${FAILURE}If you are able to track this error down to a bug"
+    echo -e "${FAILURE}in one of the files"
+    echo -e -n "provided by ${INFO}${DISTRO}${FAILURE}, "
+    echo -e -n "${FAILURE}please be so kind to inform us at "
+    echo -e "${INFO}${DISTRO_CONTACT}${FAILURE}.${NORMAL}"
+    echo -e ""
+    echo -e "${INFO}Press Enter to continue..."
+    echo -e "${NORMAL}"
+    read ENTER
+}
+

+ 11 - 0
bootscripts/contrib/lsb/Makefile

@@ -0,0 +1,11 @@
+ETCDIR=/etc
+EXTDIR=${DESTDIR}${ETCDIR}
+MODE=754
+DIRMODE=755
+CONFMODE=644
+
+install:
+	install -d -m ${DIRMODE} ${DESTDIR}/lib/lsb
+	install -m ${CONFMODE} lib/init-functions ${DESTDIR}/lib/lsb
+
+.PHONY: install

+ 348 - 0
bootscripts/contrib/lsb/lib/init-functions

@@ -0,0 +1,348 @@
+
+#*******************************************************************************
+# Function - start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args]
+#
+# Purpose: This runs the specified program as a daemon
+#
+# Inputs: -f, run the program even if it is already running
+#         -n nicelevel, specifies a nice level. See nice(1).
+#         -p pidfile, uses the specified pidfile
+#         pathname, pathname to the specified program
+#         args, arguments to pass to specified program
+#
+# Outputs: return 0 - Success
+#          return 2 - Invalid or excessive number of arguments, 
+#                     warning in stdout
+#          return 4 - Program or service status is unknown
+#
+# Dependencies: nice
+#
+# Todo: none
+#
+#*******************************************************************************
+start_daemon()
+{
+  local pidfile=""
+	local forcestart=""
+	local nicelevel="0"
+
+	while true
+	do
+	  case "${1}" in
+			-f)
+				forcestart="1"
+				shift 1
+				;;
+			-n)
+				nicelevel="${2}"
+				shift 2
+				;;
+	    -p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ -z "${forcestart}" ]; then
+		if [ -z "${pidfile}" ]; then
+			pidofproc "${1}" > /dev/null
+		else
+			pidofproc -p "${pidfile}" "${1}" > /dev/null
+		fi
+
+		case "${?}" in
+			0)
+				log_warning_msg "Unable to continue: ${1} is running"
+				return 4
+				;;
+			1)
+				log_warning_msg "Unable to continue: ${pidfile} exists"
+				return 4
+				;;
+			3)
+				;;
+			*)
+				log_failure_msg "Unknown error code from pidofproc: ${?}"
+				return 4
+				;;
+		esac
+	fi
+
+	nice -n "${nicelevel}" "${@}"
+}
+
+#*******************************************************************************
+# Function - killproc  [-p pidfile] pathname [signal]
+#
+# Purpose:
+#
+# Inputs: -p pidfile, uses the specified pidfile
+#         pathname, pathname to the specified program
+#         signal, send this signal to pathname
+#
+# Outputs: return 0 - Success
+#          return 1 - Invalid or excessive number of arguments, 
+#                     warning in stdout
+#          return 4 - Unknown Status
+#
+# Dependencies: kill
+#
+# Todo: test
+#
+#*******************************************************************************
+killproc()
+{
+	local pidfile=""
+	local killsig=""
+	local pidlist=""
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 1
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" = "2" ]; then
+		killsig="${2}"
+	elif [ "${#}" != "1" ]; then
+		shift 2
+		log_failure_msg "Excess Arguments: $@"
+		return 1
+	fi
+
+	if [ -z "${pidfile}" ]; then
+		pidlist=`pidofproc "${1}"`
+	else
+		pidlist=`pidofproc -p "${pidfile}" "${1}"`
+	fi
+
+	for pid in ${pidlist}
+	do
+		kill -${killsig:-TERM} ${pid} 2> /dev/null
+		if [ -z "${killsig}" ]; then
+			# Wait up to 3 seconds, for ${pid} to terminate
+			local dtime=3
+			while [ "${dtime}" != "0" ]
+			do
+				kill -0 ${pid} 2> /dev/null || break
+				sleep 1
+				dtime=$(( ${dtime} - 1))
+			done
+			# If ${pid} is still running, kill it
+			kill -0 ${pid} 2> /dev/null && kill -KILL ${pid} 2> /dev/null
+		fi
+	done
+
+	if [ -z "${killsig}" ]; then
+		pidofproc "${1}" 2>&1 > /dev/null
+	
+		# Program was terminated
+		if [ "$?" != "0" ]; then
+			# Pidfile Exists
+			if [ -f "${pidfile}" ];	then
+				rm -f "${pidfile}" 2>&1 > /dev/null
+			fi
+			return 0
+		else # Program is still running
+			return 4 # Unknown Status
+		fi
+	else
+		if [ -z "${pidfile}" ]; then
+			pidofproc "${1}" 2> /dev/null
+		else
+			pidofproc -p "${pidfile}" "${1}" 2> /dev/null
+		fi
+	fi
+}
+
+#*******************************************************************************
+# Function - pidofproc [-p pidfile] pathname
+#
+# Purpose: This function returns one or more pid(s) for a particular daemon
+#
+# Inputs: -p pidfile, use the specified pidfile instead of pidof
+#         pathname, path to the specified program
+#
+# Outputs: return 0 - Success, pid's in stdout
+#          return 1 - Invalid or excessive number of arguments, 
+#                     warning in stdout
+#          return 1 - Program is dead, pidfile exists
+#          return 3 - Program is not running
+#
+# Dependencies: pidof, echo
+#
+# Todo: - Invalid or excessive argments, and program is dead pidfile exists
+#         conflict with eachother
+#
+#*******************************************************************************
+pidofproc()
+{
+	local pidfile=""
+	local lpids=""
+	local pidlist=""
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 1
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" != "1" ]; then
+		shift 1
+		log_failure_msg "Excess Arguments: $@"
+		return 1
+	fi
+
+	if [ -n "${pidfile}" ]; then
+		if [ ! -r "${pidfile}" ]; then
+			return 3 # Program is not running
+		fi
+
+		lpids=`head -n 1 ${pidfile}`
+		for pid in ${lpids}
+		do
+			if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
+				kill -0 "${pid}" 2> /dev/null &&
+				pidlist="${pidlist} ${pid}"
+			fi
+			echo ${pidlist}
+			test -z "${pidlist}" && return 1 # Program is dead, pidfile exists
+			return 0
+		done
+		
+	else
+		pidof "${1}"
+	fi
+
+	if [ "$?" != "0" ]; then
+		return 3 # Program is not running
+	fi
+}
+
+# Screen Dimentions
+if [ -z "${COLUMNS}" ]; then
+  COLUMNS=$(stty size)
+  COLUMNS=${COLUMNS##* }
+fi
+
+# When using remote connections, such as a serial port, stty size returns 0
+if [ "${COLUMNS}" = "0" ]; then
+  COLUMNS=80
+fi
+
+# Measurements for positioning result messages
+COL=$((${COLUMNS} - 8))
+WCOL=$((${COL} - 2))
+
+# Set Cursur Position Commands, used via echo -e
+SET_COL="\\033[${COL}G"      # at the $COL char
+SET_WCOL="\\033[${WCOL}G"    # at the $WCOL char
+CURS_UP="\\033[1A\\033[0G"   # Up one line, at the 0'th char
+
+# Set color commands, used via echo -e
+# Please consult `man console_codes` for more information
+# under the "Set Graphics Resolution" section
+#
+# Warning, when switching from a 8bit to a 9bit font,
+# the linux console will reinterpret the bold (1;) to
+# the top 256 glyphs of the 9bit font.  This does
+# not affect framebuffer consoles
+NORMAL="\\033[0;39m"         # Standard console grey
+SUCCESS="\\033[1;32m"        # Success is green
+WARNING="\\033[1;33m"        # Warnings are yellow
+FAILURE="\\033[1;31m"        # Failures are red
+INFO="\\033[1;36m"           # Information is light cyan
+BRACKET="\\033[1;34m"        # Brackets are blue
+
+BOOTMESG_PREFIX=" * "        # Text at the beginning of every line
+
+
+#*******************************************************************************
+# Function - log_success_msg "message"
+#
+# Purpose: Print a success message
+#
+# Inputs:
+#
+# Outputs:
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_success_msg()
+{
+	echo -n -e "${BOOTMESG_PREFIX}${@}"
+	echo -e "${SET_COL}""${BRACKET}""[""${SUCCESS}""  OK  ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+
+#*******************************************************************************
+# Function - log_failure_msg "message"
+#
+# Purpose: Print a failure message
+#
+# Inputs: $@ - Message
+#
+# Outputs: Text output to screen
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_failure_msg() {
+	echo -n -e "${BOOTMESG_PREFIX}${@}"
+	echo -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+
+#*******************************************************************************
+# Function - log_warning_msg "message"
+#
+# Purpose: print a warning message
+#
+# Inputs: $@ - Message
+#
+# Outputs: Text output to screen
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_warning_msg() {
+	echo -n -e "${BOOTMESG_PREFIX}${@}"
+	echo -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+

+ 45 - 0
bootscripts/contrib/sysconfig/network-devices/services/mtu

@@ -0,0 +1,45 @@
+#!/bin/sh
+########################################################################
+# Begin $network_devices/services/mtu
+#
+# Description : Sets MTU per interface
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#		Jim Gifford - jim@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       : This sets the maximum amount of bytes that can be
+#		transmitted within a packet.  By default, this
+#		value is set to 1500.
+#
+########################################################################
+
+. /etc/sysconfig/rc 
+. ${rc_functions}
+. ${IFCONFIG}
+
+if [ -z "${MTU}" ]
+then
+	boot_mesg "MTU variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+	echo_failure
+	exit 1
+fi
+
+case "${2}" in
+	up)
+		boot_mesg "Setting the MTU for ${1} to ${MTU}..."
+		echo "${MTU}" > "/sys/class/net/${1}/mtu"
+		evaluate_retval
+	;;
+	
+	down)
+	;;
+	
+	*)
+		echo "Usage: ${0} [interface] {up|down}"
+		exit 1
+	;;
+esac
+
+# End $network_devices/services/mtu

+ 131 - 0
bootscripts/lfs/init.d/checkfs

@@ -0,0 +1,131 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/checkfs
+#
+# Description : File System Check
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#		A. Luebke - luebke@users.sourceforge.net
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+# Based on checkfs script from LFS-3.1 and earlier.
+#
+# From man fsck
+# 0    - No errors
+# 1    - File system errors corrected
+# 2    - System should be rebooted
+# 4    - File system errors left uncorrected
+# 8    - Operational error
+# 16   - Usage or syntax error
+# 32   - Fsck canceled by user request
+# 128  - Shared library error
+#
+#########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		if [ -f /fastboot ]; then
+			boot_mesg -n "/fastboot found, will not perform" ${INFO}
+			boot_mesg " file system checks as requested."
+			echo_ok
+			exit 0
+		fi
+
+		boot_mesg "Mounting root file system in read-only mode..."
+		mount -n -o remount,ro / >/dev/null
+		evaluate_retval
+
+		if [ ${?} != 0 ]; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nCannot check root" ${FAILURE}
+			boot_mesg -n " filesystem because it could not be mounted"
+			boot_mesg -n " in read-only mode.\n\nAfter you"
+			boot_mesg -n " press Enter, this system will be"
+			boot_mesg -n " halted and powered off."
+			boot_mesg -n "\n\nPress enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			${rc_base}/init.d/halt stop
+		fi
+
+		if [ -f /forcefsck ]; then
+			boot_mesg -n "/forcefsck found, forcing file" ${INFO}
+			boot_mesg " system checks as requested."
+			echo_ok
+			options="-f"
+		else
+			options=""
+		fi
+
+		boot_mesg "Checking file systems..."
+		# Note: -a option used to be -p; but this fails e.g.
+		# on fsck.minix
+		fsck ${options} -a -A -C -T
+		error_value=${?}
+
+		if [ "${error_value}" = 0 ]; then
+			echo_ok
+		fi
+
+		if [ "${error_value}" = 1 ]; then
+			echo_warning
+			boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
+			boot_mesg -n " were found and have been corrected."
+			boot_mesg -n "  You may want to double-check that"
+			boot_mesg -n " everything was fixed properly."
+			boot_mesg "" ${NORMAL}
+		fi
+
+		if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
+			echo_warning
+			boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
+			boot_mesg -n " were found and have been been"
+ 			boot_mesg -n " corrected, but the nature of the"
+			boot_mesg -n " errors require this system to be"
+			boot_mesg -n " rebooted.\n\nAfter you press enter,"
+			boot_mesg -n " this system will be rebooted"
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			reboot -f
+		fi
+
+		if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nFile system errors" ${FAILURE}
+			boot_mesg -n " were encountered that could not be"
+			boot_mesg -n " fixed automatically.  This system"
+			boot_mesg -n " cannot continue to boot and will"
+			boot_mesg -n " therefore be halted until those"
+			boot_mesg -n " errors are fixed manually by a"
+			boot_mesg -n " System Administrator.\n\nAfter you"
+			boot_mesg -n " press Enter, this system will be"
+			boot_mesg -n " halted and powered off."
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+		  ${rc_base}/init.d/halt stop
+		fi
+
+		if [ "${error_value}" -ge 16 ]; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nUnexpected Failure" ${FAILURE}
+			boot_mesg -n " running fsck.  Exited with error"
+			boot_mesg -n " code: ${error_value}."
+			boot_mesg "" ${NORMAL}
+			exit ${error_value}
+		fi
+		;;
+	*)
+		echo "Usage: ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/checkfs

+ 110 - 0
bootscripts/lfs/init.d/cleanfs

@@ -0,0 +1,110 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/cleanfs
+#
+# Description : Clean file system
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+# Function to create files/directory on boot.
+create_files() {
+	# Read in the configuration file.
+	exec 9>&0 < /etc/sysconfig/createfiles
+		while read name type perm usr grp dtype maj min junk
+		do
+
+			# Ignore comments and blank lines.
+       			case "${name}" in
+				""|\#*) continue ;;
+			esac
+
+			# Ignore existing files.
+			if [ ! -e "${name}" ]; then
+				# Create stuff based on its type.
+				case "${type}" in
+					dir)
+						mkdir "${name}"
+						;;
+					file)
+						:> "${name}"
+						;;
+					dev)
+						case "${dtype}" in
+							char)
+								mknod "${name}" c ${maj} ${min}
+								;;
+							block)
+								mknod "${name}" b ${maj} ${min}
+								;;
+							pipe)
+								mknod "${name}" p
+								;;
+							*) 
+								boot_mesg -n "\nUnknown device type: ${dtype}" ${WARNING}
+								boot_mesg "" ${NORMAL}
+								;;
+						esac
+						;;
+					*)
+						boot_mesg -n "\nUnknown type: ${type}" ${WARNING}
+						boot_mesg "" ${NORMAL}
+						continue
+						;;
+				esac
+
+				# Set up the permissions, too.
+				chown ${usr}:${grp} "${name}"
+				chmod ${perm} "${name}"
+			fi
+		done
+	exec 0>&9 9>&-
+}
+
+case "${1}" in
+	start)
+		boot_mesg -n "Cleaning file systems:" ${INFO}
+
+		boot_mesg -n " /tmp" ${NORMAL}
+		cd /tmp &&
+		find . -xdev -mindepth 1 ! -name lost+found \
+			-delete || failed=1
+
+		boot_mesg -n " /var/lock" ${NORMAL}
+		cd /var/lock &&
+		find . -type f ! -newer /proc -exec rm -f {} \; || failed=1
+
+		boot_mesg " /var/run" ${NORMAL}
+		cd /var/run &&
+		find . ! -type d ! -name utmp ! -newer /proc \
+			-exec rm -f {} \; || failed=1
+		> /var/run/utmp
+		if grep -q '^utmp:' /etc/group ; then
+			chmod 664 /var/run/utmp
+			chgrp utmp /var/run/utmp
+		fi
+
+		(exit ${failed})
+		evaluate_retval
+
+		if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then
+			boot_mesg "Creating files and directories..."
+			create_files
+			evaluate_retval
+		fi
+		;;
+	*)
+		echo "Usage: ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/cleanfs

+ 109 - 0
bootscripts/lfs/init.d/console

@@ -0,0 +1,109 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/console
+#
+# Description : Sets keymap and screen font
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#		Alexander E. Patrakov
+#
+# Version     : 00.03
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+# Native English speakers probably don't have /etc/sysconfig/console at all
+if [ -f /etc/sysconfig/console ]
+then
+	. /etc/sysconfig/console
+else
+        exit 0
+fi
+
+is_true() {
+	[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
+}
+
+failed=0
+
+case "${1}" in
+	start)
+		boot_mesg "Setting up Linux console..."
+		# There should be no bogus failures below this line!
+		
+		# Figure out if a framebuffer console is used
+		[ -d /sys/class/graphics/fb0 ] && USE_FB=1 || USE_FB=0
+		
+		# Figure out the command to set the console into the
+		# desired mode
+		is_true "${UNICODE}" &&
+			MODE_COMMAND="${ECHO} -en '\033%G' && kbd_mode -u" ||
+			MODE_COMMAND="${ECHO} -en '\033%@\033(K' && kbd_mode -a"
+		
+		# On framebuffer consoles, font has to be set for each vt in
+		# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
+		
+		! is_true "${USE_FB}" || [ -z "${FONT}" ] ||
+			MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
+
+		# Apply that command to all consoles mentioned in
+		# /etc/inittab. Important: in the UTF-8 mode this should
+		# happen before setfont, otherwise a kernel bug will
+		# show up and the unicode map of the font will not be
+		# used.
+		# FIXME: Fedora Core also initializes two spare consoles
+		# - do we want that?
+		
+		for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
+			grep -o '\btty[[:digit:]]*\b'`
+		do
+			openvt -f -w -c ${TTY#tty} -- \
+				/bin/sh -c "${MODE_COMMAND}" || failed=1
+		done
+
+		# Set the font (if not already set above) and the keymap
+		is_true "${USE_FB}" || [ -z "${FONT}" ] ||
+			setfont $FONT ||
+			failed=1
+		[ -z "${KEYMAP}" ] ||
+			loadkeys ${KEYMAP} >/dev/null 2>&1 ||
+			failed=1
+		[ -z "${KEYMAP_CORRECTIONS}" ] ||
+			loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
+			failed=1
+
+		# Linux kernel generates wrong bytes when composing
+		# in Unicode mode. That's why we disable dead keys in Unicode
+		# mode by default. If you need them, download and apply
+		# http://www.linuxfromscratch.org/~alexander/patches/linux-2.6.12.5-utf8_input-2.patch
+		# After patching, add "-m charset_of_your_keymap" to the FONT
+		# variable and set BROKEN_COMPOSE=false
+		# in /etc/sysconfig/console
+
+		[ -n "$BROKEN_COMPOSE" ] || BROKEN_COMPOSE="$UNICODE"
+		! is_true "$BROKEN_COMPOSE" ||
+			echo "" | loadkeys -c >/dev/null 2>&1 ||
+			failed=1
+		
+		# Convert the keymap from $LEGACY_CHARSET to UTF-8
+		[ -z "$LEGACY_CHARSET" ] ||
+			dumpkeys -c "$LEGACY_CHARSET" |
+			loadkeys -u >/dev/null 2>&1 ||
+			failed=1
+
+		# If any of the commands above failed, the trap at the
+		# top would set $failed to 1
+		( exit $failed )
+		evaluate_retval
+		;;
+	*)
+		echo $"Usage:" "${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/console

+ 61 - 0
bootscripts/lfs/init.d/consolelog

@@ -0,0 +1,61 @@
+#!/bin/sh
+# Begin $rc_base/init.d/consolelog
+
+########################################################################
+#
+# Description : Set the kernel log level for the console
+#
+# Authors     : Dan Nicholson - dnicholson@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       : /proc must be mounted before this can run
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+# set the default loglevel
+LOGLEVEL=7
+if [ -r /etc/sysconfig/console ]; then
+	. /etc/sysconfig/console
+fi
+
+case "${1}" in
+	start)
+		case "$LOGLEVEL" in
+		[1-8])
+			boot_mesg "Setting the console log level to ${LOGLEVEL}..."
+			dmesg -n $LOGLEVEL
+			evaluate_retval
+			;;
+		*)
+			boot_mesg "Console log level '${LOGLEVEL}' is invalid" ${FAILURE}
+			echo_failure
+			;;
+		esac
+		;;
+	status)
+		# Read the current value if possible
+		if [ -r /proc/sys/kernel/printk ]; then
+			read level line < /proc/sys/kernel/printk
+		else
+			boot_mesg "Can't read the current console log level" ${FAILURE}
+			echo_failure
+		fi
+
+		# Print the value
+		if [ -n "$level" ]; then
+			${ECHO} -e "${INFO}The current console log level" \
+				"is ${level}${NORMAL}"
+		fi
+		;;
+
+	*)
+		echo "Usage: ${0} {start|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/consolelog

+ 769 - 0
bootscripts/lfs/init.d/functions

@@ -0,0 +1,769 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/functions
+#
+# Description : Run Level Control Functions
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       : With code based on Matthias Benkmann's simpleinit-msb
+#		http://winterdrache.de/linux/newboot/index.html
+#
+########################################################################
+
+## Environmental setup
+# Setup default values for environment
+umask 022
+export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
+
+# Signal sent to running processes to refresh their configuration
+RELOADSIG="HUP"
+
+# Number of seconds between STOPSIG and FALLBACK when stopping processes
+KILLDELAY="3"
+
+## Screen Dimensions
+# Find current screen size
+if [ -z "${COLUMNS}" ]; then
+	COLUMNS=$(stty size)
+	COLUMNS=${COLUMNS##* }
+fi
+
+# When using remote connections, such as a serial port, stty size returns 0
+if [ "${COLUMNS}" = "0" ]; then 
+	COLUMNS=80
+fi
+
+## Measurements for positioning result messages
+COL=$((${COLUMNS} - 8))
+WCOL=$((${COL} - 2))
+
+## Provide an echo that supports -e and -n
+# If formatting is needed, $ECHO should be used
+case "`echo -e -n test`" in
+	-[en]*)
+		ECHO=/bin/echo
+		;;
+	*)
+		ECHO=echo
+		;;
+esac
+
+## Set Cursor Position Commands, used via $ECHO
+SET_COL="\\033[${COL}G"      # at the $COL char
+SET_WCOL="\\033[${WCOL}G"    # at the $WCOL char
+CURS_UP="\\033[1A\\033[0G"   # Up one line, at the 0'th char
+
+## Set color commands, used via $ECHO
+# Please consult `man console_codes for more information
+# under the "ECMA-48 Set Graphics Rendition" section
+#
+# Warning: when switching from a 8bit to a 9bit font,
+# the linux console will reinterpret the bold (1;) to
+# the top 256 glyphs of the 9bit font.  This does
+# not affect framebuffer consoles
+NORMAL="\\033[0;39m"         # Standard console grey
+SUCCESS="\\033[1;32m"        # Success is green
+WARNING="\\033[1;33m"        # Warnings are yellow
+FAILURE="\\033[1;31m"        # Failures are red
+INFO="\\033[1;36m"           # Information is light cyan
+BRACKET="\\033[1;34m"        # Brackets are blue
+
+STRING_LENGTH="0"   # the length of the current message
+
+#*******************************************************************************
+# Function - boot_mesg()
+#
+# Purpose:      Sending information from bootup scripts to the console
+#
+# Inputs:       $1 is the message
+#               $2 is the colorcode for the console
+#
+# Outputs:      Standard Output
+#
+# Dependencies: - sed for parsing strings.
+#	        - grep for counting string length.
+#               
+# Todo:         
+#*******************************************************************************
+boot_mesg()
+{
+	local ECHOPARM=""
+
+	while true
+	do
+		case "${1}" in
+			-n)
+				ECHOPARM=" -n "
+				shift 1
+				;;
+			-*)
+				echo "Unknown Option: ${1}"
+				return 1
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	## Figure out the length of what is to be printed to be used
+	## for warning messages. 
+	STRING_LENGTH=$((${#1} + 1))
+
+	# Print the message to the screen
+	${ECHO} ${ECHOPARM} -e "${2}${1}"
+	
+}
+
+boot_mesg_flush()
+{
+	# Reset STRING_LENGTH for next message
+	STRING_LENGTH="0"
+}
+
+boot_log()
+{
+	# Left in for backwards compatibility
+	:
+}
+
+echo_ok()
+{
+	${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS}  OK  ${BRACKET}]"
+	${ECHO} -e "${NORMAL}"
+        boot_mesg_flush
+}
+
+echo_failure()
+{
+	${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
+	${ECHO} -e "${NORMAL}"
+        boot_mesg_flush
+}
+
+echo_warning()
+{
+	${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
+	${ECHO} -e "${NORMAL}"
+        boot_mesg_flush
+}
+
+print_error_msg()
+{
+	echo_failure
+	# $i is inherited by the rc script
+	boot_mesg -n "FAILURE:\n\nYou should not be reading this error message.\n\n" ${FAILURE}
+	boot_mesg -n " It means that an unforeseen error took"
+	boot_mesg -n " place in ${i}, which exited with a return value of"
+	boot_mesg " ${error_value}.\n"
+	boot_mesg_flush
+	boot_mesg -n "If you're able to track this"
+	boot_mesg -n " error down to a bug in one of the files provided by"
+	boot_mesg -n " the LFS book, please be so kind to inform us at"
+	boot_mesg " lfs-dev@linuxfromscratch.org.\n"
+	boot_mesg_flush
+	boot_mesg -n "Press Enter to continue..." ${INFO}
+	boot_mesg "" ${NORMAL}
+	read ENTER
+}
+
+check_script_status()
+{
+	# $i is inherited by the rc script
+	if [ ! -f ${i} ]; then
+		boot_mesg "${i} is not a valid symlink." ${WARNING}
+		echo_warning
+		continue
+	fi
+
+	if [ ! -x ${i} ]; then
+		boot_mesg "${i} is not executable, skipping." ${WARNING}
+		echo_warning
+		continue
+	fi
+}
+
+evaluate_retval()
+{
+	error_value="${?}"
+
+	if [ ${error_value} = 0 ]; then
+		echo_ok
+	else
+		echo_failure
+	fi
+
+	# This prevents the 'An Unexpected Error Has Occurred' from trivial
+	# errors.
+	return 0
+}
+
+print_status()
+{
+	if [ "${#}" = "0" ]; then
+		echo "Usage: ${0} {success|warning|failure}"
+		return 1
+	fi
+
+	case "${1}" in
+
+		success)
+			echo_ok
+			;;
+
+		warning)
+			# Leave this extra case in because old scripts
+			# may call it this way.
+			case "${2}" in
+				running)
+					${ECHO} -e -n "${CURS_UP}"
+					${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
+					boot_mesg "Already running." ${WARNING}
+					echo_warning
+					;;
+				not_running)
+					${ECHO} -e -n "${CURS_UP}"
+					${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
+					boot_mesg "Not running." ${WARNING}
+					echo_warning
+					;;
+				not_available)
+					${ECHO} -e -n "${CURS_UP}"
+					${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
+					boot_mesg "Not available." ${WARNING}
+					echo_warning
+					;;
+				*)
+					# This is how it is supposed to
+					# be called
+					echo_warning
+					;;
+			esac
+		;;
+
+		failure)
+			echo_failure
+		;;
+
+	esac
+
+}
+
+reloadproc()
+{
+	local pidfile=""
+	local failure=0
+
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" -lt "1" ]; then
+		log_failure_msg "Usage: reloadproc [-p pidfile] pathname"
+		return 2
+	fi
+
+	# This will ensure compatibility with previous LFS Bootscripts
+	if [ -n "${PIDFILE}" ];	then
+		pidfile="${PIDFILE}"
+	fi
+
+	# Is the process running?
+	if [ -z "${pidfile}" ];	then
+		pidofproc -s "${1}"
+	else
+		pidofproc -s -p "${pidfile}" "${1}"
+	fi
+
+	if [ -n "${pidlist}" ];	then
+		for pid in ${pidlist}
+		do
+			kill -"${RELOADSIG}" "${pid}" || failure="1"
+		done
+
+		(exit ${failure})
+		evaluate_retval
+
+	else
+		boot_mesg "Process ${1} not running." ${WARNING}
+		echo_warning
+	fi
+}
+
+statusproc()
+{
+	local pidfile=""
+	local base=""
+	local ret=""
+
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" != "1" ]; then
+		shift 1
+		log_failure_msg "Usage: statusproc [-p pidfile] pathname"
+		return 2
+	fi
+
+	# Get the process basename
+	base="${1##*/}"
+
+	# This will ensure compatibility with previous LFS Bootscripts
+	if [ -n "${PIDFILE}" ];	then
+		pidfile="${PIDFILE}"
+	fi
+
+	# Is the process running?
+	if [ -z "${pidfile}" ];	then
+		pidofproc -s "${1}"
+	else
+		pidofproc -s -p "${pidfile}" "${1}"
+	fi
+
+	# Store the return status
+	ret=$?
+
+	if [ -n "${pidlist}" ];	then
+		${ECHO} -e "${INFO}${base} is running with Process"\
+			"ID(s) ${pidlist}.${NORMAL}"
+	else
+		if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
+			${ECHO} -e "${WARNING}${1} is not running but"\
+				"/var/run/${base}.pid exists.${NORMAL}"
+		else
+			if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
+				${ECHO} -e "${WARNING}${1} is not running"\
+					"but ${pidfile} exists.${NORMAL}"
+			else
+				${ECHO} -e "${INFO}${1} is not running.${NORMAL}"
+			fi
+		fi
+	fi
+
+	# Return the status from pidofproc
+	return $ret
+}
+
+# The below functions are documented in the LSB-generic 2.1.0
+
+#*******************************************************************************
+# Function - pidofproc [-s] [-p pidfile] pathname
+#
+# Purpose: This function returns one or more pid(s) for a particular daemon
+#
+# Inputs: -p pidfile, use the specified pidfile instead of pidof
+#         pathname, path to the specified program
+#
+# Outputs: return 0 - Success, pid's in stdout
+#          return 1 - Program is dead, pidfile exists
+#          return 2 - Invalid or excessive number of arguments, 
+#                     warning in stdout
+#          return 3 - Program is not running
+#
+# Dependencies: pidof, echo, head
+#
+# Todo: Remove dependency on head
+#       This depreciates getpids
+#       Test changes to pidof
+#
+#*******************************************************************************
+pidofproc()
+{
+	local pidfile=""
+	local lpids=""
+	local silent=""
+	pidlist=""
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+
+			-s)
+				# Added for legacy opperation of getpids
+				# eliminates several '> /dev/null'
+				silent="1"
+				shift 1
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" != "1" ]; then
+		shift 1
+		log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
+		return 2
+	fi
+
+	if [ -n "${pidfile}" ]; then
+		if [ ! -r "${pidfile}" ]; then
+			return 3 # Program is not running
+		fi
+
+		lpids=`head -n 1 ${pidfile}`
+		for pid in ${lpids}
+		do
+			if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
+				kill -0 "${pid}" 2>/dev/null &&
+				pidlist="${pidlist} ${pid}"
+			fi
+			
+			if [ "${silent}" != "1" ]; then
+				echo "${pidlist}"
+			fi
+
+			test -z "${pidlist}" && 
+			# Program is dead, pidfile exists
+			return 1
+			# else
+			return 0
+		done
+
+	else
+		pidlist=`pidof -o $$ -o $PPID -x "$1"`
+		if [ "${silent}" != "1" ]; then
+			echo "${pidlist}"
+		fi
+
+		# Get provide correct running status
+		if [ -n "${pidlist}" ]; then
+			return 0
+		else
+			return 3
+		fi
+
+	fi
+
+	if [ "$?" != "0" ]; then
+		return 3 # Program is not running
+	fi
+}
+
+# This will ensure compatibility with previous LFS Bootscripts
+getpids()
+{
+	if [ -z "${PIDFILE}" ]; then
+		pidofproc -s -p "${PIDFILE}" $@
+	else
+		pidofproc -s $@
+	fi
+	base="${1##*/}"
+}
+
+#*******************************************************************************
+# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
+#
+# Purpose: This runs the specified program as a daemon
+#
+# Inputs: -f, run the program even if it is already running
+#         -n nicelevel, specifies a nice level. See nice(1).
+#         -p pidfile, uses the specified pidfile
+#         pathname, pathname to the specified program
+#         args, arguments to pass to specified program
+#
+# Outputs: return 0 - Success
+#          return 2 - Invalid of excessive number of arguments, 
+#                     warning in stdout
+#          return 4 - Program or service status is unknown
+#
+# Dependencies: nice
+#
+# Todo: LSB says this should be called start_daemon
+#       LSB does not say that it should call evaluate_retval
+#       It checks for PIDFILE, which is deprecated.
+#         Will be removed after BLFS 6.0
+#       loadproc returns 0 if program is already running, not LSB compliant
+#
+#*******************************************************************************
+loadproc()
+{
+	local pidfile=""
+	local forcestart=""
+	local nicelevel="10"
+
+# This will ensure compatibility with previous LFS Bootscripts
+	if [ -n "${PIDFILE}" ];	then
+		pidfile="${PIDFILE}"
+	fi
+
+  while true
+	do
+		case "${1}" in
+			-f)
+				forcestart="1"
+				shift 1
+				;;
+			-n)
+				nicelevel="${2}"
+				shift 2
+				;;
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2 #invalid or excess argument(s)
+				;;
+			*)
+				break
+				;;
+		esac
+	done
+
+	if [ "${#}" = "0" ]; then
+		log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
+		return 2 #invalid or excess argument(s)
+	fi
+
+	if [ -z "${forcestart}" ]; then
+		if [ -z "${pidfile}" ];	then
+			pidofproc -s "${1}"
+		else
+			pidofproc -s -p "${pidfile}" "${1}"
+		fi
+
+		case "${?}" in
+			0)
+				log_warning_msg "Unable to continue: ${1} is running"
+				return 0 # 4
+				;;
+			1)
+				log_warning_msg "Unable to continue: ${pidfile} exists"
+				return 0 # 4
+				;;
+			3)
+				;;
+			*)
+				log_failure_msg "Unknown error code from pidofproc: ${?}"
+				return 4
+				;;
+		esac
+	fi
+
+	nice -n "${nicelevel}" "${@}"
+	evaluate_retval # This is "Probably" not LSB compliant, but required to be compatible with older bootscripts
+	return 0
+}
+
+#*******************************************************************************
+# Function - killproc  [-p pidfile] pathname [signal]
+#
+# Purpose:
+#
+# Inputs: -p pidfile, uses the specified pidfile
+#         pathname, pathname to the specified program
+#         signal, send this signal to pathname
+#
+# Outputs: return 0 - Success
+#          return 2 - Invalid of excessive number of arguments, 
+#                     warning in stdout
+#          return 4 - Unknown Status
+#
+# Dependencies: kill
+#
+# Todo: LSB does not say that it should call evaluate_retval
+#       It checks for PIDFILE, which is deprecated.
+#         Will be removed after BLFS 6.0
+#
+#*******************************************************************************
+killproc()
+{
+	local pidfile=""
+	local killsig=TERM # default signal is SIGTERM
+	pidlist=""
+
+	# This will ensure compatibility with previous LFS Bootscripts
+	if [ -n "${PIDFILE}" ];	then
+		pidfile="${PIDFILE}"
+	fi
+
+	while true
+	do
+		case "${1}" in
+			-p)
+				pidfile="${2}"
+				shift 2
+				;;
+			-*)
+				log_failure_msg "Unknown Option: ${1}"
+				return 2
+				;;
+			*)
+ 				break
+				;;
+		esac
+	done
+
+	if [ "${#}" = "2" ]; then
+		killsig="${2}"
+	elif [ "${#}" != "1" ];	then
+		shift 2
+		log_failure_msg "Usage: killproc  [-p pidfile] pathname [signal]"
+		return 2
+	fi
+
+	# Is the process running?
+	if [ -z "${pidfile}" ];	then
+		pidofproc -s "${1}"
+	else
+		pidofproc -s -p "${pidfile}" "${1}"
+	fi
+
+    # If running, send the signal
+    if [ -n "${pidlist}" ]; then
+	for pid in ${pidlist}
+	do
+		kill -${killsig} ${pid} 2>/dev/null
+
+		# Wait up to 3 seconds, for ${pid} to terminate
+		case "${killsig}" in
+		TERM|SIGTERM|KILL|SIGKILL)
+			# sleep in 1/10ths of seconds and
+			# multiply KILLDELAY by 10
+			local dtime="${KILLDELAY}0"
+			while [ "${dtime}" != "0" ]
+			do
+				kill -0 ${pid} 2>/dev/null || break
+				sleep 0.1
+				dtime=$(( ${dtime} - 1))
+			done
+			# If ${pid} is still running, kill it
+			kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null
+			;;
+		esac
+	done
+
+	# Check if the process is still running if we tried to stop it
+	case "${killsig}" in
+	TERM|SIGTERM|KILL|SIGKILL)
+		if [ -z "${pidfile}" ];	then
+			pidofproc -s "${1}"
+		else
+			pidofproc -s -p "${pidfile}" "${1}"
+		fi
+
+		# Program was terminated
+		if [ "$?" != "0" ]; then
+			# Remove the pidfile if necessary
+			if [ -f "${pidfile}" ];	then
+				rm -f "${pidfile}"
+			fi
+			echo_ok
+			return 0
+		else # Program is still running
+			echo_failure
+			return 4 # Unknown Status
+		fi
+		;;
+	*)
+		# Just see if the kill returned successfully
+		evaluate_retval
+		;;
+	esac
+    else # process not running
+	print_status warning not_running
+    fi
+}
+
+
+#*******************************************************************************
+# Function - log_success_msg "message"
+#
+# Purpose: Print a success message
+#
+# Inputs: $@ - Message
+#
+# Outputs: Text output to screen
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_success_msg()
+{
+	${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
+	${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}""  OK  ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+
+#*******************************************************************************
+# Function - log_failure_msg "message"
+#
+# Purpose: Print a failure message
+#
+# Inputs: $@ - Message
+#
+# Outputs: Text output to screen
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_failure_msg() {
+	${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
+	${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+
+#*******************************************************************************
+# Function - log_warning_msg "message"
+#
+# Purpose: print a warning message
+#
+# Inputs: $@ - Message
+#
+# Outputs: Text output to screen
+#
+# Dependencies: echo
+#
+# Todo: logging
+#
+#*******************************************************************************
+log_warning_msg() {
+	${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
+	${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
+	return 0
+}
+
+# End $rc_base/init.d/functions

+ 28 - 0
bootscripts/lfs/init.d/halt

@@ -0,0 +1,28 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/halt
+#
+# Description : Halt Script
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	stop)
+		halt -d -f -i -p
+		;;
+	*)
+		echo "Usage: {stop}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/halt

+ 54 - 0
bootscripts/lfs/init.d/localnet

@@ -0,0 +1,54 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/localnet
+#
+# Description : Loopback device
+#
+# Authors     : Gerard Beekmans  - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+. /etc/sysconfig/network
+
+case "${1}" in
+	start)
+		boot_mesg "Bringing up the loopback interface..."
+		ip addr add 127.0.0.1/8 label lo dev lo
+		ip link set lo up
+		evaluate_retval
+
+		boot_mesg "Setting hostname to ${HOSTNAME}..."
+		hostname ${HOSTNAME}
+		evaluate_retval
+		;;
+
+	stop)
+		boot_mesg "Bringing down the loopback interface..."
+		ip link set lo down
+		evaluate_retval
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	status)
+		echo "Hostname is: $(hostname)"
+		ip link show lo
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|restart|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/localnet

+ 72 - 0
bootscripts/lfs/init.d/modules

@@ -0,0 +1,72 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/modules
+#
+# Description : Module auto-loading script
+#
+# Authors     : Zack Winkles
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+# Assure that the kernel has module support.
+[ -e /proc/ksyms -o -e /proc/modules ] || exit 0
+
+case "${1}" in
+	start)
+
+		# Exit if there's no modules file or there are no
+		# valid entries
+		[ -r /etc/sysconfig/modules ] &&
+			egrep -qv '^($|#)' /etc/sysconfig/modules ||
+			exit 0
+
+		boot_mesg -n "Loading modules:" ${INFO}
+
+		# Only try to load modules if the user has actually given us
+		# some modules to load.
+		while read module args; do
+
+			# Ignore comments and blank lines.
+			case "$module" in
+				""|"#"*) continue ;;
+			esac
+
+			# Attempt to load the module, making
+			# sure to pass any arguments provided.
+			modprobe ${module} ${args} >/dev/null
+
+			# Print the module name if successful,
+			# otherwise take note.
+			if [ $? -eq 0 ]; then
+				boot_mesg -n " ${module}" ${NORMAL}
+			else
+				failedmod="${failedmod} ${module}"
+			fi
+		done < /etc/sysconfig/modules
+
+		boot_mesg "" ${NORMAL}
+		# Print a message about successfully loaded
+		# modules on the correct line.
+		echo_ok
+
+		# Print a failure message with a list of any
+		# modules that may have failed to load.
+		if [ -n "${failedmod}" ]; then
+			boot_mesg "Failed to load modules:${failedmod}" ${FAILURE}
+			echo_failure
+		fi
+		;;
+	*)
+		echo "Usage: ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/modules

+ 54 - 0
bootscripts/lfs/init.d/mountfs

@@ -0,0 +1,54 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/mountfs
+#
+# Description : File System Mount Script
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Remounting root file system in read-write mode..."
+		mount -n -o remount,rw / >/dev/null
+		evaluate_retval
+
+		# Remove fsck-related file system watermarks.
+		rm -f /fastboot /forcefsck
+
+		boot_mesg "Recording existing mounts in /etc/mtab..."
+		> /etc/mtab
+		mount -f / || failed=1
+		mount -f /proc || failed=1
+		mount -f /sys || failed=1
+		(exit ${failed})
+		evaluate_retval
+
+		# This will mount all filesystems that do not have _netdev in
+		# their option list.  _netdev denotes a network filesystem.
+		boot_mesg "Mounting remaining file systems..."
+		mount -a -O no_netdev >/dev/null
+		evaluate_retval
+		;;
+
+	stop)
+		boot_mesg "Unmounting all other currently mounted file systems..."
+		umount -a -d -r >/dev/null
+		evaluate_retval
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/mountfs

+ 44 - 0
bootscripts/lfs/init.d/mountkernfs

@@ -0,0 +1,44 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/mountkernfs
+#
+# Description : Mount proc and sysfs
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg -n "Mounting kernel-based file systems:" ${INFO}
+
+		if ! mountpoint /proc >/dev/null; then
+			boot_mesg -n " /proc" ${NORMAL}
+			mount -n /proc || failed=1
+		fi
+
+		if ! mountpoint /sys >/dev/null; then
+			boot_mesg -n " /sys" ${NORMAL}
+			mount -n /sys || failed=1
+		fi
+
+		boot_mesg "" ${NORMAL}
+
+		(exit ${failed})
+		evaluate_retval
+		;;
+
+	*)
+		echo "Usage: ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/mountkernfs

+ 73 - 0
bootscripts/lfs/init.d/network

@@ -0,0 +1,73 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/network
+#
+# Description : Network Control Script
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#		Nathan Coulson - nathan@linuxfromscratch.org
+#		Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+. /etc/sysconfig/network
+
+case "${1}" in
+	start)
+		# Start all network interfaces
+		for file in ${network_devices}/ifconfig.*
+		do
+			interface=${file##*/ifconfig.}
+
+			# skip if $file is * (because nothing was found)
+			if [ "${interface}" = "*" ]
+			then
+				continue
+			fi
+
+			IN_BOOT=1 ${network_devices}/ifup ${interface}
+		done
+		;;
+
+	stop)
+		# Reverse list
+		FILES=""
+		for file in ${network_devices}/ifconfig.*
+		do
+			FILES="${file} ${FILES}"
+		done
+
+		# Stop all network interfaces
+		for file in ${FILES}
+		do
+			interface=${file##*/ifconfig.}
+
+			# skip if $file is * (because nothing was found)
+			if [ "${interface}" = "*" ]
+			then
+				continue
+			fi
+
+			IN_BOOT=1 ${network_devices}/ifdown ${interface}
+		done
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|restart}"
+		exit 1
+		;;
+esac
+
+# End /etc/rc.d/init.d/network

+ 99 - 0
bootscripts/lfs/init.d/rc

@@ -0,0 +1,99 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/rc
+#
+# Description : Main Run Level Control Script
+#
+# Authors     : Gerard Beekmans  - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+# This sets a few default terminal options.
+stty sane
+
+# These 3 signals will not cause our script to exit
+trap "" INT QUIT TSTP
+
+[ "${1}" != "" ] && runlevel=${1}
+
+if [ "${runlevel}" = "" ]; then
+	echo "Usage: ${0} <runlevel>" >&2
+	exit 1
+fi
+
+previous=${PREVLEVEL}
+[ "${previous}" = "" ] && previous=N
+
+if [ ! -d ${rc_base}/rc${runlevel}.d ]; then
+	boot_mesg "${rc_base}/rc${runlevel}.d does not exist." ${WARNING}
+	boot_mesg_flush
+	exit 1
+fi
+
+# Attempt to stop all service started by previous runlevel,
+# and killed in this runlevel
+if [ "${previous}" != "N" ]; then
+	for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2> /dev/null)
+	do
+		check_script_status
+
+		suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]}
+		prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
+		sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix
+
+		if [ "${runlevel}" != "0" ] && [ "${runlevel}" != "6" ]; then
+			if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
+				boot_mesg -n "WARNING:\n\n${i} can't be" ${WARNING}
+				boot_mesg -n " executed because it was not"
+				boot_mesg -n " not started in the previous"
+				boot_mesg -n " runlevel (${previous})."
+				boot_mesg "" ${NORMAL}
+				boot_mesg_flush
+				continue
+			fi
+		fi
+		${i} stop
+		error_value=${?}
+
+		if [ "${error_value}" != "0" ]; then
+			print_error_msg
+		fi
+	done
+fi
+
+#Start all functions in this runlevel
+for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)
+do
+	if [ "${previous}" != "N" ]; then
+		suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]}
+		stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix
+		prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
+
+		[ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
+	fi
+
+	check_script_status
+
+	case ${runlevel} in
+		0|6)
+			${i} stop
+			;;
+		*)
+			${i} start
+			;;
+	esac
+	error_value=${?}
+
+	if [ "${error_value}" != "0" ]; then
+		print_error_msg
+	fi
+done
+
+# End $rc_base/init.d/rc

+ 31 - 0
bootscripts/lfs/init.d/reboot

@@ -0,0 +1,31 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/reboot
+#
+# Description : Reboot Scripts
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	stop)
+		boot_mesg "Restarting system..."
+		reboot -d -f -i
+		;;
+
+	*)
+		echo "Usage: ${0} {stop}"
+		exit 1
+		;;
+
+esac
+
+# End $rc_base/init.d/reboot

+ 52 - 0
bootscripts/lfs/init.d/sendsignals

@@ -0,0 +1,52 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/sendsignals
+#
+# Description : Sendsignals Script
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	stop)
+		boot_mesg "Sending all processes the TERM signal..."
+		killall5 -15
+		error_value=${?}
+
+		sleep ${KILLDELAY}
+
+		if [ "${error_value}" = 0 ]; then
+			echo_ok
+		else
+			echo_failure
+		fi
+
+		boot_mesg "Sending all processes the KILL signal..."
+		killall5 -9
+		error_value=${?}
+
+		sleep ${KILLDELAY}
+
+		if [ "${error_value}" = 0 ]; then
+			echo_ok
+		else
+			echo_failure
+		fi
+		;;
+
+	*)
+		echo "Usage: ${0} {stop}"
+		exit 1
+		;;
+
+esac
+
+# End $rc_base/init.d/sendsignals

+ 49 - 0
bootscripts/lfs/init.d/setclock

@@ -0,0 +1,49 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/setclock
+#
+# Description : Setting Linux Clock
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+. /etc/sysconfig/clock
+
+CLOCKPARAMS=
+
+case "${UTC}" in
+	yes|true|1)
+		CLOCKPARAMS="${CLOCKPARAMS} --utc"
+		;;
+
+	no|false|0)
+		CLOCKPARAMS="${CLOCKPARAMS} --localtime"
+		;;
+
+esac
+
+case ${1} in
+	start)
+		boot_mesg "Setting system clock..."
+		hwclock --hctosys ${CLOCKPARAMS} >/dev/null
+		evaluate_retval
+		;;
+
+	stop)
+		boot_mesg "Setting hardware clock..."
+		hwclock --systohc ${CLOCKPARAMS} >/dev/null
+		evaluate_retval
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop}"
+		;;
+
+esac

+ 50 - 0
bootscripts/lfs/init.d/swap

@@ -0,0 +1,50 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/swap
+#
+# Description : Swap Control Script
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Activating all swap files/partitions..."
+		swapon -a
+		evaluate_retval
+		;;
+
+	stop)
+		boot_mesg "Deactivating all swap files/partitions..."
+		swapoff -a
+		evaluate_retval
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	status)
+		boot_mesg "Retrieving swap status." ${INFO}
+		echo_ok
+		echo
+		swapon -s
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|restart|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/swap

+ 39 - 0
bootscripts/lfs/init.d/sysctl

@@ -0,0 +1,39 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/sysctl
+#
+# Description : File uses /etc/sysctl.conf to set kernel runtime
+#               parameters
+#
+# Authors     : Nathan Coulson (nathan@linuxfromscratch.org)
+#               Matthew Burgress (matthew@linuxfromscratch.org)
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		if [ -f "/etc/sysctl.conf" ]; then
+			boot_mesg "Setting kernel runtime parameters..."
+			sysctl -q -p
+			evaluate_retval
+		fi
+		;;
+
+	status)
+		sysctl -a	
+		;;
+
+	*)
+		echo "Usage: ${0} {start|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/sysctl

+ 57 - 0
bootscripts/lfs/init.d/sysklogd

@@ -0,0 +1,57 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/sysklogd
+#
+# Description : Sysklogd loader
+#
+# Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Starting system log daemon..."
+		loadproc syslogd -m 0
+
+		boot_mesg "Starting kernel log daemon..."
+		loadproc klogd
+		;;
+
+	stop)
+		boot_mesg "Stopping kernel log daemon..."
+		killproc klogd
+
+		boot_mesg "Stopping system log daemon..."
+		killproc syslogd
+		;;
+
+	reload)
+		boot_mesg "Reloading system log daemon config file..."
+		reloadproc syslogd
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	status)
+		statusproc syslogd
+		statusproc klogd
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|reload|restart|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/sysklogd

+ 50 - 0
bootscripts/lfs/init.d/template

@@ -0,0 +1,50 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/
+#
+# Description :
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Starting..."
+		loadproc
+		;;
+
+	stop)
+		boot_mesg "Stopping..."
+		killproc
+		;;
+
+	reload)
+		boot_mesg "Reloading..."
+		reloadproc
+		;;
+
+	restart)
+		${0} stop
+		sleep 1
+		${0} start
+		;;
+
+	status)
+		statusproc
+		;;
+
+	*)
+		echo "Usage: ${0} {start|stop|reload|restart|status}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/

+ 77 - 0
bootscripts/lfs/init.d/udev

@@ -0,0 +1,77 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/udev
+#
+# Description : Udev cold-plugging script
+#
+# Authors     : Zack Winkles, Alexander E. Patrakov
+#
+# Version     : 00.02
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Populating /dev with device nodes..."
+		if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nUnable to create" ${FAILURE}
+			boot_mesg -n " devices without a SysFS filesystem"
+			boot_mesg -n "\n\nAfter you press Enter, this system"
+			boot_mesg -n " will be halted and powered off."
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			/etc/rc.d/init.d/halt stop
+		fi
+
+		# Mount a temporary file system over /dev, so that any devices
+		# made or removed during this boot don't affect the next one.
+		# The reason we don't write to mtab is because we don't ever
+		# want /dev to be unavailable (such as by `umount -a').
+		mount -n -t tmpfs tmpfs /dev -o mode=755
+		if [ ${?} != 0 ]; then
+			echo_failure
+			boot_mesg -n "FAILURE:\n\nCannot mount a tmpfs" ${FAILURE}
+			boot_mesg -n " onto /dev, this system will be halted."
+			boot_mesg -n "\n\nAfter you press Enter, this system"
+			boot_mesg -n " will be halted and powered off."
+			boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
+			boot_mesg "" ${NORMAL}
+			read ENTER
+			/etc/rc.d/init.d/halt stop
+		fi
+
+		# Udev handles uevents itself, so we don't need to have
+		# the kernel call out to any binary in response to them
+		echo > /proc/sys/kernel/hotplug
+
+		# Copy static device nodes to /dev
+		cp -a /lib/udev/devices/* /dev
+
+		# Start the udev daemon to continually watch for, and act on,
+		# uevents
+		/sbin/udevd --daemon
+
+		# Now traverse /sys in order to "coldplug" devices that have
+		# already been discovered
+		/sbin/udevadm trigger
+
+		# Now wait for udevd to process the uevents we triggered
+		/sbin/udevadm settle
+		evaluate_retval
+
+		;;
+
+	*)
+		echo "Usage ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/udev

+ 45 - 0
bootscripts/lfs/init.d/udev_retry

@@ -0,0 +1,45 @@
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/udev_retry
+#
+# Description : Udev cold-plugging script (retry)
+#
+# Authors     : Alexander E. Patrakov
+#
+# Version     : 00.02
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+	start)
+		boot_mesg "Retrying failed uevents, if any..."
+
+		# From Debian: "copy the rules generated before / was mounted
+		# read-write":
+		for file in /dev/.udev/tmp-rules--*; do
+			dest=${file##*tmp-rules--}
+			[ "$dest" = '*' ] && break
+			cat $file >> /etc/udev/rules.d/$dest
+			rm -f $file
+		done
+
+		# Re-trigger the failed uevents in hope they will succeed now
+		/sbin/udevadm trigger --retry-failed
+		
+		# Now wait for udevd to process the uevents we triggered
+		/sbin/udevadm settle
+		evaluate_retval
+		;;
+
+	*)
+		echo "Usage ${0} {start}"
+		exit 1
+		;;
+esac
+
+# End $rc_base/init.d/udev_retry

+ 28 - 0
bootscripts/lfs/sysconfig/createfiles

@@ -0,0 +1,28 @@
+########################################################################
+# Begin /etc/sysconfig/createfiles
+#
+# Description : Createfiles script config file
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       : The syntax of this file is as follows:
+# 		if type is equal to "file" or "dir"
+#  		<filename> <type> <permissions> <user> <group>
+# 		if type is equal to "dev"
+#  		<filename> <type> <permissions> <user> <group> <devtype> <major> <minor>
+#
+# 		<filename> is the name of the file which is to be created
+# 		<type> is either file, dir, or dev.
+#   			file creates a new file
+#   			dir creates a new directory
+#   			dev creates a new device
+# 		<devtype> is either block, char or pipe
+#   			block creates a block device
+#   			char creates a character deivce
+#   			pipe creates a pipe, this will ignore the <major> and <minor> fields
+# 		<major> and <minor> are the major and minor numbers used for the device.
+########################################################################
+
+# End /etc/sysconfig/createfiles

+ 18 - 0
bootscripts/lfs/sysconfig/modules

@@ -0,0 +1,18 @@
+########################################################################
+# Begin /etc/sysconfig/modules
+#
+# Description : Module auto-loading configuration
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       : The syntax of this file is as follows:
+#  		<module> [<arg1> <arg2> ...]
+#
+# Each module should be on it's own line, and any options that you want
+# passed to the module should follow it.  The line deliminator is either
+# a space or a tab.
+########################################################################
+
+# End /etc/sysconfig/modules

+ 95 - 0
bootscripts/lfs/sysconfig/network-devices/ifdown

@@ -0,0 +1,95 @@
+#!/bin/sh
+########################################################################
+# Begin $network_devices/ifdown
+#
+# Description : Interface Down
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.01
+#
+# Notes       : the IFCONFIG variable is passed to the scripts found
+#               in the services directory, to indicate what file the
+#               service should source to get environmental variables.
+#
+########################################################################
+
+. /etc/sysconfig/rc 
+. ${rc_functions} 
+
+# Collect a list of configuration files for our interface
+if [ -n "${2}" ]; then
+	for file in ${@#$1}; do # All parameters except $1
+		FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
+	done
+elif [ -d "${network_devices}/ifconfig.${1}" ]; then
+	FILES=`echo ${network_devices}/ifconfig.${1}/*`
+else
+	FILES="${network_devices}/ifconfig.${1}"
+fi
+
+# Reverse the order configuration files are processed in
+for file in ${FILES}; do
+	FILES2="${file} ${FILES2}"
+done
+FILES=${FILES2}
+
+# Process each configuration file
+for file in ${FILES}; do
+	# skip backup files
+	if [ "${file}" != "${file%""~""}" ]; then
+		continue
+	fi
+
+	if [ ! -f "${file}" ]; then
+		boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
+		echo_warning
+		continue
+	fi
+	(
+		. ${file}
+
+		# Will not process this service if started by boot, and ONBOOT
+		# is not set to yes
+		if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
+			continue
+		fi
+
+		# Will not process this service if started by hotplug, and 
+		# ONHOTPLUG is not set to yes
+		if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then
+			continue
+		fi
+	
+		# This will run the service script, if SERVICE is set
+		if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
+			if ip link show ${1} > /dev/null 2>&1
+			then
+				IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} down
+			else
+				boot_mesg "Interface ${1} doesn't exist." ${WARNING}
+				echo_warning
+			fi
+		else
+			boot_mesg -n "Unable to process ${file}.  Either" ${FAILURE}
+			boot_mesg -n " the SERVICE variable was not set,"
+			boot_mesg " or the specified service cannot be executed."
+			echo_failure
+			continue
+		fi
+	)
+done
+
+if [ -z "${2}" ]; then
+	link_status=`ip link show $1`
+	if [ -n "${link_status}" ]; then
+		if echo "${link_status}" | grep -q UP; then
+			boot_mesg "Bringing down the ${1} interface..."
+			ip link set ${1} down
+			evaluate_retval
+		fi
+	fi
+fi
+
+# End $network_devices/ifdown

+ 89 - 0
bootscripts/lfs/sysconfig/network-devices/ifup

@@ -0,0 +1,89 @@
+#!/bin/sh
+########################################################################
+# Begin $network_devices/ifup
+#
+# Description : Interface Up
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       : the IFCONFIG variable is passed to the scripts found
+#               in the services directory, to indicate what file the
+#               service should source to get environmental variables.
+#
+########################################################################
+
+. /etc/sysconfig/rc 
+. ${rc_functions} 
+
+# Collect a list of configuration files for our interface
+if [ -n "${2}" ]; then
+	for file in ${@#$1} # All parameters except $1
+  do
+		FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
+	done
+elif [ -d "${network_devices}/ifconfig.${1}" ]; then
+	FILES=`echo ${network_devices}/ifconfig.${1}/*`
+else 
+	FILES="${network_devices}/ifconfig.${1}"
+fi
+
+boot_mesg "Bringing up the ${1} interface..."
+boot_mesg_flush
+
+# Process each configruation file
+for file in ${FILES}; do
+	# skip backup files
+	if [ "${file}" != "${file%""~""}" ]; then
+		continue
+	fi
+
+	if [ ! -f "${file}" ]; then
+		boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
+		echo_warning
+		continue
+	fi
+
+	(
+		. ${file}
+
+		# Will not process this service if started by boot, and ONBOOT
+		# is not set to yes
+		if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
+			continue
+		fi
+		# Will not process this service if started by hotplug, and 
+		# ONHOTPLUG is not set to yes
+		if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" -a "${HOSTNAME}" != "(none)" ]; then
+			 continue
+		fi
+
+		if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
+			if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then
+				if ip link show ${1} > /dev/null 2>&1; then
+					link_status=`ip link show ${1}`
+					if [ -n "${link_status}" ]; then
+						if ! echo "${link_status}" | grep -q UP; then
+							ip link set ${1} up
+						fi
+					fi
+				else
+					boot_mesg "Interface ${1} doesn't exist." ${WARNING}
+					echo_warning
+					continue
+				fi
+			fi
+			IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} up
+		else
+			boot_mesg "Unable to process ${file}.  Either" ${FAILURE}
+			boot_mesg " the SERVICE variable was not set,"
+			boot_mesg " or the specified service cannot be executed."
+			echo_failure
+			continue
+		fi
+	)
+done
+
+# End $network_devices/ifup

+ 82 - 0
bootscripts/lfs/sysconfig/network-devices/services/ipv4-static

@@ -0,0 +1,82 @@
+#!/bin/sh
+########################################################################
+# Begin $network_devices/services/ipv4-static
+#
+# Description : IPV4 Static Boot Script
+#
+# Authors     : Nathan Coulson - nathan@linuxfromscratch.org
+#		Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc 
+. ${rc_functions} 
+. ${IFCONFIG}
+
+if [ -z "${IP}" ]; then
+	boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+	echo_failure
+	exit 1
+fi
+
+if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
+	boot_mesg -n "PREFIX variable missing from ${IFCONFIG}," ${WARNING}
+	boot_mesg " assuming 24."
+	echo_warning
+	PREFIX=24
+	args="${args} ${IP}/${PREFIX}"
+elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
+	boot_mesg "PREFIX and PEER both specified in ${IFCONFIG}, cannot continue." ${FAILURE}
+	echo_failure
+	exit 1
+elif [ -n "${PREFIX}" ]; then
+	args="${args} ${IP}/${PREFIX}"
+elif [ -n "${PEER}" ]; then
+	args="${args} ${IP} peer ${PEER}"
+fi
+
+if [ -n "${BROADCAST}" ]; then
+	args="${args} broadcast ${BROADCAST}"
+fi
+
+case "${2}" in
+	up)
+		boot_mesg "Adding IPv4 address ${IP} to the ${1} interface..."
+		ip addr add ${args} dev ${1}
+		evaluate_retval
+	
+		if [ -n "${GATEWAY}" ]; then
+			if ip route | grep -q default; then
+				boot_mesg "Gateway already setup; skipping." ${WARNING}
+				echo_warning
+			else
+				boot_mesg "Setting up default gateway..."
+				ip route add default via ${GATEWAY} dev ${1}
+				evaluate_retval
+			 fi
+		fi
+	;;
+	
+	down)
+		if [ -n "${GATEWAY}" ];	then
+			boot_mesg "Removing default gateway..."
+			ip route del default
+			evaluate_retval
+		fi
+	
+		boot_mesg "Removing IPv4 address ${IP} from the ${1} interface..."
+		ip addr del ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	*)
+		echo "Usage: ${0} [interface] {up|down}"
+		exit 1
+	;;
+esac
+
+# End $network_devices/services/ipv4-static

+ 97 - 0
bootscripts/lfs/sysconfig/network-devices/services/ipv4-static-route

@@ -0,0 +1,97 @@
+#!/bin/sh
+########################################################################
+# Begin $network_devices/services/ipv4-static-route
+#
+# Description : IPV4 Static Route Script
+#
+# Authors     : Kevin P. Fleming - kpfleming@linuxfromscratch.org
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+. /etc/sysconfig/rc 
+. ${rc_functions} 
+. ${IFCONFIG}
+
+case "${TYPE}" in
+	("" | "network")
+		need_ip=1
+		need_gateway=1
+	;;
+
+	("default")
+		need_gateway=1
+		args="${args} default"
+		desc="default"
+	;;
+
+	("host")
+		need_ip=1
+	;;
+
+	("unreachable")
+		need_ip=1
+		args="${args} unreachable"
+		desc="unreachable "
+	;;
+
+	(*)
+		boot_mesg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	;;
+esac
+
+if [ -n "${need_ip}" ]; then
+	if [ -z "${IP}" ]; then
+		boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+
+	if [ -z "${PREFIX}" ]; then
+		boot_mesg "PREFIX variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+	
+	args="${args} ${IP}/${PREFIX}"
+	desc="${desc}${IP}/${PREFIX}"
+fi
+
+if [ -n "${need_gateway}" ]; then
+	if [ -z "${GATEWAY}" ]; then
+		boot_mesg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
+		echo_failure
+		exit 1
+	fi
+	args="${args} via ${GATEWAY}"
+fi
+
+if [ -n "${SOURCE}" ]; then
+        args="${args} src ${SOURCE}"
+fi
+
+case "${2}" in
+	up)
+		boot_mesg "Adding '${desc}' route to the ${1} interface..."
+		ip route add ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	down)
+		boot_mesg "Removing '${desc}' route from the ${1} interface..."
+		ip route del ${args} dev ${1}
+		evaluate_retval
+	;;
+	
+	*)
+		echo "Usage: ${0} [interface] {up|down}"
+		exit 1
+	;;
+esac
+
+# End $network_devices/services/ipv4-static-route

+ 18 - 0
bootscripts/lfs/sysconfig/rc

@@ -0,0 +1,18 @@
+########################################################################
+# Begin /etc/sysconfig/rc
+#
+# Description : rc script configuration
+#
+# Authors     :
+#
+# Version     : 00.00
+#
+# Notes       :
+#
+########################################################################
+
+rc_base=/etc/rc.d
+rc_functions=${rc_base}/init.d/functions
+network_devices=/etc/sysconfig/network-devices
+
+# End /etc/sysconfig/rc

+ 29 - 13
chapter01/changelog.xml

@@ -36,6 +36,22 @@
     </listitem>
 -->
 
+    <listitem>
+      <para>2008-06-03</para>
+      <itemizedlist>
+        <listitem>
+          <para>[bdubbs] - Added udev-config scripts to appenices.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Added lfs-bootscripts to appenices.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Updated license to Creative Commons with
+          extracted code under the MIT license.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
     <listitem>
       <para>2008-05-23</para>
       <itemizedlist>
@@ -65,25 +81,25 @@
       <itemizedlist>
         <listitem>
           <para>[jhuntwork] - Use -mtune=native for glibc. We don't
-	  want our libc optimized for 486. It should be optimized
-	  for the local machine.</para>
+          want our libc optimized for 486. It should be optimized
+          for the local machine.</para>
         </listitem>
         <listitem>
           <para>[jhuntwork] - Updated Autoconf to 2.62.</para>
         </listitem>
-	<listitem>
-	  <para>[jhuntwork] - Updated E2fsprogs to 1.40.8. Fixes #2173.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>[jhuntwork] - Fixed behavior in kbd where man pages
-          for optional programs that aren't built are installed.
-	  Thanks Greg Schafer for spotting this.
-	  </para>
-	</listitem>
+        <listitem>
+          <para>[jhuntwork] - Updated E2fsprogs to 1.40.8. Fixes #2173.
+          </para>
+        </listitem>
+        <listitem>
+          <para>[jhuntwork] - Fixed behavior in kbd where man pages
+                for optional programs that aren't built are installed.
+          Thanks Greg Schafer for spotting this.
+          </para>
+        </listitem>
         <listitem>
           <para>[jhuntwork] - Fixed kbd to install getkeycodes,
-	  setkeycodes and resizecons. Also moved loadkeys to /bin from
+          setkeycodes and resizecons. Also moved loadkeys to /bin from
           /usr/bin. Thanks, Greg Schafer.</para>
         </listitem>
       </itemizedlist>

+ 3 - 2
general.ent

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!ENTITY version "SVN-20080522">
-<!ENTITY releasedate "May 22, 2008">
+<!ENTITY version "SVN-20080603">
+<!ENTITY releasedate "June 3, 2008">
+<!ENTITY copyrightdate "1999&ndash;2008">
 <!ENTITY milestone "7.0">
 <!ENTITY generic-version "development"> <!-- Use "development", "testing", or "x.y[-pre{x}]" -->
 

+ 2 - 0
index.xml

@@ -41,6 +41,8 @@
 <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/acronymlist.xml"/>
 <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/acknowledgments.xml"/>
 <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/dependencies.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/scripts.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/license.xml"/>
 </part>
 
 <index/>

+ 22 - 0
make-aux-files.sh

@@ -0,0 +1,22 @@
+#!/bin/bash
+
+rm -f lfs-bootscripts*.tar.bz2
+
+# Get base file name and move bootscripts directory to that name
+version=`grep "ENTITY lfs-bootscripts-version" packages.ent |cut -d'"' -f2`
+mv bootscripts lfs-bootscripts-$version
+
+# Create the tarball and clean up
+tar -cjf lfs-bootscripts-$version.tar.bz2 --exclude .svn lfs-bootscripts-$version
+mv lfs-bootscripts-$version bootscripts 
+
+rm -f udev-config*.bz2
+
+# Get file name and move udev config directory to that name
+version=`grep "ENTITY udev-config " packages.ent |cut -d'"' -f2`
+mv udev-config $version
+
+# Create the tarball and clean up
+tar -cjf $version.tar.bz2 --exclude .svn $version
+mv $version udev-config
+

+ 7 - 7
packages.ent

@@ -283,12 +283,12 @@
 <!ENTITY less-ch6-du "2.8 MB">
 <!ENTITY less-ch6-sbu "0.1 SBU">
 
-<!ENTITY lfs-bootscripts-version "20080522">
-<!ENTITY lfs-bootscripts-size "42 KB">
+<!ENTITY lfs-bootscripts-version "20080522">                 <!-- Scripts depend on this format -->
+<!ENTITY lfs-bootscripts-size "BOOTSCRIPTS-SIZE KB">         <!-- Updated in Makefile -->
 <!ENTITY lfs-bootscripts-url "&downloads-root;lfs-bootscripts-&lfs-bootscripts-version;.tar.bz2">
-<!ENTITY lfs-bootscripts-md5 "2f29eb04b3373de58b770e3946575751">
+<!ENTITY lfs-bootscripts-md5 "BOOTSCRIPTS-MD5SUM">           <!-- Updated in Makefile -->
 <!ENTITY lfs-bootscripts-home " ">
-<!ENTITY lfs-bootscripts-ch7-du "0.4 MB">
+<!ENTITY lfs-bootscripts-ch7-du "BOOTSCRIPTS-INSTALL-KB KB"> <!-- Updated in Makefile -->
 <!ENTITY lfs-bootscripts-ch7-sbu "less than 0.1 SBU">
 
 <!ENTITY libtool-version "1.5.26">
@@ -496,10 +496,10 @@
 <!ENTITY udev-ch6-du "7.6 MB">
 <!ENTITY udev-ch6-sbu "0.1 SBU">
 
-<!ENTITY udev-config "udev-config-20080522">
-<!ENTITY udev-config-size "13 KB">
+<!ENTITY udev-config "udev-config-20080522"> <!-- Scripts depend on this format -->
+<!ENTITY udev-config-size "UDEV-SIZE KB">    <!-- Updated in Makefile -->
 <!ENTITY udev-config-url "&downloads-root;&udev-config;.tar.bz2">
-<!ENTITY udev-config-md5 "cb5126322dacf38fe1770c28119208d5">
+<!ENTITY udev-config-md5 "UDEV-MD5SUM">      <!-- Updated in Makefile -->
 <!ENTITY udev-config-home " ">
 
 <!ENTITY util-linux-ng-version "2.13.1">

+ 22 - 0
process-scripts.sh

@@ -0,0 +1,22 @@
+#!/bin/sh
+
+for s in bootscripts/lfs/init.d/*                    \
+         bootscripts/lfs/sysconfig/*                 \
+         bootscripts/lfs/sysconfig/network-devices/* \
+         bootscripts/lfs/sysconfig/network-devices/services/*
+do
+  script=`basename $s`
+  
+  # Skip directories
+  [ $script == 'network-devices' ] && continue
+  [ $script == 'services'        ] && continue
+
+  # Disambiguate duplicate file names
+  [ $s == 'bootscripts/lfs/sysconfig/rc'      ] && script='rc-sysinit'; 
+  [ $s == 'bootscripts/lfs/sysconfig/modules' ] && script='modules-sysinit'; 
+  
+  sed  -e 's/\&/\&amp\;/g' -e 's/</\&lt\;/g'   -e 's/>/\&gt\;/g' \
+       -e "s/'/\&apos\;/g" -e 's/"/\&quot\;/g' -e 's/\t/    /g'  \
+       $s > appendices/${script}.script 
+done
+

+ 7 - 33
prologue/bookinfo.xml

@@ -19,47 +19,21 @@
 
 
   <copyright id="copyright">
-    <year>1999&ndash;2008</year>
+    <year>&copyrightdate;</year>
     <holder>Gerard Beekmans</holder>
   </copyright>
 
   <legalnotice>
-    <para>Copyright (c) 1999&ndash;2007, Gerard Beekmans</para>
+    <para>Copyright &copy; &copyrightdate;, Gerard Beekmans</para>
 
     <para>All rights reserved.</para>
 
-    <para>Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are
-    met:</para>
+    <para>This book is licensed under a <xref linkend="CC"/>.</para>
+    <para>Computer instructions may be extracted from the book under the 
+          <xref linkend="MIT"/>.</para>
 
-    <itemizedlist>
-      <listitem>
-        <para>Redistributions in any form must retain the above copyright
-        notice, this list of conditions and the following disclaimer</para>
-      </listitem>
-      <listitem>
-        <para>Neither the name of <quote>Linux From Scratch</quote> nor the
-        names of its contributors may be used to endorse or promote products
-        derived from  this material without specific prior written
-        permission</para>
-      </listitem>
-      <listitem>
-        <para>Any material derived from Linux From Scratch must contain
-        a reference to the <quote>Linux From Scratch</quote> project</para>
-      </listitem>
-    </itemizedlist>
-
-    <para>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-    <quote>AS IS</quote> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
-    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-    ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</para>
+    <para><trademark class='registered'>Linux</trademark> is a registered trademark of
+    Linus Torvalds.</para>
 
   </legalnotice>
 

+ 101 - 0
udev-config/55-lfs.rules

@@ -0,0 +1,101 @@
+# /etc/udev/rules.d/25-lfs.rules: Rule definitions for LFS.
+
+# Core kernel devices
+
+# override both of these
+KERNEL=="random",   MODE="0444"
+KERNEL=="urandom",  MODE="0444"
+
+KERNEL=="aio",      MODE="0444"
+KERNEL=="kmsg",     MODE="0600"
+KERNEL=="rtc",      MODE="0666"
+
+# Comms devices
+
+KERNEL=="rfcomm[0-9]*",     GROUP="uucp"
+KERNEL=="ippp[0-9]*",       GROUP="uucp"
+KERNEL=="isdn[0-9]*",       GROUP="uucp"
+KERNEL=="isdnctrl[0-9]*",   GROUP="uucp"
+KERNEL=="capi",             NAME="capi20",  SYMLINK+="isdn/capi20"
+KERNEL=="capi?*",           NAME="capi/%n", GROUP="uucp"
+KERNEL=="dcbri[0-9]*",      GROUP="uucp"
+
+# ALSA devices go in their own subdirectory
+
+KERNEL=="controlC[0-9]*",        GROUP="audio",  NAME="snd/%k"
+KERNEL=="hwC[0-9]*D[0-9]*",      GROUP="audio",  NAME="snd/%k"
+KERNEL=="pcmC[0-9]*D[0-9]*[cp]", GROUP="audio",  NAME="snd/%k"
+KERNEL=="midiC[0-9]*D[0-9]*",    GROUP="audio",  NAME="snd/%k"
+KERNEL=="timer",                 GROUP="audio",  NAME="snd/%k"
+KERNEL=="seq",                   GROUP="audio",  NAME="snd/%k"
+
+# Sound devices
+
+KERNEL=="admmidi*",     GROUP="audio"
+KERNEL=="adsp*",        GROUP="audio"
+KERNEL=="aload*",       GROUP="audio"
+KERNEL=="amidi*",       GROUP="audio"
+KERNEL=="amixer*",      GROUP="audio"
+KERNEL=="audio*",       GROUP="audio"
+KERNEL=="dmfm*",        GROUP="audio"
+KERNEL=="dmmidi*",      GROUP="audio"
+KERNEL=="dsp*",         GROUP="audio"
+KERNEL=="midi*",        GROUP="audio"
+KERNEL=="mixer*",       GROUP="audio"
+KERNEL=="music",        GROUP="audio"
+KERNEL=="sequencer*",   GROUP="audio"
+
+# Input devices
+
+# override MODE on these four
+KERNEL=="mice",     MODE="0644",	SYMLINK+="mouse"
+KERNEL=="mouse*",   MODE="0644"
+KERNEL=="event*",   MODE="0644"
+KERNEL=="ts*",      MODE="0644"
+
+KERNEL=="psaux",    MODE="0644"
+KERNEL=="js",       MODE="0644"
+KERNEL=="djs",      MODE="0644"
+
+# USB devices go in their own subdirectory
+
+KERNEL=="hiddev*",          NAME="usb/%k"
+KERNEL=="legousbtower*",    NAME="usb/%k"
+KERNEL=="dabusb*",          NAME="usb/%k"
+SUBSYSTEMS=="usb", KERNEL=="lp[0-9]*", NAME="usb/%k"
+
+# DRI devices are managed by the X server, so prevent udev from creating them
+
+KERNEL=="card*",    OPTIONS+="ignore_device"
+
+# Video devices
+
+KERNEL=="fb[0-9]*",     GROUP="video"
+KERNEL=="video[0-9]*",  GROUP="video"
+KERNEL=="radio[0-9]*",  GROUP="video"
+KERNEL=="vbi[0-9]*",    GROUP="video"
+KERNEL=="vtx[0-9]*",    GROUP="video"
+
+# DVB devices
+
+SUBSYSTEM=="dvb", GROUP="video"
+
+# Storage/memory devices
+
+# override: make group-writable
+SUBSYSTEM=="block", MODE="0660"
+
+# dmsetup and lvm2 related programs create devicemapper devices so we prevent
+# udev from creating them
+
+KERNEL=="dm-*",             OPTIONS+="ignore_device"
+
+# Tape devices
+
+# override all these
+KERNEL=="ht[0-9]*",     GROUP="tape"
+KERNEL=="nht[0-9]*",    GROUP="tape"
+KERNEL=="pt[0-9]*",     GROUP="tape"
+KERNEL=="npt[0-9]*",    GROUP="tape"
+KERNEL=="st[0-9]*",     GROUP="tape"
+KERNEL=="nst[0-9]*",    GROUP="tape"

+ 3 - 0
udev-config/61-cdrom.rules

@@ -0,0 +1,3 @@
+# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions.
+
+ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", GROUP="cdrom"

+ 199 - 0
udev-config/ChangeLog

@@ -0,0 +1,199 @@
+2008-05-21	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 81-firmware.rules, doc/81-firmware.txt: Remove.  This rule is
+	  already handled by udev's 50-udev-default.rules file.  The docs
+	  can be added back later if needed.
+	* Makefile: Don't install the above deleted files.
+	* 55-lfs.rules: Remove the device-mapper rule, since the upstream
+	  50-udev-default.rules file handles it properly.
+
+2008-04-02	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* Makefile: Make the package DESTDIR-friendly by installing the docs
+	  into a fixed $(PREFIX)/share/doc/udev-config directory, instead of
+	  trying to figure out what version of udev was just installed.
+
+2007-10-30	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 55-lfs.rules: Since the dialout group was renamed to uucp, delete
+	  the rules that override upstream's assignment of the dialout group.
+	  Replace "dialout" with "uucp" on the remaining rules.
+
+2007-10-29	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 51-lfs.rules: Move to 55-lfs.rules.
+	* doc/51-lfs.rules: Move to doc/55-lfs.rules.
+
+2007-10-27	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 25-lfs.rules: Some rules in here are duplicates of rules from udev's
+	  new 50-udev-defaults.rules file; remove them. Override permissions
+	  where needed elsewhere (and document overrides in comments).
+	* 26-modprobe.rules: Provided by udev's 80-drivers.rules and built-in
+	  modaliases for SCSI device-type modules in 2.6.22+ kernels; remove.
+
+	* 25-lfs.rules: Move to 51-lfs.rules.
+	* 27-firmware.rules: Move to 81-firmware.rules.
+	* 81-cdrom.rules: Move to 61-cdrom.rules.
+
+	* doc/25-lfs.txt: Rename to 51-lfs.txt.
+	* doc/26-modprobe.txt: Rename to 80-drivers.txt, and modify to reflect
+	  the upstream rules.
+	* doc/27-firmware.txt: Rename to 81-firmware.txt.
+	* doc/81-cdrom.txt: Rename to 61-cdrom.txt.
+
+	* Makefile: Use new filenames.
+
+2007-07-31	Dan Nicholson <dnicholson@linuxfromscratch.org>
+	* 25-lfs.rules: Changed the usb_device rule tto create /dev/bus/usb
+	  nodes if the usb_device in 2.6.22+ kernels. The rule was also changed
+	  to only trigger on "add" events. This change is not backwards
+	  compatible with older kernels.
+
+2007-06-12	Dan Nicholson <dnicholson@linuxfromscratch.org>
+	* 25-lfs.rules: Fix the CPUID nodes from cpu/%n/cpu to cpu/%n/cpuid,
+	  which is what's expected in userspace apps such as x86info.
+
+2007-06-08	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 25-lfs.rules: Add rules for DVB devices (create nodes in /dev/dvb/)
+	  and floppies (create extra nodes based on CMOS type), copied from
+	  the SuSE rules file.  Thanks to Alexander Patrakov for the bugreport.
+
+2007-03-04	Matthew Burgess	<matthew@linuxfromscratch.org>
+	* Makefile: Use `udevd --version' to work out what version of Udev is
+	  installed (requires Udev >= 106)
+
+2007-01-02	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 25-lfs.rules: Change CPU devices (cpu, msr, microcode) to be in
+	  /dev/cpu/ and /dev/cpu/N/, to match Documentation/devices.txt.
+
+2006-10-21	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* Makefile: Add a missing backslash in install-extra-doc.
+
+	* 05-udev-early.rules, 60-persistent-input.rules,
+	  60-persistent-storage.rules, 95-udev-late.rules: Remove.  The book
+	  will install these files from udev's etc/udev/rules.d directory
+	  instead.
+	* Makefile: Don't install these rules files after all.  Also, only
+	  install corresponding docs if requested.
+
+2006-10-20	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* Makefile: Added; contains targets to install rules and doc files.
+	  From Dan Nicholson.
+
+2006-10-14	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 05-udev-early.rules, 60-persistent-storage.rules: Sync up with
+	  upstream sample rules files (from udev-102), except for one rule
+	  which is more specific in our tarball and should probably be changed
+	  upstream. 
+	* doc/60-persistent-storage.txt: Modify to match the changes.  Also
+	  fix a couple typos.
+
+	* 25-lfs.rules: Remove duplicate rules (ttyS[0-9]* is also matched by
+	  tty[BC...S...][0-9]*, and ttyUSB[0-9]* is in there twice).
+
+	* 25-lfs.rules: Fix Alsa device KERNEL rules.  Udev uses shell-style
+	  glob matching, not regular expressions, so the old rules would match
+	  nonsense device names like hw0asdf and pcmDzxcv.  As long as the first
+	  character after the "fixed" portion was in the list, the rule would
+	  match; it wouldn't apply the same character range to later characters.
+
+	* doc/25-lfs.txt: Add a note on interaction between permissions and
+	  symlinks.
+
+2006-10-09	Bryan Kadzban	<bryan@linuxfromscrtach.org>
+	* 25-lfs.rules: Fix fb[0-9]* device permissions (should use the default
+	  0660).
+
+	* doc/25-lfs.txt: Fix typo: /dev/ptmx is given mode 0666, not 0660.
+	  Also tweak the comment about other TTY devices.
+
+2006-10-04	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 05-udev-early.rules: Remove WAIT_FOR_SYSFS="bus" rule.  With kernel
+	  2.6.18, this rule is no longer required.
+
+	* doc/05-udev-early.txt: Update to match.
+
+2006-09-28	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* doc/60-persistent-storage.txt: Explain persistent storage rules, or
+	  at least the parts I understand.  (I don't use DASD or netblock or
+	  several other supported configurations.)
+
+	* doc/81-cdrom.txt: Explain 81-cdrom.rules.
+
+	* doc/95-udev-late.txt: Explain 95-udev-late.rules.  Documentation is
+	  now finished.
+
+2006-09-26	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* doc/60-persistent-input.txt: Explain (in probably too much detail)
+	  60-persistent-input.rules.
+
+2006-09-24	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* doc/05-udev-early.txt: Rewrap to fit 80 columns.
+
+	* doc/26-modprobe.txt: Explain 26-modprobe.rules, and modaliases.
+
+	* doc/27-firmware.txt: Explain 27-firmware.rules.
+
+2006-09-24	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* doc/25-lfs.txt: Explain 25-lfs.rules.
+
+	* 25-lfs.rules: Use SYMLINK+= for isdn/capi20 also.
+
+2006-09-23	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* doc: New subdirectory to contain documentation of rules
+	* doc/README: New file, top-level documentation
+	* doc/*.txt: New documentation files, one for each rules file.  Only
+	  05-udev-early.txt has anything in it.
+
+2006-09-23	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 25-lfs.rules: Add "ignore_device" to OPTIONS for DRI devices, instead
+	  of setting NAME to an empty string.  This matches the way we ignore
+	  devmapper / LVM devices.
+
+2006-09-22	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 60-persistent-input.rules, 95-udev-late.rules: Import from udev-100.
+	  60-persistent-input.rules creates persistent symlinks for input
+	  devices, and 95-udev-late.rules enables udevmonitor.
+
+	* 60-persistent-storage.rules: Replace ATTRS{../removable} with just
+	  ATTRS{removable} on partition devices. Replace ATTRS{removable}
+	  with ATTR{removable} on whole-disk devices.
+
+2006-09-20	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* 05-early.rules: Missed a rule in the last change.  ENV{PHYSDEVBUS}
+	  in the rule that waits for the "bus" symlink should be replaced by
+	  SUBSYSTEMS.
+
+2006-09-20	Bryan Kadzban	<bryan@linuxfromscratch.org>
+	* Adapted rules to the new matches used in udev-098 and above (e.g.,
+	  SYSFS becomes ATTRS).  Prevents warnings, and support for the old
+	  matches will be removed eventually.  These rules will not work with
+	  udev-097 and before!
+	* Fixed several bugs in the rules left over from previous udev
+	  versions (missing commas, overwriting user symlinks using ="..."
+	  instead of +="...", and matching against "*" instead of "?*").
+
+	* Renamed CHANGELOG to ChangeLog, started using pseudo-GNU-format
+	  entries.  (See standards.info; search it for "changelog" to get
+	  the general gist.)
+
+dnicholson - Jul 14, 2006
+	* Fixed usbdev PROGRAM so that it works with the BusyBox sh. Thanks
+	  to Anthony Wright.
+
+n/a - Jul 12, 2006
+	* Added options so temporary nodes are not created with device-mapper
+	* Adapted cdrom rules to identify CD-ROM drives correctly by adding
+	  SUBSYSTEM=="block" test.
+	* Added simple 81-cdrom.rules file to set cdrom group ownership
+
+n/a - Jun 07, 2006
+	* Removed nvidia rules
+	* Removed bug reporting rule
+	* Moved Debian-based persistent CD-ROM rules to contrib
+	* Adapted firmware rule to udev-093
+
+n/a - May 15, 2006
+	* Part one of 25-lfs.rules rewrite
+	* Some minor tweaking of the layout
+
+n/a - May 12, 2006
+	* Initial import of the udev-config directory.
+	* Reorganized and modularized the rules files.
+	* Added explanatory comments

+ 42 - 0
udev-config/Makefile

@@ -0,0 +1,42 @@
+# Makefile to install udev rules and documentation
+
+PREFIX = /usr
+RULES_DIR = /etc/udev/rules.d
+INSTALL = install
+INSTALL_DATA = $(INSTALL) -m644
+RULES_FILES = \
+	55-lfs.rules \
+	61-cdrom.rules
+DOC_FILES = $(RULES_FILES:.rules=.txt)
+
+EXTRA_DOC_FILES = \
+	05-udev-early.txt \
+	60-persistent-input.txt \
+	60-persistent-storage.txt \
+	80-drivers.txt \
+	95-udev-late.txt
+
+# Location to install the docs
+DOC_DIR = $(PREFIX)/share/doc/udev-config
+
+all:
+
+install: install-rules
+
+install-rules:
+	$(INSTALL) -d $(DESTDIR)$(RULES_DIR)
+	for rule in $(RULES_FILES); do \
+		$(INSTALL_DATA) $$rule $(DESTDIR)$(RULES_DIR) || exit 1; \
+	done;
+
+install-doc:
+	$(INSTALL) -d $(DESTDIR)$(DOC_DIR)
+	for doc in $(DOC_FILES); do \
+		$(INSTALL_DATA) doc/$$doc $(DESTDIR)$(DOC_DIR) || exit 1; \
+	done
+
+install-extra-doc:
+	$(INSTALL) -d $(DESTDIR)$(DOC_DIR)
+	for doc in $(EXTRA_DOC_FILES); do \
+		$(INSTALL_DATA) doc/$$doc $(DESTDIR)$(DOC_DIR) || exit 1; \
+	done

+ 3 - 0
udev-config/contrib/debian/81-cdrom.rules

@@ -0,0 +1,3 @@
+# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions and get device capabilities
+
+ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom"

+ 12 - 0
udev-config/contrib/debian/83-cdrom-symlinks.rules

@@ -0,0 +1,12 @@
+# /etc/udev/rules.d/83-cdrom-symlinks.rules: Determine CD drive capability.
+
+ACTION!="add",          GOTO="cd_aliases_generator_end"
+SUBSYSTEM!="block",     GOTO="cd_aliases_generator_end"
+ENV{GENERATED}=="?*",   GOTO="cd_aliases_generator_end"
+
+# Fail the uevent if the autogenerated rules cannot be saved
+ENV{ID_CDROM}=="?*", PROGRAM="/bin/grep -c ' / [^[:space:]]* rw' /proc/mounts", RESULT!="2", RUN+="/bin/false", GOTO="cd_aliases_generator_end"
+
+ENV{ID_CDROM}=="?*", PROGRAM="write_cd_aliases", SYMLINK+="%c"
+
+LABEL="cd_aliases_generator_end"

+ 111 - 0
udev-config/contrib/debian/write_cd_aliases

@@ -0,0 +1,111 @@
+#!/bin/sh -e
+
+RULES_FILE="/etc/udev/rules.d/82-persistent-cd.rules"
+
+##############################################################################
+lock_rules_file() {
+  RULES_LOCK="/dev/.udev/.lock-${RULES_FILE##*/}"
+
+  retry=30
+  while ! mkdir $RULES_LOCK 2> /dev/null; do
+    if [ $retry -eq 0 ]; then
+       echo "Cannot lock $RULES_FILE!" >&2
+       exit 2
+    fi
+    sleep 1
+    retry=$(($retry - 1))
+  done
+}
+
+unlock_rules_file() {
+  rmdir $RULES_LOCK || true
+}
+
+##############################################################################
+find_next_available() {
+  # use echo to convert newlines to spaces
+  local links=`echo $(find_all_symlinks $1)`
+  local basename=${links%%[ 0-9]*}
+  local max=-1
+  for name in $links; do
+    local num=${name#$basename}
+    [ "$num" ] || num=0
+    [ $num -gt $max ] && max=$num
+  done
+
+  max=$(($max + 1))
+  # "name0" actually is just "name"
+  [ $max -eq 0 ] && return
+  echo "$max"
+}
+
+find_all_symlinks() {
+  local linkre="$1"
+  local match="$2"
+
+  [ -e $RULES_FILE ] || return
+
+  local search='.*[[:space:],]SYMLINK+="\('"$linkre"'\)"[[:space:]]*\(,.*\|\\\|\)$'
+
+  sed -n -e "${match}s/${search}/\1/p" $RULES_FILE
+}
+
+write_rule() {
+  local match="$1"
+  local link="$2"
+  local comment="$3"
+
+  [ -e "$RULES_FILE" ] || PRINT_HEADER=1
+  {
+  if [ "$PRINT_HEADER" ]; then
+    PRINT_HEADER=
+    echo "# This file was automatically generated by the $0"
+    echo "# program, probably run by the 83-cdrom.rules rules file."
+    echo "#"
+    echo "# You can modify it, as long as you keep each rule on a single line"
+    echo "# and set the \$GENERATED variable."
+    echo ""
+  fi
+
+  [ "$comment" ] && echo "# $comment"
+  echo "ACTION==\"add\", SUBSYSTEM==\"block\", $match, ENV{ID_CDROM}==\"1\", SYMLINK+=\"$link\", ENV{GENERATED}=\"1\""
+  } >> $RULES_FILE
+  SYMLINKS="$SYMLINKS $link"
+}
+
+##############################################################################
+if [ -z "$DEVPATH" ]; then
+  echo "Missing \$DEVPATH." >&2
+  exit 1
+fi
+if [ -z "$ID_CDROM" ]; then
+  echo "$DEVPATH is not a CD reader." >&2
+  exit 1
+fi
+
+# Prevent parallel processes from modifying the file at the same time.
+lock_rules_file
+
+link_num=$(find_next_available 'cdrom[0-9]*')
+
+#match="ENV{ID_PATH}==\"$ID_PATH\""
+
+#kernel=${DEVPATH##*/}
+#match="KERNEL==\"$kernel\""
+
+id=${PHYSDEVPATH##*/}
+match="BUS==\"$PHYSDEVBUS\", ID==\"$id\""
+
+comment="$ID_MODEL ($ID_PATH)"
+
+			  write_rule "$match" "cdrom$link_num" "$comment"
+[ "$ID_CDROM_CD_RW" ]  && write_rule "$match" "cdrw$link_num"
+[ "$ID_CDROM_DVD" ]    && write_rule "$match" "dvd$link_num"
+[ "$ID_CDROM_DVD_RW" ] && write_rule "$match" "dvdrw$link_num"
+
+unlock_rules_file
+
+echo $SYMLINKS
+
+exit 0
+

+ 33 - 0
udev-config/doc/05-udev-early.txt

@@ -0,0 +1,33 @@
+Purpose of rules file:
+
+The kernel does not always fully populate a given kobject's attributes before
+sending the uevent for that kobject.  This means that a given sysfs directory
+may not have all the required files in it (each directory corresponds to a
+kobject, and each file corresponds to an attribute).
+
+Therefore, we must sometimes wait for attributes to show up when devices are
+discovered.  This is accomplished by udev's WAIT_FOR_SYSFS rule types.
+
+
+Description of rules:
+
+All rules in this file match ACTION="add", because none of them apply when
+devices are being removed.
+
+SUBSYSTEM is the kernel subsystem that the device uses.  Current kernels have
+some issues with SCSI device attributes being created too late.  For any device
+with a SUBSYSTEM of scsi, we must wait for the ioerr_cnt attribute.  (This is
+the last attribute created for SCSI devices, so when this attribute appears,
+the kobject is fully populated.)
+
+It is also possible to use SUBSYSTEMS in Udev rules.  Using SUBSYSTEMS would
+cause Udev to search up the device tree for a matching SUBSYSTEM value.  (Note
+that "the device tree" is not necessarily the same as the path under /sys (the
+DEVPATH).  Rather, "up the device tree" is the path followed by udevinfo when
+it is given the argument "-a".)
+
+We do not use SUBSYSTEMS in this rule, because we only care about the SUBSYSTEM
+of the kobject in question.  We don't care about devices that are children of
+SCSI devices, only the SCSI device itself.  We will use SUBSYSTEMS in later
+rules, though.
+

+ 94 - 0
udev-config/doc/55-lfs.txt

@@ -0,0 +1,94 @@
+Purpose of rules file:
+
+This is the core rules file for Udev on LFS.  If these rules were not included,
+most devices would either only work for root, or would not work at all.
+
+
+Description of rules:
+
+By default, Udev creates device nodes with UID 0, GID 0, and permissions 0660,
+and in one flat directory structure with all nodes in /dev.  This does not
+always work well.
+
+KERNEL=="ptmx"
+
+Any uevent generated by the kernel with a name matching "ptmx" will match this
+rule.  Note that the matching done by Udev is shell-style; these are not regex
+matches.  For the ptmx device, we first change the permisions, by assigning to
+the MODE value:
+
+KERNEL=="ptmx", MODE="0666"
+
+We also assign a different GID to /dev/ptmx (also all other TTY devices), by
+assigning to the GROUP value:
+
+KERNEL=="ptmx", MODE="0666", "GROUP="tty"
+
+
+There are also devices that should not be in /dev, because historically they
+have been created in subdirectories instead.  For instance, all Alsa devices
+have traditionally been put into the /dev/snd subdirectory:
+
+KERNEL=="controlC[0-9]*", <...>, NAME="snd/%k"
+
+"%k" expands into "the original value of KERNEL" (note: not the pattern that was
+matched against).  This type of rule puts any matching device into the snd/
+subdirectory.
+
+Sometimes we need to move devices based on more than just their name.  For
+example, USB printer devices need to be moved to /dev/usb/lpX, but we can't
+match only "lp[0-9]*", because that would also match parallel port printers.
+So we match both KERNEL and SUBSYSTEMS in this case, to move USB printers only.
+
+
+Some devices also commonly have symlinks pointing to them -- for example,
+/dev/mouse is usually a symlink to /dev/input/mice.  We acheive this by
+assigning to the SYMLINK value.  But note that SYMLINK can store multiple values
+(because each device node could have multiple symlinks pointing to it), so we
+need to add to the list of symlinks, not overwrite the whole list:
+
+KERNEL=="mice", <...>, SYMLINK+="mouse"
+
+If we needed to add multiple symlinks, they would be space-separated inside the
+double quotes.
+
+Of course, symlinks, permissions, and device names can all be combined in a
+rule if needed.  But note that if you combine permissions and symlinks, or if
+you combine GROUP and symlinks, the permissions of the symlink will not be
+modified, only those of the target device.  (This is because the kernel does
+not pay any attention to the permissions on symlinks, only the permissions on
+their targets, and there's no reason to change something that won't be used.)
+
+
+Finally, we have this rule:
+
+SUBSYSTEM=="usb_device", PROGRAM="/bin/sh -c 'X=%k; X=$${X#usbdev}; B=$${X%%%%.*} D=$${X#*.}; echo bus/usb/$$B/$$D'", NAME="%c"
+
+This rule matches any device under the SUBSYSTEM of usb_device.  (All devices
+that were traditionally created under /proc/bus/usb/ use this subsystem.)  We
+tell Udev to run the specified PROGRAM; Udev will save the output of this
+program (it will be available under %c later).
+
+The program itself is a shell that starts by setting the variable X to the
+original kernel name (which is "usbdevB.D" for these devices, where B and D are
+the bus and device numbers of the USB device).  Then, the rule re-sets X to the
+value of X with the string "usbdev" removed from the start.  So now, X has the
+value "B.D".  Then, the rule sets B to the value of X after a period, and all
+characters following it, have been removed from the end; this sets B to just
+the string "B" (just the bus number of the USB device).  Then, the rule sets D
+to the value of X after a period, and all characters before it, have been
+removed from the beginning; this sets D to just the string "D" (just the device
+number).
+
+Then, the rule echoes "bus/usb/$B/$D" (bus/usb/bus-number/device-number), so
+Udev will capture that value.  The rule sets NAME="%c" to put the device node
+at /dev/bus/usb/bus-number/device-number.  (This is the same layout that the
+/proc/bus/usb/ devices used.)
+
+Most of the doubled characters in this rule are doubled so that Udev does not
+interpret them.  The rule looks all the more confusing because of this method
+of escaping special characters.
+
+
+A final word of caution: Any particular rule must be written on one line, and a
+comma must separate each part of the rule.

+ 86 - 0
udev-config/doc/60-persistent-input.txt

@@ -0,0 +1,86 @@
+Purpose of rules file:
+
+This rules file provides nonvolatile, unique names (in the form of symlinks)
+for input devices that cooperate.
+
+
+Description of rules:
+
+This file starts off with a few rules that make Udev skip the entire file if
+the current uevent is not input related.  If ACTION is not "add", or SUBSYSTEM
+is not "input", or KERNEL (the device node) matches "input[0-9]*", then Udev
+will GOTO the LABEL named "persistent_input_end", which is the last rule in
+this file.  (input[0-9]* uevents are skipped because they do not create device
+nodes.)
+
+This type of "skip this list of rules if X" operation is done in both the
+persistent input and persistent storage rules files.  The reason is efficiency
+-- if Udev had to go run the usb_id and/or path_id programs for non-input and
+non-storage rules, those rules would take much longer to process for no good
+reason.
+
+
+First in this file is a set of rules for by-ID style symlinks.  These attempt
+to uniquely identify a device based on its serial number, but there are some
+issues with this.  Many USB manufacturers do not provide a unique serial number
+for each device -- for instance, my Microsoft Intellimouse Optical has a USB
+serial number of "Microsoft_Microsoft_IntelliMouse_Optical".  This kind of
+nonsensical "serial number" means that if you plug in two Intellimouse Optical
+devices, they will both get the same by-id symlink, and the device that the
+symlink points to will be random.  This defeats the purpose of by-ID symlinks.
+(However, I believe this behavior is technically valid according to the USB
+standard.  I believe it is not recommended, though.)
+
+Anyway, first in the by-ID rules, we have a rule that runs for any (input)
+device hanging anywhere off a USB bus.  It uses the IMPORT{program} option to
+run the "/lib/udev/usb_id -x" program.  usb_id looks at the environment to find
+out which device to look at, generates a list of environment-variable VAR=value
+pairs, and prints them.  Udev stores this output away while the process is
+running.  After the process exits, Udev modifies the current environment to
+include the VARs that usb_id printed.  (It assigns the "value"s that usb_id
+printed to each of those VARs.)  Specifically, usb_id prints ID_VENDOR,
+ID_MODEL, ID_REVISION, ID_SERIAL, ID_TYPE, and ID_BUS (at least in the case of
+the aforementioned USB optical mouse).  These variable names will all be set in
+the environment.
+
+Then, we have a set of rules to set ID_CLASS for various types of devices.  The
+rules first check for a "usb"-bus device that has a "bInterfaceClass" of 03 and
+a "bInterfaceProtocol" of 01.  If the interface class is 03, this is an HID
+device.  If the protocol is 01, it's a keyboard device.  So we set ID_CLASS to
+"kbd".  The next rule checks whether the interface protocol is 02, and if so,
+sets ID_CLASS to "mouse" (HID devices with a protocol of 02 are mice).
+
+Any input device that the "pcspkr" driver claims must be a speaker.  Any input
+device that the "atkbd" driver claims must be a keyboard.  Any input device
+that the "psmouse" driver claims must be a mouse.  If there's a sysfs attribute
+named "name", whose contents contain "dvb", "DVB", or " IR ", then we set
+ID_CLASS to "ir".
+
+Then, we have a rule to search the tree and find the first parent that has a
+modalias.  If that modalias matches the big long ugly string in the rules file,
+we assume this is a joystick device, and set ID_CLASS appropriately.  (This
+parent should be the kobject for the joystick device itself.  The reason we
+search the tree is that the current uevent is for a device node, not the
+physical joystick device.)
+
+Once the ID_CLASS variable is set properly, we have one more modification to
+perform: if the ID_SERIAL variable was not set at all by the usb_id program, we
+set it to "noserial".
+
+Now that all the environment variables are set up properly, we start generating
+the by-ID symlinks in /dev/input/by-id/.  If the current device node's name
+starts with "event", we add "event" into the symlink name.  Otherwise, we don't
+add anything for mice.  (Other device types don't get a persistent by-ID
+symlink.)
+
+
+Next, we create by-path symlinks.  The /lib/udev/path_id program takes the path
+of the device as an argument, and prints out "ID_PATH=string", where "string"
+is the "shortest physical path" to the device.  We import this value into the
+environment.
+
+If the path is non-empty, and the device node name starts with "mouse" or
+"event", we add a by-path symlink based on the path and the device class (and
+we also add "event" if it's an event device).  This symlink should be stable as
+long as the device never moves to a different port.
+

+ 95 - 0
udev-config/doc/60-persistent-storage.txt

@@ -0,0 +1,95 @@
+Purpose of rules file:
+
+This rules file provides nonvolatile, unique names (in the form of symlinks)
+for various types of storage devices -- both IDE/ATA and SCSI.
+
+
+Description of rules:
+
+First, similar to the 60-persistent-input.rules file, we skip the entire file
+for uevents that this rules file should not apply to, as an optimization.  The
+file does not apply to removal uevents or non-block devices.  It does not apply
+to ramdisks, loopback-mount devices, floppy disks, netblock devices, or device-
+mapper devices.  It also should not apply to removable devices (that is, non-
+partition devices with attributes named "removable" with the value "1", or
+partition devices whose parents have "removable" set to "1" -- partition
+kobjects don't have the "removable" attribute, only whole-disk kobjects do).
+
+For partition devices, we use the IMPORT{parent} option to pull in all the
+environment variables that get set for the parent device.  (The parent of a
+partition device is the containing whole-disk device.)  The IMPORT{parent}
+option is documented in the udev(7) manpage, but basically the value that we
+assign is used as a filter of environment variable names to import.
+
+Now, we start with rules to create by-ID symlinks (similar to the by-ID links
+created for input devices).  For hd* whole-disk devices (they're IDE/ATA, since 
+they start with hd), we run the ata_id program in --export mode.  The ata_id
+program requires a device node to be passed, so we also use the $tempnode Udev
+variable -- this causes Udev to create a temporary device node somewhere and
+substitute its name where $tempnode appears in the program command line.
+
+The ata_id program, in --export mode, prints several ID_* values.  If we're
+looking at a whole-disk device, and if ID_SERIAL is among those, we add a
+symlink containing the device's ID_MODEL and ID_SERIAL values.  If we're
+looking at a partition device, we create an ID_MODEL- and ID_SERIAL-based
+symlink also, but we add -partX to the end of the link name (where X is the
+partition number).
+
+For SCSI devices, we first make some modifications to the environment.  If the
+device's kobject has a parent with a non-empty "ieee1394_id" attribute, then
+the device is Firewire, so we set the ID_SERIAL environment variable to the
+value of that attribute, and we set ID_BUS to "ieee1394".  Now, if ID_SERIAL is
+not set, we run usb_id, which (if this is a USB storage device) will print
+various values.  If ID_SERIAL is still unset, we run scsi_id with a set of
+parameters designed to get an ID_SERIAL by querying the device itself.  If that
+still fails, we try running scsi_id in a mode that prints the information even
+if the disk doesn't support so-called "vital product data" pages.  If the
+uevent is for a DASD device, we run dasd_id.
+
+If one of these *_id programs gave us an ID_SERIAL, then for whole-disk devices
+we create a by-ID symlink using the ID_BUS and ID_SERIAL.  For partition
+devices, we create a by-ID symlink that has the same form except we add -partX
+to the end (just like for IDE/ATA devices).
+
+
+Now we have some rules to create by-path persistent symlinks.  We start by
+running the path_id program on the DEVPATH (%p) value.  For whole-disk devices
+and SCSI ROM type devices, we create a symlink directly, using the environment
+variable ID_PATH, under the /dev/disk/by-path directory.  But for SCSI tape
+devices, we create a by-path symlink in the /dev/tape/by-path directory (we
+base the symlink on the same information, though: the ID_PATH value printed by
+path_id).  Now, for both SCSI ROM and SCSI tape devices, we skip everything
+that's left in the rules file (this is another optimization: neither SCSI ROM
+nor SCSI tape devices have UUIDs, labels, or EDD information).
+
+For partition devices, we now create a by-path symlink of the same form as the
+other partition device persistent symlinks (that is, with the same name as the
+parent device, but with -partX added).  We know that ID_PATH is set whenever it
+applies, because we ran the path_id program on the parent device, and we did an
+IMPORT{parent} on ID_* earlier in the rules file.
+
+Now we create by-label and by-uuid symlinks.  These use properties of various
+filesystems to generate a persistent name for a partition.  For instance, if
+you use the ext2 filesystem, you can use e2label to assign a label, and mke2fs
+assigns a UUID when the filesystem is created.  MS-DOS compatible filesystems
+also assign a "UUID" (actually it's just a serial number, created based on the
+date and time the partition was formatted, so it is not unique), which these
+rules will also use.  But for removable partitions, we skip the rules (for the
+same reason as we skipped them above for removable disks).
+
+We run the vol_id program to get ID_FS_USAGE, ID_FS_UUID, and ID_FS_LABEL_SAFE
+values.  (vol_id supports other values as well, but we do not use them here.)
+ID_FS_USAGE corresponds to the way the filesystem is supposed to be used; if it
+gets set to "filesystem", "other", or "crypto", we create a symlink.  If
+ID_FS_UUID is set, we use it in a by-uuid symlink.  If ID_FS_LABEL_SAFE is set,
+we use it in a by-label symlink.
+
+Finally, we create EDD-based symlinks in the by-id directory.  For whole-disk
+devices, we run edd_id to get the EDD-generated ID string.  (For partition
+devices, we import this string from the parent.)  If edd_id yields an ID_EDD
+value, we use it in a symlink, for both whole disks and partitions.
+
+
+The last rule in the file is merely a LABEL that various other rules use to
+bypass the file (or the rest of the file) when needed.
+

+ 16 - 0
udev-config/doc/61-cdrom.txt

@@ -0,0 +1,16 @@
+Purpose of rules file:
+
+This file re-assigns CD-ROM type devices to the "cdrom" group.
+
+
+Description of rules:
+
+There is only one rule here.  It depends on the 60-persistent-storage file,
+though, because it requires the ID_TYPE environment variable to be set properly
+for CD devices.  Normally the rules in the 60-persistent-storage.rules file
+will run the correct *_id programs to do this properly.
+
+If ID_TYPE is "cd", and this is a block device, and it's an add event, then we
+assign the device to the "cdrom" group.  Simple, once the *_id programs have
+all been run.
+

+ 69 - 0
udev-config/doc/80-drivers.txt

@@ -0,0 +1,69 @@
+Purpose of rules file:
+
+The rules in this file allow Udev to fully replace the old /sbin/hotplug
+script.  They automatically load kernel modules as devices are discovered.
+
+
+Description of rules:
+
+All rules in this file match ACTION=="add", so they only run when devices are
+being added.
+
+ENV{MODALIAS} is the value of the environment variable named MODALIAS.  This
+environment variable is sent by the kernel when it sends a uevent for any
+device that has a modalias.  Modaliases are strings that can be used to load
+the appropriate kernel module driver.
+
+Generally a modalias will contain information like vendor ID, device ID, and
+possibly other IDs depending on the bus the device is connected to.  (USB, for
+instance, has the concept of a "device class" and a "device interface", which
+are basically just ways to standardize the USB protocol for various types of
+devices.  This is what allows a single kernel module such as hid.ko to drive
+many different vendors' USB input devices: all devices that support the USB
+HID interface expose the HID interface number in their modalias, and so the
+hid.ko driver can be loaded for each device.  When it loads, hid.ko attaches
+to the HID interface and does whatever is needed to work with each device.)
+
+Kernel modules that drive hardware expose a list of modaliases.  These
+modaliases are matched against the device modalias by /sbin/modprobe (after
+shell-style expansion), with the help of /sbin/depmod's modules.alias file.
+The upshot of all this is, you can tell Udev to run "/sbin/modprobe modalias",
+and it will load the module that claims it can drive the "modalias" device.
+
+The rule that does this inspects ENV{MODALIAS} to ensure it is not empty.  It
+does this by comparing it to "?*" -- inside a match, "*" would match *any*
+string, including the empty string, so to ensure MODALIAS is not empty, we need
+to match against "?*" instead.  ("?" matches any one character.)
+
+The Udev RUN+="" option adds a program to run when the rule matches.  In this
+case, we tell Udev to run "/sbin/modprobe $env{MODALIAS}".  Note that Udev does
+not do path searches; if the executable is not specified with a fully-qualified
+path, it *must* be located under the /lib/udev directory.  If it is not, you
+*must* specify a fully-qualified path, as we do here.  Also, "$env{string}" is
+replaced by the value of the environment variable "string" when the command
+runs, so this adds the modalias to the modprobe command.  The modprobe program
+will do the rest.  Finally, the {ignore_error} option is added to the RUN key;
+this prevents Udev from failing the uevent if the modprobe command fails.  (The
+modprobe command will fail when run during cold-plugging, if the driver was
+configured into the kernel instead of as a module, for instance.)
+
+There is still one feature of the old hotplug shell-script system that Udev
+cannot provide: blacklisting modules from being auto-loaded.  To accomplish
+this, we must use module-init-tools.  In /etc/modprobe.conf, if you use the
+"blacklist <module-name>" syntax, modprobe will not load <module-name> under
+any name except its real module name.  Any modaliases exposed by that module
+will not be honored.
+
+
+There are also rules in this file for various other types of driver loading.
+PNP-BIOS devices, for instance, expose a list of PNP IDs in their sysfs "id"
+attribute, instead of exposing a single MODALIAS, so one rule loops through
+each ID and tries to load the appropriate module.  Several other types of
+devices require an extra module before they will work properly; one example
+of this is IDE tapes, which require the ide-scsi module.  Finally, whenever
+any SCSI device is found, the file uses the TEST key to check whether the
+/sys/module/sg directory exists.  If not, then the "sg" module -- the SCSI
+generic driver -- is loaded.  (That driver creates the module/sg directory,
+so the module/sg test is just to see whether the driver has already been
+loaded.)
+

+ 18 - 0
udev-config/doc/95-udev-late.txt

@@ -0,0 +1,18 @@
+Purpose of rules file:
+
+Sends all uevents to a Unix-domain socket, where they can be monitored by other
+programs.
+
+
+Description of rules:
+
+There is only one rule, which matches all uevents.  It uses Udev's RUN key to
+specify a socket to send each uevent to.  Normally RUN is used to start up a
+process, but if the pathname starts with "socket:", Udev instead interprets
+the rest of the name as a Unix-domain socket to send the uevent to.  In this
+case, we send send the uevent to the socket named /org/kernel/udev/monitor,
+which is created by the udevmonitor program.  Udevmonitor is used to watch
+uevents as they come to Udev.  Its only purpose is for debugging, but sending
+the uevent to a socket that doesn't exist is a very cheap operation, so we
+enable this rule for all uevents.
+

+ 6 - 0
udev-config/doc/README

@@ -0,0 +1,6 @@
+This directory contains documentation for each rule file used in LFS.
+
+Each .rules file should contain a corresponding .txt file in this directory,
+which explains both the overall purpose of the rules file, and each type of
+rule contained therein.
+