diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100644 index 0000000000..9a7fcde627 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,26 @@ +#!/bin/sh + + +get_magic_word() { + dd if=$1 bs=4 count=1 2>/dev/null | od -A n -N 4 -t x1 | tr -d ' ' +} + +get_fs_type() { + local magic_word="$(get_magic_word "$1")" + + case "$magic_word" in + "3118"*) + echo "ubifs" + ;; + "68737173") + echo "squashfs" + ;; + *) + echo "unknown" + ;; + esac +} + +round_up() { + echo "$(((($1 + ($2 - 1))/ $2) * $2))" +} diff --git a/scripts/sysupgrade-tar.sh b/scripts/sysupgrade-tar.sh index d1d627a96e..b93b2584bb 100755 --- a/scripts/sysupgrade-tar.sh +++ b/scripts/sysupgrade-tar.sh @@ -1,5 +1,7 @@ #!/bin/sh +. $TOPDIR/scripts/functions.sh + board="" kernel="" rootfs="" @@ -53,7 +55,16 @@ fi mkdir -p "${tmpdir}/sysupgrade-${board}" echo "BOARD=${board}" > "${tmpdir}/sysupgrade-${board}/CONTROL" -[ -z "${rootfs}" ] || cp "${rootfs}" "${tmpdir}/sysupgrade-${board}/root" +if [ -n "${rootfs}" ]; then + case "$( get_fs_type ${rootfs} )" in + "squashfs") + dd if="${rootfs}" of="${tmpdir}/sysupgrade-${board}/root" bs=1024 conv=sync + ;; + *) + cp "${rootfs}" "${tmpdir}/sysupgrade-${board}/root" + ;; + esac +fi [ -z "${kernel}" ] || cp "${kernel}" "${tmpdir}/sysupgrade-${board}/kernel" mtime="" diff --git a/scripts/ubinize-image.sh b/scripts/ubinize-image.sh index a18d6dc428..d82d81432d 100755 --- a/scripts/ubinize-image.sh +++ b/scripts/ubinize-image.sh @@ -1,5 +1,7 @@ #!/bin/sh +. $TOPDIR/scripts/functions.sh + part="" ubootenv="" ubinize_param="" @@ -8,16 +10,6 @@ rootfs="" outfile="" err="" -get_magic_word() { - dd if=$1 bs=2 count=1 2>/dev/null | od -A n -N 2 -t x1 | tr -d ' ' -} - -is_ubifs() { - if [ "$( get_magic_word $1 )" = "3118" ]; then - echo "1" - fi -} - ubivol() { volid=$1 name=$2 @@ -31,7 +23,7 @@ ubivol() { echo "vol_name=$name" if [ "$image" ]; then echo "image=$image" - [ -n "$size" ] && echo "vol_size=${size}MiB" + [ -n "$size" ] && echo "vol_size=${size}" else echo "vol_size=1MiB" fi @@ -42,7 +34,10 @@ ubivol() { ubilayout() { local vol_id=0 - local root_is_ubifs="$( is_ubifs "$2" )" + local rootsize= + local autoresize= + local rootfs_type="$( get_fs_type "$2" )" + if [ "$1" = "ubootenv" ]; then ubivol $vol_id ubootenv vol_id=$(( $vol_id + 1 )) @@ -62,16 +57,28 @@ ubilayout() { size="$part" - ubivol $vol_id "$name" "$image" "" "$size" + ubivol $vol_id "$name" "$image" "" "${size}MiB" vol_id=$(( $vol_id + 1 )) done if [ "$3" ]; then ubivol $vol_id kernel "$3" vol_id=$(( $vol_id + 1 )) fi - ubivol $vol_id rootfs "$2" $root_is_ubifs + + 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 )) - [ "$root_is_ubifs" ] || ubivol $vol_id rootfs_data "" 1 + [ "$rootfs_type" = "ubifs" ] || ubivol $vol_id rootfs_data "" 1 } while [ "$1" ]; do