[package] base/block-extroot, base/block-mount: Modified preinit and block-extroot and
authorDaniel Dickinson <crazycshore@gmail.com>
Thu, 23 Sep 2010 13:58:05 +0000 (13:58 +0000)
committerDaniel Dickinson <crazycshore@gmail.com>
Thu, 23 Sep 2010 13:58:05 +0000 (13:58 +0000)
block-mount so that use of block-mount and block-extroot do not require that block-extroot,
block-mount, nor the kernel modules they depend, on are required to included in the image.
That is block-extroot and dependencies may now be installed as modules onto the jffs2 part of
a squashfs system and it will work.
In addition packages which are installed into the jffs2 of a squashfs system may now affect
preinit, so long as they do not require execution of commands that occur before the merging of
the jffs2 and built-in (squashfs) preinit scripts is done.

Thanks jow for the preinit merge stuff!

SVN-Revision: 23110

package/base-files/files/etc/functions.sh
package/base-files/files/etc/preinit
package/base-files/files/lib/functions/boot.sh
package/block-extroot/files/50_determine_usb_root
package/block-extroot/files/extmount.sh
package/block-mount/files/fsck.sh
package/block-mount/files/mount.sh

index c5df499..acea617 100755 (executable)
@@ -292,4 +292,25 @@ service_kill() {
        done
 }
 
+
+pi_include() {
+       if [ -f "/tmp/overlay/$1" ]; then
+               . "/tmp/overlay/$1"
+       elif [ -f "$1" ]; then
+               . "$1"
+       elif [ -d "/tmp/overlay/$1" ]; then
+               for src_script in /tmp/overlay/$1/*.sh; do
+                       . "$src_script"
+               done
+       elif [ -d "$1" ]; then
+               for src_script in $1/*.sh; do
+                       . "$src_script"
+               done
+       else
+               echo "WARNING: $1 not found"
+               return 1
+       fi
+       return 0
+}
+
 [ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh
index 56c02e4..9e629ab 100755 (executable)
@@ -5,12 +5,6 @@
 export PATH=/bin:/sbin:/usr/bin:/usr/sbin
 . /etc/diag.sh
 
-preinit_essential_hook=
-preinit_main_hook=
-failsafe_hook=
-initramfs_hook=
-preinit_mount_root_hook=
-
 pi_ifname=
 pi_ip=192.168.1.1
 pi_broadcast=192.168.1.255
@@ -28,8 +22,14 @@ pi_init_suppress_stderr="y"
 pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin"
 pi_init_cmd="/sbin/init"
 
+. /etc/functions.sh
 . /lib/functions/boot.sh
 
+boot_hook_init preinit_essential
+boot_hook_init preinit_main
+boot_hook_init failsafe
+boot_hook_init initramfs
+boot_hook_init preinit_mount_root
 
 for pi_source_file in /lib/preinit/*; do
     . $pi_source_file
index 91ab930..fc93eba 100644 (file)
@@ -6,19 +6,66 @@ mount() {
        /bin/busybox mount "$@"
 }
 
+boot_hook_splice_start() {
+       export -n PI_HOOK_SPLICE=1
+}
+
+boot_hook_splice_finish() {
+       local hook
+       for hook in $PI_STACK_LIST; do
+               local v; eval "v=\${${hook}_splice:+\$${hook}_splice }$hook"
+               export -n "${hook}=${v% }"
+               export -n "${hook}_splice="
+       done
+       export -n PI_HOOK_SPLICE=
+}
+
+boot_hook_init() {
+       local hook="${1}_hook"
+       export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
+       export -n "$hook="
+}
+
 boot_hook_add() {
-       local hook="${1}_hook"
-       local value="$2"
-       local sep=" "
-       
-       eval "$hook=\"\${$hook:+\${$hook}\${value:+\$sep}}\$value\""
+       local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
+       local func="${2}"
+
+       [ -n "$func" ] && {
+               local v; eval "v=\$$hook"
+               export -n "$hook=${v:+$v }$func"
+       }
+}
+
+boot_hook_shift() {
+       local hook="${1}_hook"
+       local rvar="${2}"
+
+       local v; eval "v=\$$hook"
+       [ -n "$v" ] && {
+               local first="${v%% *}"
+
+               [ "$v" != "${v#* }" ] && \
+                       export -n "$hook=${v#* }" || \
+                       export -n "$hook="
+
+               export -n "$rvar=$first"
+               return 0
+       }
+
+       return 1
 }
 
 boot_run_hook() {
-    local boot_func
-    for boot_func in $(eval "echo \"\$${1}_hook\""); do
-       $boot_func "$1" "$2"
-    done
+       local hook="$1"
+       local func
+
+       while boot_hook_shift "$hook" func; do
+               local ran; eval "ran=\$PI_RAN_$func"
+               [ -n "$ran" ] || {
+                       export -n "PI_RAN_$func=1"
+                       $func "$1" "$2"
+               }
+       done
 }
 
 find_mtd_part() {
@@ -99,15 +146,3 @@ ramoverlay() {
        fopivot /tmp/root /rom 1
 }
 
-pi_include() {
-       if [ -f "/tmp/overlay/$1" ]; then
-               . "/tmp/overlay/$1"
-       elif [ -f "$1" ]; then
-               . "$1"
-       else
-               echo "WARNING: $1 not found"
-               return 1
-       fi
-       return 0
-}
-
index 98ec001..b899203 100644 (file)
@@ -5,9 +5,8 @@
 
 
 determine_external_root() {
-       . /etc/functions.sh
-       . /lib/functions/extmount.sh
-       . /lib/functions/mount.sh
+       pi_include /lib/functions/extmount.sh
+       pi_include /lib/functions/mount.sh
 
        local OLD_UCI_CONFIG_DIR="$UCI_CONFIG_DIR"
        set_jffs_mp
index dfd6eef..f696324 100644 (file)
@@ -13,12 +13,14 @@ set_jffs_mp() {
 }
 
 er_load_modules() {
-       [ -d $ER_ROOT/etc/modules.d ] && {
-           cd $ER_ROOT/etc/modules.d && {
-               local modules="$(grep -l '# May be required for rootfs' *)"
-               cat $modules | sed 's/^\([^#]\)/insmod \1/' | sh 2>&- || : 
-           }
+       mkdir -p /tmp/extroot_modules/modules.d
+       mkdir -p /tmp/extroot_modules/modules
+       ln -sf /etc/modules.d/* /tmp/overlay/etc/modules.d/* /tmp/extroot_modules/modules.d
+       ln -sf /lib/modules/*/* /tmp/overlay/lib/modules/*/* /tmp/extroot_modules/modules
+       local modules="$(grep -l '# May be required for rootfs' /tmp/extroot_modules/modules.d/*)"
+       cd /tmp/extroot_modules/modules && {
+               cat $modules | sed -e 's/^\([^#].*\)/insmod \.\/\1.ko/'| sh 2>&- || :
        }
+       rm -rf /tmp/extroot_modules
 }
 
-
index 2b64025..3011160 100644 (file)
@@ -30,5 +30,5 @@ libmount_fsck() {
 
 libmount_known_fsck=""
 
-include /lib/functions/fsck
+pi_include /lib/functions/fsck
 
index db0fbad..583e1a5 100644 (file)
@@ -5,8 +5,8 @@
 #
 
 
-. /lib/functions/block.sh
-. /lib/functions/fsck.sh
+pi_include /lib/functions/block.sh
+pi_include /lib/functions/fsck.sh
 
 config_mount_by_section() {
        local cfg="$1"