diff options
| -rwxr-xr-x | package/base-files/files/etc/functions.sh | 21 | ||||
| -rwxr-xr-x | package/base-files/files/etc/preinit | 12 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/boot.sh | 77 | ||||
| -rw-r--r-- | package/block-extroot/files/50_determine_usb_root | 5 | ||||
| -rw-r--r-- | package/block-extroot/files/extmount.sh | 14 | ||||
| -rw-r--r-- | package/block-mount/files/fsck.sh | 2 | ||||
| -rw-r--r-- | 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" | 
