From 848953efdfd9623fbc65a4cd11ab51ea46c3cdc0 Mon Sep 17 00:00:00 2001
From: cshore <cshore@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Thu, 23 Sep 2010 13:58:05 +0000
Subject: [package] base/block-extroot, base/block-mount:  Modified preinit and
 block-extroot and 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!



git-svn-id: svn://svn.openwrt.org/openwrt/trunk@23110 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/base-files/files/etc/functions.sh         | 21 +++++++
 package/base-files/files/etc/preinit              | 12 ++--
 package/base-files/files/lib/functions/boot.sh    | 77 ++++++++++++++++-------
 package/block-extroot/files/50_determine_usb_root |  5 +-
 package/block-extroot/files/extmount.sh           | 14 +++--
 package/block-mount/files/fsck.sh                 |  2 +-
 package/block-mount/files/mount.sh                |  4 +-
 7 files changed, 96 insertions(+), 39 deletions(-)

diff --git a/package/base-files/files/etc/functions.sh b/package/base-files/files/etc/functions.sh
index c5df49970..acea61753 100755
--- a/package/base-files/files/etc/functions.sh
+++ b/package/base-files/files/etc/functions.sh
@@ -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
diff --git a/package/base-files/files/etc/preinit b/package/base-files/files/etc/preinit
index 56c02e467..9e629ab81 100755
--- a/package/base-files/files/etc/preinit
+++ b/package/base-files/files/etc/preinit
@@ -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
diff --git a/package/base-files/files/lib/functions/boot.sh b/package/base-files/files/lib/functions/boot.sh
index 91ab9306e..fc93eba49 100644
--- a/package/base-files/files/lib/functions/boot.sh
+++ b/package/base-files/files/lib/functions/boot.sh
@@ -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
-}
-
diff --git a/package/block-extroot/files/50_determine_usb_root b/package/block-extroot/files/50_determine_usb_root
index 98ec0016e..b899203e5 100644
--- a/package/block-extroot/files/50_determine_usb_root
+++ b/package/block-extroot/files/50_determine_usb_root
@@ -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
diff --git a/package/block-extroot/files/extmount.sh b/package/block-extroot/files/extmount.sh
index dfd6eef07..f696324f7 100644
--- a/package/block-extroot/files/extmount.sh
+++ b/package/block-extroot/files/extmount.sh
@@ -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
 }
 
-
diff --git a/package/block-mount/files/fsck.sh b/package/block-mount/files/fsck.sh
index 2b6402563..3011160a4 100644
--- a/package/block-mount/files/fsck.sh
+++ b/package/block-mount/files/fsck.sh
@@ -30,5 +30,5 @@ libmount_fsck() {
 
 libmount_known_fsck=""
 
-include /lib/functions/fsck
+pi_include /lib/functions/fsck
 
diff --git a/package/block-mount/files/mount.sh b/package/block-mount/files/mount.sh
index db0fbad1a..583e1a5ca 100644
--- a/package/block-mount/files/mount.sh
+++ b/package/block-mount/files/mount.sh
@@ -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"
-- 
cgit v1.2.3