| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- # SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause
- FS_STATE_READY=2
- # $(1): file to read from
- # $(2): offset in bytes
- get_hex_u32_le() {
- dd if="$1" skip=$2 bs=1 count=4 2>/dev/null | hexdump -v -e '1/4 "%02x"'
- }
- # Setup /tmp/env.config to provide "metadata" UBI volume access
- #
- # It can be used with "fw_printenv -c /tmp/env.config"
- bcm4908_pkgtb_setup_env_config() {
- local size=$((0x$(get_hex_u32_le /dev/ubi0_1 4)))
- dd if=/dev/ubi0_1 of=/tmp/env.head count=8 iflag=count_bytes
- dd if=/dev/ubi0_1 of=/tmp/env.body skip=8 iflag=skip_bytes
- printf "%s\t0x%x\t0x%x\t0x%x" "/tmp/env.body" 0x0 $size $size > /tmp/env.config
- }
- bcm4908_committed_image_seq() {
- bcm4908_pkgtb_setup_env_config
- commited="$(fw_printenv -n -c /tmp/env.config COMMITTED)"
- [ -n "$commited" ] && {
- seq=$(fw_printenv -n -c /tmp/env.config SEQ | cut -d ',' -f $commited)
- [ -n "$seq" ] && {
- echo $seq
- return
- }
- }
- echo "Failed to read COMMITED and SEQ from metadata1" >&2
- }
- # Make sure "rootfs_data" UBI volume matches currently flashed image
- #
- # On mismatch "rootfs_data" will be wiped and assigned
- #
- # $1: UBI volume of "rootfs_data" (e.g. ubi0_123)
- bcm4908_verify_rootfs_data() {
- local ubivol="$1"
- local dir=/tmp/rootfs_data
- local seq="$(bcm4908_committed_image_seq)"
- [ -z "$seq" ] && return
- mkdir $dir
- if ! mount -t ubifs /dev/$ubivol $dir; then
- echo "Failed to mount $ubivol UBI volume" >&2
- rmdir $dir
- return
- fi
- # Wipe rootfs_data if it doesn't belong to us
- [ "$(readlink $dir/.openwrt-image-seq)" != "$seq" ] && {
- echo "Removing \"rootfs_data\" content"
- rm -rf $dir/..?* $dir/.[!.]* $dir/*
- }
- # If rootfs_data is clean (or was just wiped) claim it
- [ -z "$(ls -A $dir)" ] && {
- echo "Assigning \"rootfs_data\" to the current firmware"
- # Claim this "rootfs_data"
- ln -s $seq $dir/.openwrt-image-seq
- # Mark it ready to avoid "mount_root" wiping it again
- ln -s $FS_STATE_READY $dir/.fs_state
- }
- umount $dir
- rmdir $dir
- }
|