# 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 }