#! /bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
if [ -t 0 ] || [ -t 1 ]; then
	printf "I'm a filter, give me a firmware image file on STDIN and I'll put out an in-memory image on STDOUT.\n" 1>&2
	exit 2
fi
tmp=${TMP:-/tmp}
tmpdir=$tmp/$(date +%s)_$$
mkdir -p $tmpdir
trap "rm -r $tmpdir" EXIT HUP INT
cat - >$tmpdir/image.tar
kernelline=$(tar -t -v -f $tmpdir/image.tar | grep 'kernel\.image')
filesystemline=$(tar -t -v -f $tmpdir/image.tar | grep 'filesystem\.image')
if [ ${#kernelline} -eq 0 ]; then
	printf "kernel.image not found\n" 1>&2
	exit 1
fi
if [ ${#filesystemline} -eq 0 ]; then
	printf "filesystem.image not found\n" 1>&2
	exit 1
fi
set -- $kernelline
kernel=$6
kernelsize=$3
set -- $filesystemline
filesystem=$6
filesyssize=$3
tar -x -O -f $tmpdir/image.tar $kernel >$tmpdir/kernel 2>/dev/null
tar -x -O -f $tmpdir/image.tar $filesystem >$tmpdir/fs 2>/dev/null
krnlsize=$(stat -c %s $tmpdir/kernel 2>/dev/null || printf "0")
fssize=$(stat -c %s $tmpdir/fs 2>/dev/null || printf "0")
if [ $krnlsize -ne $kernelsize ]; then
	printf "error extracting kernel.image\n" 1>&2
	exit 1
fi
if [ $fssize -ne $filesyssize ]; then
	printf "error extracting filesystem.image\n" 1>&2
	exit 1
fi
chk=$(dd if=$tmpdir/kernel bs=4 count=1 skip=$(( krnlsize / 4 - 2 )) 2>/dev/null| base64)
if [ ${#chk} -eq 0 ]; then
	printf "error detecting checksum on kernel.image\n" 1>&2
	exit 1
fi
[ "$chk" = "I95TxA==" ] && kernelcs=1 || kernelcs=0
chk=$(dd if=$tmpdir/fs bs=4 count=1 skip=$(( fssize / 4 - 2 )) 2>/dev/null | base64)
if [ ${#chk} -eq 0 ]; then
	printf "error detecting checksum on filesystem.image\n" 1>&2
	exit 1
fi
[ "$chk" = "I95TxA==" ] && filesyscs=1 || filesyscs=0
[ $kernelcs -eq 1 ] && dd if=$tmpdir/kernel bs=$(( krnlsize - 8 )) count=1 2>/dev/null || cat $tmpdir/kernel
[ $filesyscs -eq 1 ] && dd if=$tmpdir/fs bs=$(( fssize - 8 )) count=1 2>/dev/null || cat $tmpdir/fs
exit 0
