openwrt/scripts/ubinize-image.sh
Daniel Golle da13ff30ef scripts: ubinize-image.sh: fix support for static volume
Apart from being misspelled ('dymamic' vs. 'dynamic') and a mismatch of
the number of parameters, there is also simply no need to add the 'dynamic'
volume type keyword as 6th parameter as that's the default anyway.
Fix and simplify the ubinize-image.sh script to work as intended.

Fixes: 6c17d71973 ("scripts: ubinize-image.sh: support static volumes, make size optional")
Reported-by: Hannu Nyman <hannu.nyman@iki.fi>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2024-04-24 02:32:22 +01:00

171 lines
3.0 KiB
Bash
Executable File

#!/bin/sh
. $TOPDIR/scripts/functions.sh
part=""
ubootenv=""
ubinize_param=""
kernel=""
rootfs=""
outfile=""
err=""
ubinize_seq=""
ubivol() {
local volid="$1"
local name="$2"
local image="$3"
local autoresize="$4"
local size="$5"
local voltype="${6:-dynamic}"
echo "[$name]"
echo "mode=ubi"
echo "vol_id=$volid"
echo "vol_type=$voltype"
echo "vol_name=$name"
if [ "$image" ]; then
echo "image=$image"
[ -n "$size" ] && echo "vol_size=${size}"
else
echo "vol_size=1MiB"
fi
if [ "$autoresize" ]; then
echo "vol_flags=autoresize"
fi
}
ubilayout() {
local vol_id=0
local rootsize
local autoresize
local rootfs_type
local voltype
rootfs_type="$( get_fs_type "$2" )"
if [ "$1" = "ubootenv" ]; then
ubivol $vol_id ubootenv
vol_id=$(( vol_id + 1 ))
ubivol $vol_id ubootenv2
vol_id=$(( vol_id + 1 ))
fi
for part in $parts; do
name="${part%%=*}"
prev="$part"
part="${part#*=}"
voltype=dynamic
[ "$prev" = "$part" ] && part=
image="${part%%=*}"
if [ "${image#:}" != "$image" ]; then
voltype=static
image="${image#:}"
fi
prev="$part"
part="${part#*=}"
[ "$prev" = "$part" ] && part=
size="$part"
if [ -z "$size" ]; then
size="$( round_up "$( stat -c%s "$image" )" 1024 )"
else
size="${size}MiB"
fi
ubivol $vol_id "$name" "$image" "" "${size}" "$voltype"
vol_id=$(( vol_id + 1 ))
done
if [ "$3" ]; then
ubivol $vol_id kernel "$3"
vol_id=$(( vol_id + 1 ))
fi
if [ "$2" ]; then
case "$rootfs_type" in
"ubifs")
autoresize=1
;;
"squashfs")
# squashfs uses 1k block size, ensure we do not
# violate that
rootsize="$( round_up "$( stat -c%s "$2" )" 1024 )"
;;
esac
ubivol $vol_id rootfs "$2" "$autoresize" "$rootsize"
vol_id=$(( vol_id + 1 ))
[ "$rootfs_type" = "ubifs" ] || ubivol $vol_id rootfs_data "" 1
fi
}
set_ubinize_seq() {
if [ -n "$SOURCE_DATE_EPOCH" ] ; then
ubinize_seq="-Q $SOURCE_DATE_EPOCH"
fi
}
while [ "$1" ]; do
case "$1" in
"--uboot-env")
ubootenv="ubootenv"
shift
continue
;;
"--kernel")
kernel="$2"
shift
shift
continue
;;
"--rootfs")
rootfs="$2"
shift
shift
continue
;;
"--part")
parts="$parts $2"
shift
shift
continue
;;
"-"*)
ubinize_param="$*"
break
;;
*)
if [ ! "$outfile" ]; then
outfile=$1
shift
continue
fi
;;
esac
done
if [ ! -r "$rootfs" ] && [ ! -r "$kernel" ] && [ ! "$parts" ] && [ ! "$outfile" ]; then
echo "syntax: $0 [--uboot-env] [--part <name>=<file>] [--kernel kernelimage] [--rootfs rootfsimage] out [ubinize opts]"
exit 1
fi
ubinize="$( command -v ubinize )"
if [ ! -x "$ubinize" ]; then
echo "ubinize tool not found or not usable"
exit 1
fi
ubinizecfg="$( mktemp 2> /dev/null )"
if [ -z "$ubinizecfg" ]; then
# try OSX signature
ubinizecfg="$( mktemp -t 'ubitmp' )"
fi
ubilayout "$ubootenv" "$rootfs" "$kernel" > "$ubinizecfg"
set_ubinize_seq
cat "$ubinizecfg"
ubinize $ubinize_seq -o "$outfile" $ubinize_param "$ubinizecfg"
err="$?"
[ ! -e "$outfile" ] && err=2
rm "$ubinizecfg"
exit $err