From 8128ab0f591e76e00ff68deaae8fcce4f948b59e Mon Sep 17 00:00:00 2001 From: cshore Date: Thu, 23 Sep 2010 16:34:56 +0000 Subject: [PATCH] [base system & package/block-extroot] Merged 23110-23112 which allows block-extroot to be loaded as a module rather than being required to be in the image. Thanks JoW for pushing and helping with this. git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@23113 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/base-files/files/etc/functions.sh | 21 ++++++ package/base-files/files/etc/preinit | 12 ++-- .../base-files/files/lib/functions/boot.sh | 66 ++++++++++++++++--- .../files/lib/preinit/41_merge_overlay_hooks | 24 +++++++ .../block-extroot/files/50_determine_usb_root | 7 +- package/block-extroot/files/extmount.sh | 14 ++-- package/block-mount/files/fsck.sh | 2 +- package/block-mount/files/mount.sh | 4 +- 8 files changed, 122 insertions(+), 28 deletions(-) create mode 100644 package/base-files/files/lib/preinit/41_merge_overlay_hooks diff --git a/package/base-files/files/etc/functions.sh b/package/base-files/files/etc/functions.sh index d58f92ce0..134b520f0 100755 --- a/package/base-files/files/etc/functions.sh +++ b/package/base-files/files/etc/functions.sh @@ -291,4 +291,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 f93eec99a..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() { @@ -98,3 +145,4 @@ ramoverlay() { mount -t tmpfs root /tmp/root fopivot /tmp/root /rom 1 } + diff --git a/package/base-files/files/lib/preinit/41_merge_overlay_hooks b/package/base-files/files/lib/preinit/41_merge_overlay_hooks new file mode 100644 index 000000000..d0a3c1810 --- /dev/null +++ b/package/base-files/files/lib/preinit/41_merge_overlay_hooks @@ -0,0 +1,24 @@ +#!/bin/sh +# Copyright (C) 2010 OpenWrt.org + +merge_overlay_hooks() { + jffs2_not_mounted || [ ! -d /tmp/overlay/lib/preinit ] || { + echo "- merge overlay components -" + + mkdir -p /tmp/preinit-hook-merge + ln -sf /lib/preinit/* /tmp/overlay/lib/preinit/* /tmp/preinit-hook-merge/ + + boot_hook_splice_start + + local pipart + for pipart in /tmp/preinit-hook-merge/*; do + . $pipart + done + + boot_hook_splice_finish + + rm -rf /tmp/preinit-hook-merge + } +} + +boot_hook_add preinit_mount_root merge_overlay_hooks diff --git a/package/block-extroot/files/50_determine_usb_root b/package/block-extroot/files/50_determine_usb_root index 0de9be384..b899203e5 100644 --- a/package/block-extroot/files/50_determine_usb_root +++ b/package/block-extroot/files/50_determine_usb_root @@ -4,11 +4,10 @@ # See /LICENSE for more information. -. /etc/functions.sh -. /lib/functions/extmount.sh -. /lib/functions/mount.sh - determine_external_root() { + pi_include /lib/functions/extmount.sh + pi_include /lib/functions/mount.sh + local OLD_UCI_CONFIG_DIR="$UCI_CONFIG_DIR" set_jffs_mp determine_root_device 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 d80e71693..056229a4d 100644 --- a/package/block-mount/files/fsck.sh +++ b/package/block-mount/files/fsck.sh @@ -32,5 +32,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 1616ca7a1..96307222f 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"